84 lines
5.3 KiB
TypeScript
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.");
|
|
});
|
|
});
|