import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import { EplStandingsAdapter } from "../epl"; const SAMPLE_RESPONSE = { standings: [ { type: "TOTAL", table: [ { position: 1, team: { id: 57, name: "Arsenal FC" }, playedGames: 30, form: "W,W,D,W,L", won: 21, draw: 6, lost: 3, points: 69, goalsFor: 72, goalsAgainst: 25, goalDifference: 47, }, { position: 2, team: { id: 65, name: "Manchester City FC" }, playedGames: 30, form: "W,W,W,D,W", won: 20, draw: 7, lost: 3, points: 67, goalsFor: 70, goalsAgainst: 28, goalDifference: 42, }, ], }, { type: "HOME", table: [] }, ], }; describe("EplStandingsAdapter", () => { beforeEach(() => { vi.stubGlobal("fetch", vi.fn()); }); afterEach(() => { vi.restoreAllMocks(); }); it("maps football-data.org TOTAL standings to FetchedStandingsRecord[]", async () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: true, json: async () => SAMPLE_RESPONSE, } as Response); const records = await new EplStandingsAdapter("test-token").fetchStandings(); expect(records).toHaveLength(2); const arsenal = records[0]; expect(arsenal.teamName).toBe("Arsenal FC"); expect(arsenal.externalTeamId).toBe("57"); expect(arsenal.wins).toBe(21); expect(arsenal.ties).toBe(6); expect(arsenal.losses).toBe(3); expect(arsenal.gamesPlayed).toBe(30); expect(arsenal.tablePoints).toBe(69); expect(arsenal.goalsFor).toBe(72); expect(arsenal.goalsAgainst).toBe(25); expect(arsenal.goalDifference).toBe(47); expect(arsenal.leagueRank).toBe(1); expect(arsenal.lastTen).toBe("W,W,D,W,L"); }); it("sends the football-data.org auth token", async () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: true, json: async () => SAMPLE_RESPONSE, } as Response); await new EplStandingsAdapter("abc123").fetchStandings(); expect(fetch).toHaveBeenCalledWith( "https://api.football-data.org/v4/competitions/PL/standings", { headers: { "X-Auth-Token": "abc123" } } ); }); it("throws when no API key is configured", async () => { await expect(new EplStandingsAdapter("").fetchStandings()).rejects.toThrow(/FOOTBALL_DATA_API_KEY/); }); it("throws on non-ok response", async () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: false, status: 429, statusText: "Too Many Requests", } as Response); await expect(new EplStandingsAdapter("test-token").fetchStandings()).rejects.toThrow("429"); }); });