/
githubmirror
/
github-readme-stats
Обзор
Документация
Войти
/
githubmirror
/
github-readme-stats
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
tests/top-langs.test.js
247 строк
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 topLangs from "../api/top-langs.js"; import { renderTopLanguages } from "../src/cards/top-languages.js"; import { renderError } from "../src/common/render.js"; import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; const data_langs = { data: { user: { repositories: { nodes: [ { languages: { edges: [{ size: 150, node: { color: "#0f0", name: "HTML" } }], }, }, { languages: { edges: [{ size: 100, node: { color: "#0f0", name: "HTML" } }], }, }, { languages: { edges: [ { size: 100, node: { color: "#0ff", name: "javascript" } }, ], }, }, { languages: { edges: [ { size: 100, node: { color: "#0ff", name: "javascript" } }, ], }, }, ], }, }, }, }; const error = { errors: [ { type: "NOT_FOUND", path: ["user"], locations: [], message: "Could not fetch user", }, ], }; const langs = { HTML: { color: "#0f0", name: "HTML", size: 250, }, javascript: { color: "#0ff", name: "javascript", size: 200, }, }; const mock = new MockAdapter(axios); afterEach(() => { mock.reset(); }); describe("Test /api/top-langs", () => { 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_langs); await topLangs(req, res); expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.send).toHaveBeenCalledWith(renderTopLanguages(langs)); }); it("should work with the query options", async () => { const req = { query: { username: "anuraghazra", hide_title: true, card_width: 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_langs); await topLangs(req, res); expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.send).toHaveBeenCalledWith( renderTopLanguages(langs, { hide_title: true, card_width: 100, title_color: "fff", icon_color: "fff", text_color: "fff", bg_color: "fff", }), ); }); it("should render error card on user data fetch 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 topLangs(req, res); expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.send).toHaveBeenCalledWith( renderError({ message: error.errors[0].message, secondaryMessage: "Make sure the provided username is not an organization", }), ); }); it("should render error card on incorrect layout input", async () => { const req = { query: { username: "anuraghazra", layout: ["pie"], }, }; const res = { setHeader: jest.fn(), send: jest.fn(), }; mock.onPost("https://api.github.com/graphql").reply(200, data_langs); await topLangs(req, res); expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.send).toHaveBeenCalledWith( renderError({ message: "Something went wrong", secondaryMessage: "Incorrect layout input", }), ); }); it("should render error card if username in blacklist", async () => { const req = { query: { username: "renovate-bot", }, }; const res = { setHeader: jest.fn(), send: jest.fn(), }; mock.onPost("https://api.github.com/graphql").reply(200, data_langs); await topLangs(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", locale: "asdf", }, }; const res = { setHeader: jest.fn(), send: jest.fn(), }; mock.onPost("https://api.github.com/graphql").reply(200, data_langs); await topLangs(req, res); expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.send).toHaveBeenCalledWith( renderError({ message: "Something went wrong", secondaryMessage: "Locale not found", }), ); }); it("should have proper cache", async () => { const req = { query: { username: "anuraghazra", }, }; const res = { setHeader: jest.fn(), send: jest.fn(), }; mock.onPost("https://api.github.com/graphql").reply(200, data_langs); await topLangs(req, res); expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); expect(res.setHeader).toHaveBeenCalledWith( "Cache-Control", `max-age=${CACHE_TTL.TOP_LANGS_CARD.DEFAULT}, ` + `s-maxage=${CACHE_TTL.TOP_LANGS_CARD.DEFAULT}, ` + `stale-while-revalidate=${DURATIONS.ONE_DAY}`, ); }); });