• fetchGist.test.js
  • import "@testing-library/jest-dom";
    import axios from "axios";
    import MockAdapter from "axios-mock-adapter";
    import { expect, it, describe, afterEach } from "@jest/globals";
    import { fetchGist } from "../src/fetchers/gist-fetcher.js";
    
    const gist_data = {
      data: {
        viewer: {
          gist: {
            description:
              "List of countries and territories in English and Spanish: name, continent, capital, dial code, country codes, TLD, and area in sq km. Lista de países y territorios en Inglés y Español: nombre, continente, capital, código de teléfono, códigos de país, dominio y área en km cuadrados. Updated 2023",
            owner: {
              login: "Yizack",
            },
            stargazerCount: 33,
            forks: {
              totalCount: 11,
            },
            files: [
              {
                name: "countries.json",
                language: {
                  name: "JSON",
                },
                size: 85858,
              },
              {
                name: "territories.txt",
                language: {
                  name: "Text",
                },
                size: 87858,
              },
              {
                name: "countries_spanish.json",
                language: {
                  name: "JSON",
                },
                size: 85858,
              },
              {
                name: "territories_spanish.txt",
                language: {
                  name: "Text",
                },
                size: 87858,
              },
            ],
          },
        },
      },
    };
    
    const gist_not_found_data = {
      data: {
        viewer: {
          gist: null,
        },
      },
    };
    
    const gist_errors_data = {
      errors: [
        {
          message: "Some test GraphQL error",
        },
      ],
    };
    
    const mock = new MockAdapter(axios);
    
    afterEach(() => {
      mock.reset();
    });
    
    describe("Test fetchGist", () => {
      it("should fetch gist correctly", async () => {
        mock.onPost("https://api.github.com/graphql").reply(200, gist_data);
    
        let gist = await fetchGist("bbfce31e0217a3689c8d961a356cb10d");
    
        expect(gist).toStrictEqual({
          name: "countries.json",
          nameWithOwner: "Yizack/countries.json",
          description:
            "List of countries and territories in English and Spanish: name, continent, capital, dial code, country codes, TLD, and area in sq km. Lista de países y territorios en Inglés y Español: nombre, continente, capital, código de teléfono, códigos de país, dominio y área en km cuadrados. Updated 2023",
          language: "Text",
          starsCount: 33,
          forksCount: 11,
        });
      });
    
      it("should throw correct error if gist not found", async () => {
        mock
          .onPost("https://api.github.com/graphql")
          .reply(200, gist_not_found_data);
    
        await expect(fetchGist("bbfce31e0217a3689c8d961a356cb10d")).rejects.toThrow(
          "Gist not found",
        );
      });
    
      it("should throw error if reaponse contains them", async () => {
        mock.onPost("https://api.github.com/graphql").reply(200, gist_errors_data);
    
        await expect(fetchGist("bbfce31e0217a3689c8d961a356cb10d")).rejects.toThrow(
          "Some test GraphQL error",
        );
      });
    
      it("should throw error if id is not provided", async () => {
        await expect(fetchGist()).rejects.toThrow(
          'Missing params "id" make sure you pass the parameters in URL',
        );
      });
    });