• wakatime.test.js
  • import { jest } from "@jest/globals";
    import "@testing-library/jest-dom";
    import axios from "axios";
    import MockAdapter from "axios-mock-adapter";
    import wakatime from "../api/wakatime.js";
    import { renderWakatimeCard } from "../src/cards/wakatime-card.js";
    import { expect, it, describe, afterEach } from "@jest/globals";
    
    const wakaTimeData = {
      data: {
        categories: [
          {
            digital: "22:40",
            hours: 22,
            minutes: 40,
            name: "Coding",
            percent: 100,
            text: "22 hrs 40 mins",
            total_seconds: 81643.570077,
          },
        ],
        daily_average: 16095,
        daily_average_including_other_language: 16329,
        days_including_holidays: 7,
        days_minus_holidays: 5,
        editors: [
          {
            digital: "22:40",
            hours: 22,
            minutes: 40,
            name: "VS Code",
            percent: 100,
            text: "22 hrs 40 mins",
            total_seconds: 81643.570077,
          },
        ],
        holidays: 2,
        human_readable_daily_average: "4 hrs 28 mins",
        human_readable_daily_average_including_other_language: "4 hrs 32 mins",
        human_readable_total: "22 hrs 21 mins",
        human_readable_total_including_other_language: "22 hrs 40 mins",
        id: "random hash",
        is_already_updating: false,
        is_coding_activity_visible: true,
        is_including_today: false,
        is_other_usage_visible: true,
        is_stuck: false,
        is_up_to_date: true,
        languages: [
          {
            digital: "0:19",
            hours: 0,
            minutes: 19,
            name: "Other",
            percent: 1.43,
            text: "19 mins",
            total_seconds: 1170.434361,
          },
          {
            digital: "0:01",
            hours: 0,
            minutes: 1,
            name: "TypeScript",
            percent: 0.1,
            text: "1 min",
            total_seconds: 83.293809,
          },
          {
            digital: "0:00",
            hours: 0,
            minutes: 0,
            name: "YAML",
            percent: 0.07,
            text: "0 secs",
            total_seconds: 54.975151,
          },
        ],
        operating_systems: [
          {
            digital: "22:40",
            hours: 22,
            minutes: 40,
            name: "Mac",
            percent: 100,
            text: "22 hrs 40 mins",
            total_seconds: 81643.570077,
          },
        ],
        percent_calculated: 100,
        range: "last_7_days",
        status: "ok",
        timeout: 15,
        total_seconds: 80473.135716,
        total_seconds_including_other_language: 81643.570077,
        user_id: "random hash",
        username: "anuraghazra",
        writes_only: false,
      },
    };
    
    const mock = new MockAdapter(axios);
    
    afterEach(() => {
      mock.reset();
    });
    
    describe("Test /api/wakatime", () => {
      it("should test the request", async () => {
        const username = "anuraghazra";
        const req = { query: { username } };
        const res = { setHeader: jest.fn(), send: jest.fn() };
        mock
          .onGet(
            `https://wakatime.com/api/v1/users/${username}/stats?is_including_today=true`,
          )
          .reply(200, wakaTimeData);
    
        await wakatime(req, res);
    
        expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml");
        expect(res.send).toBeCalledWith(renderWakatimeCard(wakaTimeData.data, {}));
      });
    });