/
githubmirror
/
github-readme-stats
Обзор
Документация
Войти
/
githubmirror
/
github-readme-stats
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
tests/pin.test.js
243 строки
6 KB
Alexandr Garbuzov
refactor: move svg rendering related code into separate module (#4588)
16 окт 2025, 23:44
Не верифицирован
16 окт 2025, 23:44
c43fd65
Код
Авторство
О чём код?
// @ts-check import { afterEach, describe, expect, it, jest } from "@jest/globals"; import "@testing-library/jest-dom"; import axios from "axios"; import MockAdapter from "axios-mock-adapter"; import pin from "../api/pin.js"; import { renderRepoCard } from "../src/cards/repo.js"; import { renderError } from "../src/common/render.js"; import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; const data_repo = { repository: { username: "anuraghazra", 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, isTemplate: false, }, }; 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).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.send).toHaveBeenCalledWith( // @ts-ignore renderRepoCard({ ...data_repo.repository, starCount: data_repo.repository.stargazers.totalCount, }), ); }); 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", full_name: "1", }, }; 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).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.send).toHaveBeenCalledWith( renderRepoCard( // @ts-ignore { ...data_repo.repository, starCount: data_repo.repository.stargazers.totalCount, }, { ...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).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.send).toHaveBeenCalledWith( renderError({ message: "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).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.send).toHaveBeenCalledWith( renderError({ message: "Organization Repository Not found" }), ); }); it("should render error card if username in blacklist", async () => { const req = { query: { username: "renovate-bot", 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).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.send).toHaveBeenCalledWith( renderError({ message: "This username is blacklisted", secondaryMessage: "Please deploy your own instance", renderOptions: { show_repo_link: false }, }), ); }); it("should render error card if wrong locale provided", async () => { const req = { query: { username: "anuraghazra", repo: "convoychat", locale: "asdf", }, }; 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).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.send).toHaveBeenCalledWith( renderError({ message: "Something went wrong", secondaryMessage: "Language not found", }), ); }); it("should render error card if missing required parameters", async () => { const req = { query: {}, }; const res = { setHeader: jest.fn(), send: jest.fn(), }; await pin(req, res); expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.send).toHaveBeenCalledWith( renderError({ message: 'Missing params "username", "repo" make sure you pass the parameters in URL', secondaryMessage: "/api/pin?username=USERNAME&repo=REPO_NAME", renderOptions: { show_repo_link: false }, }), ); }); it("should have proper cache", 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).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.setHeader).toHaveBeenCalledWith( "Cache-Control", `max-age=${CACHE_TTL.PIN_CARD.DEFAULT}, ` + `s-maxage=${CACHE_TTL.PIN_CARD.DEFAULT}, ` + `stale-while-revalidate=${DURATIONS.ONE_DAY}`, ); }); });