pankod/refine

View on GitHub
cypress/support/commands/intercepts/hasura.ts

Summary

Maintainability
B
5 hrs
Test Coverage
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,
            },
          });
        }
      }
    },
  );
});