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");
});
});