import { readFileSync } from "node:fs"; import { resolve } from "node:path"; import { describe, it, expect, beforeEach, afterEach, vi } from "vitest"; import { wahooProvider } from "./wahoo"; import { PushError, OAuthError } from "../types.ts"; const fixturePath = resolve(__dirname, "__fixtures__/wahoo-ride.fit"); const fitBuffer = readFileSync(fixturePath); describe("wahooProvider.convertToGpx", () => { it("converts a FIT file to valid GPX with correct coordinates", async () => { const gpx = await wahooProvider.convertToGpx(Buffer.from(fitBuffer)); expect(gpx).not.toBeNull(); expect(gpx).toContain(' { const gpx = await wahooProvider.convertToGpx(Buffer.from(fitBuffer)); expect(gpx).not.toBeNull(); const latMatches = gpx!.matchAll(/lat="([^"]+)"/g); const lonMatches = gpx!.matchAll(/lon="([^"]+)"/g); const lats = [...latMatches].map((m) => parseFloat(m[1]!)); const lons = [...lonMatches].map((m) => parseFloat(m[1]!)); expect(lats.length).toBeGreaterThan(10); expect(lons.length).toBeGreaterThan(10); for (const lat of lats) { expect(lat).toBeGreaterThan(-90); expect(lat).toBeLessThan(90); // Should be real-world coords, not near-zero from double-conversion expect(Math.abs(lat)).toBeGreaterThan(1); } for (const lon of lons) { expect(lon).toBeGreaterThan(-180); expect(lon).toBeLessThan(180); } }); it("includes ISO 8601 timestamps (not Date objects)", async () => { const gpx = await wahooProvider.convertToGpx(Buffer.from(fitBuffer)); expect(gpx).not.toBeNull(); const timeMatches = gpx!.matchAll(/