Back to Repositories

Testing WakaTime Stats Card Generation in github-readme-stats

This test suite validates the WakaTime API integration and card rendering functionality in the github-readme-stats repository. It ensures proper handling of WakaTime coding statistics and generation of SVG visualization cards.

Test Coverage Overview

The test suite provides comprehensive coverage of the WakaTime API endpoint and card rendering functionality.

Key areas tested include:
  • API request handling and response processing
  • Header content-type validation
  • Data transformation for SVG card generation
  • Mock WakaTime API response handling
Edge cases covered include proper data structure validation and mock adapter implementation.

Implementation Analysis

The testing approach utilizes Jest’s mocking capabilities with axios-mock-adapter to simulate WakaTime API responses. The implementation follows a request-response pattern, validating both the API interaction and SVG card rendering process.

Framework-specific features utilized include:
  • Jest’s describe/it blocks for test organization
  • Mock function assertions
  • Async/await test handling
  • Axios request interception

Technical Details

Testing tools and setup:
  • Jest test framework
  • axios-mock-adapter for API mocking
  • @testing-library/jest-dom for DOM assertions
  • Mock WakaTime response data structure
  • Axios for HTTP requests
Configuration includes afterEach hooks for mock reset and proper test isolation.

Best Practices Demonstrated

The test suite exemplifies several testing best practices for API integration testing.

Notable practices include:
  • Proper test isolation with mock resets
  • Comprehensive mock data structures
  • Clear test case organization
  • Explicit assertion checking
  • Efficient mock adapter usage

anuraghazra/github-readme-stats

tests/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, {}));
  });
});