import { describe, it, expect } from "vitest"; import { validateGpx, GpxValidationError } from "./gpx-save.server.ts"; const VALID_GPX = ` 500 520 510 `; const ONE_POINT_GPX = ` 500 `; const EMPTY_GPX = ` `; const OUT_OF_RANGE_LAT_GPX = ` `; const OUT_OF_RANGE_LON_GPX = ` `; describe("validateGpx", () => { it("returns parsed GpxData for valid GPX", async () => { const result = await validateGpx(VALID_GPX); expect(result.tracks.flat().length).toBe(3); expect(result.tracks[0]![0]!.lat).toBeCloseTo(47.0); }); it("throws GpxValidationError for GPX with fewer than 2 track points", async () => { await expect(validateGpx(ONE_POINT_GPX)).rejects.toThrow(GpxValidationError); await expect(validateGpx(ONE_POINT_GPX)).rejects.toThrow("at least 2 track points"); }); it("throws GpxValidationError for GPX with zero track points", async () => { await expect(validateGpx(EMPTY_GPX)).rejects.toThrow(GpxValidationError); await expect(validateGpx(EMPTY_GPX)).rejects.toThrow("at least 2 track points"); }); it("throws GpxValidationError for out-of-range latitude", async () => { await expect(validateGpx(OUT_OF_RANGE_LAT_GPX)).rejects.toThrow(GpxValidationError); await expect(validateGpx(OUT_OF_RANGE_LAT_GPX)).rejects.toThrow("out-of-range coordinates"); }); it("throws GpxValidationError for out-of-range longitude", async () => { await expect(validateGpx(OUT_OF_RANGE_LON_GPX)).rejects.toThrow(GpxValidationError); await expect(validateGpx(OUT_OF_RANGE_LON_GPX)).rejects.toThrow("out-of-range coordinates"); }); it("throws GpxValidationError for unparseable XML", async () => { await expect(validateGpx("not xml at all")).rejects.toThrow(GpxValidationError); await expect(validateGpx(" { const err = await validateGpx(EMPTY_GPX).catch((e) => e); expect(err).toBeInstanceOf(GpxValidationError); expect(err.name).toBe("GpxValidationError"); }); });