Files
Live_RC/tests/csv_import.test.js
2026-08-30 16:14:45 +02:00

72 lines
2.9 KiB
JavaScript

import test from "node:test";
import assert from "node:assert/strict";
import { parseCsvRows, importDriversCsv, importCarsCsv } from "../src/csv_import.js";
function makeUid() {
let next = 0;
return (prefix) => `${prefix}_${++next}`;
}
test("CSV parser supports quoted commas, semicolons, tabs, and BOM headers", () => {
assert.deepEqual(parseCsvRows('\uFEFFname,brand\n"Driver, One","Team ""A"""')[0].values, {
name: "Driver, One",
brand: 'Team "A"',
});
assert.equal(parseCsvRows("name;transponder\nDriver One;123")[0].values.transponder, "123");
assert.equal(parseCsvRows("name\ttransponder\nCar One\t456")[0].values.transponder, "456");
});
test("driver CSV import creates classes and merges exported or external rows safely", () => {
const result = importDriversCsv(
"id;namn;klass;märke;transponder;klubb;land\n;New Driver;2WD;Associated;222;JMK;SE\ndriver_1;Existing Driver;4WD;;111;;",
{
classes: [{ id: "class_4wd", name: "4WD" }],
drivers: [{ id: "driver_1", name: "Old Name", classId: "class_4wd", brand: "Xray", transponder: "111", profileId: "profile_1", club: "JMK", country: "SE" }],
uid: makeUid(),
}
);
assert.equal(result.added, 1);
assert.equal(result.updated, 1);
assert.equal(result.skipped, 0);
assert.equal(result.classes.find((item) => item.name === "2WD")?.id, "class_1");
assert.equal(result.drivers.find((item) => item.id === "driver_1")?.name, "Existing Driver");
assert.equal(result.drivers.find((item) => item.id === "driver_1")?.brand, "Xray");
assert.equal(result.drivers.find((item) => item.transponder === "222")?.classId, "class_1");
});
test("minimal driver CSV ignores missing optional fields and skips nameless rows", () => {
const result = importDriversCsv(
"namn;transponder;klass;fält_från_annat_system\nAnna Andersson;123456;2WD;ignoreras\n;999999;4WD;ignoreras",
{
classes: [],
drivers: [],
uid: makeUid(),
}
);
assert.equal(result.added, 1);
assert.equal(result.updated, 0);
assert.equal(result.skipped, 1);
assert.equal(result.drivers[0].name, "Anna Andersson");
assert.equal(result.drivers[0].transponder, "123456");
assert.equal(result.drivers[0].brand, "");
assert.equal(result.drivers[0].club, "");
assert.equal(result.drivers[0].country, "");
assert.equal(result.classes[0].name, "2WD");
});
test("car CSV import matches transponders and skips nameless rows", () => {
const result = importCarsCsv(
"name,brand,transponder\nUpdated Car,,123\nNew Car,Schumacher,456\n,Missing,789",
{
cars: [{ id: "car_1", name: "Old Car", brand: "Associated", transponder: "123" }],
uid: makeUid(),
}
);
assert.equal(result.added, 1);
assert.equal(result.updated, 1);
assert.equal(result.skipped, 1);
assert.equal(result.cars.find((item) => item.id === "car_1")?.name, "Updated Car");
assert.equal(result.cars.find((item) => item.id === "car_1")?.brand, "Associated");
});