Files
HiveGrid-Wireframes/hivegrid-cloud/apps/web/app/modules/rows/components/rows-import-route-i18n.test.ts
T

84 lines
5.3 KiB
TypeScript

import fs from "node:fs";
import path from "node:path";
import { describe, expect, it } from "vitest";
const sourcePath = path.resolve(process.cwd(), "apps/web/app/modules/rows/components/RowsImportRoute.tsx");
describe("RowsImportRoute i18n", () => {
it("uses semantic translation keys for visible import copy", () => {
const source = fs.readFileSync(sourcePath, "utf8");
expect(source).toContain("models.row.import.steps.uploadCsvFile");
expect(source).toContain("models.row.import.delimiterOptions.comma");
expect(source).toContain("models.row.import.defaultColumnName");
expect(source).toContain("models.row.import.tagPromptLabel");
expect(source).toContain("models.row.import.tagPromptDescription");
expect(source).toContain("models.row.import.defaultTag");
expect(source).toContain("<Modal open={importTagDialogOpen}");
expect(source).toContain("<InputText name=\"tag\"");
expect(source).toContain("models.row.import.sampleValues.text");
expect(source).toContain("models.row.import.sampleValues.option");
expect(source).toContain("models.row.import.removeColumn");
expect(source).toContain("models.row.import.dryRunSummary");
expect(source).toContain("models.row.import.diagnosticColumn");
expect(source).toContain("models.row.import.diagnostics.");
expect(source).toContain("models.row.import.errors.previewFailed");
expect(source).toContain("translateRowImportError");
expect(source).toContain("models.row.import.errors.rowFailed");
expect(source).toContain("models.row.import.errors.entityNotFound");
expect(source).toContain("models.row.import.errors.rowAccessDenied");
expect(source).toContain("formattedRow");
expect(source).toContain("translateEntityTitlePlural");
expect(source).toContain("translatePropertyTitle");
expect(source).toContain("diagnostic.rowNumber ?? diagnostic.row");
expect(source).toContain('t("shared.importRecords", { count: items.length, formattedCount: formatters.number(items.length) })');
expect(source).toContain('t("shared.importRecords", { count: pendingItemCount, formattedCount: formatters.number(pendingItemCount) })');
expect(source).toContain('t("models.row.import.rowsCount", { count: uniqueRows.length, formattedCount: formatters.number(uniqueRows.length) })');
expect(source).not.toContain("defaultValue: fallback");
expect(source).not.toContain("{redactDryRunMessage(diagnostic.message)}");
expect(source).not.toMatch(/shared\.importRecord["')]/);
expect(source).not.toContain('t("models.row.import.rowsCount", { count: uniqueRows.length })');
expect(source).toContain("models.row.import.errorStatus");
expect(source).not.toContain("error: i.error");
expect(source).not.toContain("ui.autogenerated");
expect(source).not.toContain("Dry-run summary:");
expect(source).not.toContain("Network error while previewing import.");
expect(source).not.toContain("Import dry-run failed.");
expect(source).not.toContain("window.prompt");
expect(source).not.toMatch(/\bprompt\(/);
expect(source).not.toContain("window.confirm");
expect(source).not.toMatch(/\balert\(/);
expect(fs.readFileSync(path.resolve(process.cwd(), "apps/web/app/modules/rows/routes/Rows_Import.server.ts"), "utf8")).toContain(
't("models.row.import.defaultTag")'
);
expect(source).not.toContain("`Column ${index + 1}`");
expect(source).not.toContain("t(entity.titlePlural)");
expect(source).not.toContain("t(prop.title)");
expect(source).not.toContain('t(property?.title ?? "")');
expect(source).not.toContain("Abc, efg");
expect(source).not.toContain("Option 1");
expect(source).not.toContain('aria-label="Remove column"');
});
it("uses clearer import locale labels", () => {
const en = JSON.parse(fs.readFileSync(path.resolve(process.cwd(), "apps/web/public/locales/en/translations.json"), "utf8"));
const de = JSON.parse(fs.readFileSync(path.resolve(process.cwd(), "apps/web/public/locales/de/translations.json"), "utf8"));
expect(en.models.row.import.tagPromptLabel).toBe("Import label");
expect(en.models.row.import.primary).toBe("Match field");
expect(en.models.row.import.identifyExistingRecords).toBe("Used to identify existing records");
expect(en.models.row.import.removeColumn).toBe("Remove column {{column}}");
expect(en.models.row.import.errors.invalidJsonBody).toBe("Invalid JSON payload.");
expect(en.models.row.import.errors.rowFailed).toBe("This row could not be imported. Review its values and try again.");
expect(en.models.row.import.errors.rowAccessDenied).toBe("You do not have access to one of the referenced rows.");
expect(de.models.row.import.tagPromptLabel).toBe("Importkennzeichnung");
expect(de.models.row.import.primary).toBe("Abgleichsfeld");
expect(de.models.row.import.identifyExistingRecords).toBe("Wird zum Erkennen vorhandener Datensätze verwendet");
expect(de.models.row.import.removeColumn).toBe("Spalte {{column}} entfernen");
expect(de.models.row.import.errors.invalidJsonBody).toBe("Ungültiger JSON-Inhalt.");
expect(de.models.row.import.errors.rowFailed).toBe("Dieser Datensatz konnte nicht importiert werden. Prüfe die Werte und versuche es erneut.");
expect(de.models.row.import.errors.rowAccessDenied).toBe("Du hast keinen Zugriff auf einen der referenzierten Datensätze.");
});
});