OpenPanel/cypress/support/commands/intercepts/hasura.ts
2024-02-05 10:23:04 +01:00

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,
},
});
}
}
},
);
});