Files
jobtrackingapp/job-tracker-ui/src/ai-section-assistant.test.tsx
T
2026-08-28 20:30:42 +02:00

72 lines
2.6 KiB
TypeScript

import React from "react";
import "@testing-library/jest-dom";
import { fireEvent, render, screen, waitFor } from "@testing-library/react";
import { api } from "./api";
import AiSectionAssistant from "./components/cv/AiSectionAssistant";
import { I18nProvider } from "./i18n/I18nProvider";
import { ToastProvider } from "./toast";
jest.mock("./accountPlan", () => ({ useAccountPlan: () => ({ canUseAi: true }) }));
jest.mock("./api", () => ({
api: {
get: jest.fn(), post: jest.fn(), put: jest.fn(), delete: jest.fn(),
interceptors: { request: { use: jest.fn() }, response: { use: jest.fn() } },
},
getApiErrorMessage: (_error: unknown, fallback?: string) => fallback ?? "Request failed.",
}));
const mockedApi = api as jest.Mocked<typeof api>;
function renderAssistant(onApply = jest.fn()) {
render(
<I18nProvider>
<ToastProvider>
<AiSectionAssistant
sectionName="Erfaring"
text="Built reliable APIs"
documentLanguage="nb-NO"
onApply={onApply}
/>
</ToastProvider>
</I18nProvider>,
);
return onApply;
}
beforeEach(() => {
window.localStorage.removeItem("uiLanguage");
jest.clearAllMocks();
});
afterEach(() => window.localStorage.removeItem("uiLanguage"));
test("section AI uses the CV document language and requires explicit apply", async () => {
mockedApi.post.mockResolvedValue({ data: { original: "Built reliable APIs", result: "Utviklet driftssikre API-er" } } as never);
const onApply = renderAssistant();
fireEvent.click(screen.getByRole("button", { name: "AI suggestions" }));
expect(screen.getByLabelText("Output language")).toHaveTextContent("Norsk bokmål");
fireEvent.click(screen.getByRole("button", { name: "Suggest" }));
await waitFor(() => expect(mockedApi.post).toHaveBeenCalledWith("/cv/ai/assist", expect.objectContaining({
action: "improve",
language: "nb-NO",
text: "Built reliable APIs",
})));
expect(onApply).not.toHaveBeenCalled();
expect(await screen.findByDisplayValue("Utviklet driftssikre API-er")).toBeInTheDocument();
fireEvent.click(screen.getByRole("button", { name: "Apply" }));
expect(onApply).toHaveBeenCalledWith("Utviklet driftssikre API-er");
});
test("section AI controls render in Bokmål without changing the document language", () => {
window.localStorage.setItem("uiLanguage", "nb");
renderAssistant();
fireEvent.click(screen.getByRole("button", { name: "AI-forslag" }));
expect(screen.getByLabelText("AI-handling")).toBeInTheDocument();
expect(screen.getByLabelText("Språk for resultat")).toHaveTextContent("Norsk bokmål");
expect(screen.getByRole("button", { name: "Foreslå" })).toBeInTheDocument();
});