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