diff --git a/tests/api.test.js b/tests/api.test.js new file mode 100644 index 0000000..749bc7b --- /dev/null +++ b/tests/api.test.js @@ -0,0 +1,122 @@ +require("@testing-library/jest-dom"); +const axios = require("axios"); +const MockAdapter = require("axios-mock-adapter"); +const api = require("../api/index"); +const renderStatsCard = require("../src/renderStatsCard"); +const { renderError } = require("../src/utils"); + +const stats = { + name: "Anurag Hazra", + totalStars: 100, + totalCommits: 200, + totalIssues: 300, + totalPRs: 400, + contributedTo: 500, +}; + +const data = { + data: { + user: { + name: stats.name, + repositoriesContributedTo: { totalCount: stats.contributedTo }, + contributionsCollection: { totalCommitContributions: stats.totalCommits }, + pullRequests: { totalCount: stats.totalPRs }, + issues: { totalCount: stats.totalIssues }, + repositories: { + nodes: [{ stargazers: { totalCount: 100 } }], + }, + }, + }, +}; + +const error = { + errors: [ + { + type: "NOT_FOUND", + path: ["user"], + locations: [], + message: "Could not fetch user", + }, + ], +}; + +const mock = new MockAdapter(axios); + +afterEach(() => { + mock.reset(); +}); + +describe("Test /api/", () => { + it("should test the request", async () => { + const req = { + query: { + username: "anuraghazra", + }, + }; + const res = { + setHeader: jest.fn(), + send: jest.fn(), + }; + mock.onPost("https://api.github.com/graphql").reply(200, data); + + await api(req, res); + + expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml"); + expect(res.send).toBeCalledWith(renderStatsCard(stats, { ...req.query })); + }); + + it("should render error card on error", async () => { + const req = { + query: { + username: "anuraghazra", + }, + }; + const res = { + setHeader: jest.fn(), + send: jest.fn(), + }; + mock.onPost("https://api.github.com/graphql").reply(200, error); + + await api(req, res); + + expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml"); + expect(res.send).toBeCalledWith(renderError(error.errors[0].message)); + }); + + it("should get the query options", async () => { + const req = { + query: { + username: "anuraghazra", + hide: `["issues","prs","contribs"]`, + show_icons: true, + hide_border: true, + line_height: 100, + title_color: "fff", + icon_color: "fff", + text_color: "fff", + bg_color: "fff", + }, + }; + const res = { + setHeader: jest.fn(), + send: jest.fn(), + }; + mock.onPost("https://api.github.com/graphql").reply(200, data); + + await api(req, res); + + expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml"); + expect(res.send).toBeCalledWith( + renderStatsCard(stats, { + hide: ["issues", "prs", "contribs"], + show_icons: true, + hide_border: true, + line_height: 100, + title_color: "fff", + icon_color: "fff", + text_color: "fff", + bg_color: "fff", + }) + ); + }); +}); diff --git a/tests/fetchStats.test.js b/tests/fetchStats.test.js index ee8de75..8b8c0c0 100644 --- a/tests/fetchStats.test.js +++ b/tests/fetchStats.test.js @@ -63,4 +63,4 @@ describe("Test fetchStats", () => { "Could not fetch user" ); }); -}); +}); \ No newline at end of file diff --git a/tests/pin.test.js b/tests/pin.test.js new file mode 100644 index 0000000..924cc27 --- /dev/null +++ b/tests/pin.test.js @@ -0,0 +1,123 @@ +require("@testing-library/jest-dom"); +const axios = require("axios"); +const MockAdapter = require("axios-mock-adapter"); +const pin = require("../api/pin"); +const renderRepoCard = require("../src/renderRepoCard"); +const { renderError } = require("../src/utils"); + +const data_repo = { + repository: { + name: "convoychat", + stargazers: { totalCount: 38000 }, + description: "Help us take over the world! React + TS + GraphQL Chat App", + primaryLanguage: { + color: "#2b7489", + id: "MDg6TGFuZ3VhZ2UyODc=", + name: "TypeScript", + }, + forkCount: 100, + }, +}; + +const data_user = { + data: { + user: { repository: data_repo.repository }, + organization: null, + }, +}; + +const mock = new MockAdapter(axios); + +afterEach(() => { + mock.reset(); +}); + +describe("Test /api/pin", () => { + it("should test the request", async () => { + const req = { + query: { + username: "anuraghazra", + repo: "convoychat", + }, + }; + const res = { + setHeader: jest.fn(), + send: jest.fn(), + }; + mock.onPost("https://api.github.com/graphql").reply(200, data_user); + + await pin(req, res); + + expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml"); + expect(res.send).toBeCalledWith(renderRepoCard(data_repo.repository)); + }); + + it("should get the query options", async () => { + const req = { + query: { + username: "anuraghazra", + repo: "convoychat", + title_color: "fff", + icon_color: "fff", + text_color: "fff", + bg_color: "fff", + }, + }; + const res = { + setHeader: jest.fn(), + send: jest.fn(), + }; + mock.onPost("https://api.github.com/graphql").reply(200, data_user); + + await pin(req, res); + + expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml"); + expect(res.send).toBeCalledWith( + renderRepoCard(data_repo.repository, { ...req.query }) + ); + }); + + it("should render error card if user repo not found", async () => { + const req = { + query: { + username: "anuraghazra", + repo: "convoychat", + }, + }; + const res = { + setHeader: jest.fn(), + send: jest.fn(), + }; + mock + .onPost("https://api.github.com/graphql") + .reply(200, { data: { user: { repository: null }, organization: null } }); + + await pin(req, res); + + expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml"); + expect(res.send).toBeCalledWith(renderError("User Repository Not found")); + }); + + it("should render error card if org repo not found", async () => { + const req = { + query: { + username: "anuraghazra", + repo: "convoychat", + }, + }; + const res = { + setHeader: jest.fn(), + send: jest.fn(), + }; + mock + .onPost("https://api.github.com/graphql") + .reply(200, { data: { user: null, organization: { repository: null } } }); + + await pin(req, res); + + expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml"); + expect(res.send).toBeCalledWith( + renderError("Organization Repository Not found") + ); + }); +});