151 lines
4.3 KiB
TypeScript
151 lines
4.3 KiB
TypeScript
import { CyHttpMessages } from "cypress/types/net-stubbing";
|
|
import hasuraBlogPosts from "../../../fixtures/hasura-blog-posts.json";
|
|
import hasuraCategories from "../../../fixtures/hasura-categories.json";
|
|
|
|
type Operation = "get" | "getAll" | "create" | "update" | "delete";
|
|
|
|
export const getOperation = (
|
|
req: CyHttpMessages.IncomingHttpRequest,
|
|
): Operation | null => {
|
|
const query = req.body.query as string;
|
|
|
|
if (query.startsWith("query")) {
|
|
if (query.includes("aggregate") || query.includes("$where")) {
|
|
return "getAll";
|
|
}
|
|
|
|
if (query.includes("by_pk")) {
|
|
return "get";
|
|
}
|
|
}
|
|
|
|
if (query.startsWith("mutation")) {
|
|
if (query.includes("delete")) {
|
|
return "delete";
|
|
}
|
|
|
|
if (query.includes("$_set")) {
|
|
return "update";
|
|
}
|
|
|
|
if (query.includes("insert")) {
|
|
return "create";
|
|
}
|
|
}
|
|
|
|
return null;
|
|
};
|
|
|
|
const getResource = (req: CyHttpMessages.IncomingHttpRequest) => {
|
|
const query = req.body.query as string;
|
|
|
|
if (query.includes("blog_posts")) {
|
|
return "BlogPosts";
|
|
}
|
|
|
|
if (query.includes("categories")) {
|
|
return "Categories";
|
|
}
|
|
|
|
return null;
|
|
};
|
|
|
|
Cypress.Commands.add("interceptHasura", () => {
|
|
return cy.intercept(
|
|
{
|
|
method: "POST",
|
|
hostname: "flowing-mammal-24.hasura.app",
|
|
pathname: "/v1/graphql",
|
|
},
|
|
(req) => {
|
|
const body = req.body;
|
|
const operation = getOperation(req);
|
|
const resource = getResource(req);
|
|
const alias = `${operation}${resource}`;
|
|
console.log({ alias, body });
|
|
|
|
if (!operation || !resource) {
|
|
console.log("no operation or resource", {
|
|
operation,
|
|
resource,
|
|
});
|
|
return req.reply(404, {});
|
|
}
|
|
|
|
req.alias = alias;
|
|
|
|
if (resource === "BlogPosts") {
|
|
if (operation === "getAll") {
|
|
return req.reply({
|
|
data: hasuraBlogPosts.data,
|
|
});
|
|
}
|
|
|
|
if (operation === "get") {
|
|
const id = body.variables.id;
|
|
const { category: _category, ...post } =
|
|
hasuraBlogPosts.data.blog_posts.find(
|
|
(post) => post.id === id,
|
|
) as any;
|
|
|
|
if (!post) {
|
|
return req.reply(404, {});
|
|
}
|
|
|
|
return req.reply({
|
|
data: {
|
|
blog_posts_by_pk: post,
|
|
},
|
|
});
|
|
}
|
|
|
|
if (operation === "update") {
|
|
return req.reply({
|
|
data: {
|
|
update_blog_posts_by_pk: body.variables._set,
|
|
},
|
|
});
|
|
}
|
|
|
|
if (operation === "delete") {
|
|
return req.reply({
|
|
data: {
|
|
delete_blog_posts_by_pk: {
|
|
id: body.variables.id,
|
|
},
|
|
},
|
|
});
|
|
}
|
|
}
|
|
|
|
if (resource === "Categories") {
|
|
if (operation === "getAll") {
|
|
return req.reply({
|
|
data: hasuraCategories.data,
|
|
});
|
|
}
|
|
|
|
if (operation === "get") {
|
|
const id = body.variables.id;
|
|
const category = hasuraCategories.data.categories.find(
|
|
(category) => category.id === id,
|
|
);
|
|
|
|
if (!category) {
|
|
console.log("no category found", {
|
|
id,
|
|
category,
|
|
});
|
|
return req.reply(404, {});
|
|
}
|
|
|
|
return req.reply({
|
|
data: {
|
|
categories_by_pk: category,
|
|
},
|
|
});
|
|
}
|
|
}
|
|
},
|
|
);
|
|
});
|