Files
Live_RC/tests/csv_import.test.js

51 lines
2.2 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("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");
});