fix(discovery): expose saved-search load failures and retry

This commit is contained in:
cesnimda
2026-10-09 15:01:13 +02:00
parent bcc9599049
commit 2753d03db6
4 changed files with 379 additions and 7 deletions
+49 -1
View File
@@ -81,7 +81,7 @@ test("renders the discovery workflow in Norwegian Bokmål", async () => {
});
test("runs a saved search, marks unseen vacancies, and dismisses them", async () => {
const saved = { id: 7, name: "Backend Oslo", query: "backend", location: "Oslo", resultCount: 0, dismissedCount: 0 };
const saved = { id: 7, name: "Backend Oslo", query: "backend", location: "Oslo", isActive: true, resultCount: 0, dismissedCount: 0 };
mockedApi.get.mockResolvedValue({ data: [saved] } as any);
mockedApi.post.mockResolvedValue({ data: { search: { ...saved, resultCount: 1 }, jobs: [{ job: { id: "new-1", title: "Platform Engineer", url: "https://example.test/new-1", source: "nav", countryCode: "NO" }, isNew: true, isDismissed: false }] } } as any);
mockedApi.patch.mockResolvedValue({ data: null } as any);
@@ -107,3 +107,51 @@ test("lets the user pause automatic alerts for a saved search", async () => {
await waitFor(() => expect(mockedApi.patch).toHaveBeenCalledWith("/job-discovery/saved-searches/7", { isActive: false }));
await waitFor(() => expect(toggle).not.toBeChecked());
});
test("announces saved-search loading without presenting a successful empty list", async () => {
let finish!: (value: any) => void;
mockedApi.get.mockReturnValue(new Promise((resolve) => { finish = resolve; }));
renderPage();
expect(screen.getByRole("status", { name: "Loading saved searches…" })).toBeInTheDocument();
expect(screen.queryByText("No saved searches yet.")).not.toBeInTheDocument();
finish({ data: [] });
expect(await screen.findByText("No saved searches yet.")).toBeInTheDocument();
expect(screen.queryByRole("status", { name: "Loading saved searches…" })).not.toBeInTheDocument();
});
test("reports saved-search failure and retries that read without replacing active discovery filters or results", async () => {
let savedAttempts = 0;
mockedApi.get.mockImplementation((url) => {
if (String(url).endsWith("saved-searches")) {
savedAttempts++;
return savedAttempts === 1
? Promise.reject({ response: { status: 500, data: { detail: "Internal database stack trace" } } })
: Promise.resolve({ data: [{ id: 7, name: "Backend Oslo", query: "backend", location: "Oslo", isActive: true, resultCount: 0, dismissedCount: 0 }] } as any);
}
return Promise.resolve({ data: [{ id: "vacancy", title: "Existing result", url: "https://example.test/vacancy", source: "nav", countryCode: "NO" }] } as any);
});
renderPage();
expect(await screen.findByText("Saved searches could not be loaded. Try again.")).toBeInTheDocument();
expect(screen.queryByText("No saved searches yet.")).not.toBeInTheDocument();
expect(screen.getByRole("button", { name: "Save search" })).toBeDisabled();
expect(screen.queryByText(/Internal database stack trace/)).not.toBeInTheDocument();
fireEvent.change(screen.getByLabelText("Role or company"), { target: { value: "developer" } });
fireEvent.change(screen.getByLabelText("Municipality"), { target: { value: "Bergen" } });
fireEvent.click(screen.getByRole("button", { name: "Search NAV" }));
await screen.findByText("Existing result");
fireEvent.click(screen.getByRole("button", { name: "Retry" }));
expect(await screen.findByText("Backend Oslo")).toBeInTheDocument();
expect(screen.getByRole("button", { name: "Save search" })).toBeEnabled();
expect(screen.getByLabelText("Role or company")).toHaveValue("developer");
expect(screen.getByLabelText("Municipality")).toHaveValue("Bergen");
expect(screen.getByText("Existing result")).toBeInTheDocument();
expect(screen.queryByText("Saved searches could not be loaded. Try again.")).not.toBeInTheDocument();
});
test.each([null, { message: "not a list" }, [{ id: 7 }]])("rejects malformed saved-search payload %j as a failed read rather than an empty list", async (data) => {
mockedApi.get.mockResolvedValue({ data } as any);
renderPage();
expect(await screen.findByText("Saved searches could not be loaded. Try again.")).toBeInTheDocument();
expect(screen.queryByText("No saved searches yet.")).not.toBeInTheDocument();
expect(screen.getByRole("button", { name: "Retry" })).toBeInTheDocument();
});