fix(ux): preserve localized save errors and current language retries
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import React from "react";
|
||||
import "@testing-library/jest-dom";
|
||||
import { fireEvent, render, screen } from "@testing-library/react";
|
||||
import { fireEvent, render, screen, waitFor, within } from "@testing-library/react";
|
||||
import { MemoryRouter } from "react-router-dom";
|
||||
import { api } from "./api";
|
||||
import CompaniesTable from "./components/CompaniesTable";
|
||||
@@ -13,6 +13,12 @@ jest.mock("./api", () => ({
|
||||
}));
|
||||
const mockedApi = api as jest.Mocked<typeof api>;
|
||||
|
||||
beforeEach(() => {
|
||||
mockedApi.get.mockReset();
|
||||
mockedApi.put.mockReset();
|
||||
window.localStorage.clear();
|
||||
});
|
||||
|
||||
test("opens one company relationship view with applications and recent contact", async () => {
|
||||
const company = { id: 3, name: "Acme", recruiterName: "Rita", recruiterEmail: "rita@example.test" };
|
||||
mockedApi.get.mockImplementation((url) => Promise.resolve({ data: String(url).endsWith("/relationship") ? {
|
||||
@@ -29,3 +35,40 @@ test("opens one company relationship view with applications and recent contact",
|
||||
expect(screen.getByText(/Interview · 1 messages/)).toBeInTheDocument();
|
||||
expect(mockedApi.get).toHaveBeenCalledWith("/companies/3/relationship");
|
||||
});
|
||||
|
||||
test.each(["en", "nb"])("company contact dates follow the %s UI locale", async (language) => {
|
||||
window.localStorage.setItem("uiLanguage", language);
|
||||
const nextContactAt = "2026-11-23T12:00:00Z";
|
||||
mockedApi.get.mockResolvedValue({ data: [{ id: 3, name: "Acme", nextContactAt }] });
|
||||
render(<I18nProvider><ToastProvider><MemoryRouter><CompaniesTable /></MemoryRouter></ToastProvider></I18nProvider>);
|
||||
const expected = new Date(nextContactAt).toLocaleDateString(language === "nb" ? "nb-NO" : "en");
|
||||
await screen.findByRole("button", { name: `${language === "nb" ? "Rediger" : "Edit"}: Acme` });
|
||||
expect(screen.getByRole("row", { name: /Acme/ })).toHaveTextContent(expected);
|
||||
});
|
||||
|
||||
test.each([
|
||||
{ language: "en", edit: "Edit: Acme", name: "Name", save: "Save", failure: "Failed to update company." },
|
||||
{ language: "nb", edit: "Rediger: Acme", name: "Navn", save: "Lagre", failure: "Kunne ikke oppdatere selskap." },
|
||||
])("[PRES-J08 E08] $language company save failure remains inside the dialog with the draft available for retry", async ({ language, edit, name, save, failure }) => {
|
||||
window.localStorage.setItem("uiLanguage", language);
|
||||
const company = { id: 3, name: "Acme", location: "Oslo", source: "User", recruiterName: "Rita", recruiterEmail: "rita@example.test" };
|
||||
mockedApi.get.mockResolvedValue({ data: [company] });
|
||||
mockedApi.put.mockRejectedValueOnce(new Error("offline"));
|
||||
mockedApi.put.mockResolvedValueOnce({ data: { ...company, name: "Acme updated" } });
|
||||
render(<I18nProvider><ToastProvider><MemoryRouter><CompaniesTable /></MemoryRouter></ToastProvider></I18nProvider>);
|
||||
|
||||
fireEvent.click(await screen.findByRole("button", { name: edit }));
|
||||
const dialog = await screen.findByRole("dialog");
|
||||
fireEvent.change(within(dialog).getByRole("textbox", { name }), { target: { value: "Acme updated" } });
|
||||
fireEvent.click(within(dialog).getByRole("button", { name: save }));
|
||||
|
||||
expect(await within(dialog).findByRole("alert")).toHaveTextContent(failure);
|
||||
expect(within(dialog).getByRole("textbox", { name })).toHaveValue("Acme updated");
|
||||
expect(dialog).toBeVisible();
|
||||
expect(mockedApi.put).toHaveBeenNthCalledWith(1, "/companies/3", expect.objectContaining({ name: "Acme updated" }));
|
||||
|
||||
fireEvent.click(within(dialog).getByRole("button", { name: save }));
|
||||
await waitFor(() => expect(screen.queryByRole("dialog")).not.toBeInTheDocument());
|
||||
expect(await screen.findByRole("button", { name: `${language === "en" ? "Edit" : "Rediger"}: Acme updated` })).toBeVisible();
|
||||
expect(mockedApi.put).toHaveBeenNthCalledWith(2, "/companies/3", expect.objectContaining({ name: "Acme updated" }));
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user