fix(discovery): expose saved-search load failures and retry
This commit is contained in:
@@ -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();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user