diff --git a/frontend/app/component/form/data_entry/PollingStationFormController.test.tsx b/frontend/app/component/form/data_entry/PollingStationFormController.test.tsx index 3b5336eeb..85b0971b4 100644 --- a/frontend/app/component/form/data_entry/PollingStationFormController.test.tsx +++ b/frontend/app/component/form/data_entry/PollingStationFormController.test.tsx @@ -1,14 +1,18 @@ import * as React from "react"; -import { describe, expect, test } from "vitest"; +import { beforeEach, describe, expect, test } from "vitest"; import { PollingStationFormController } from "app/component/form/data_entry/PollingStationFormController"; import { usePollingStationFormController } from "app/component/form/data_entry/usePollingStationFormController"; import { errorWarningMocks } from "app/component/form/testHelperFunctions"; import { SaveDataEntryResponse } from "@kiesraad/api"; -import { electionMockData } from "@kiesraad/api-mocks"; -import { overrideOnce, Providers, renderHook, waitFor } from "@kiesraad/test"; +import { + electionMockData, + PollingStationDataEntryGetHandler, + PollingStationDataEntrySaveHandler, +} from "@kiesraad/api-mocks"; +import { overrideOnce, Providers, renderHook, server, waitFor } from "@kiesraad/test"; const Wrapper = ({ children }: { children: React.ReactNode }) => ( @@ -19,6 +23,9 @@ const Wrapper = ({ children }: { children: React.ReactNode }) => ( ); describe("PollingStationFormController", () => { + beforeEach(() => { + server.use(PollingStationDataEntryGetHandler, PollingStationDataEntrySaveHandler); + }); test("PollingStationFormController renderHook", async () => { const { result } = renderHook(() => usePollingStationFormController(), { wrapper: Wrapper, diff --git a/frontend/app/component/form/data_entry/candidates_votes/CandidatesVotesForm.test.tsx b/frontend/app/component/form/data_entry/candidates_votes/CandidatesVotesForm.test.tsx index a159f85a2..bffcf81e4 100644 --- a/frontend/app/component/form/data_entry/candidates_votes/CandidatesVotesForm.test.tsx +++ b/frontend/app/component/form/data_entry/candidates_votes/CandidatesVotesForm.test.tsx @@ -1,5 +1,5 @@ import { userEvent } from "@testing-library/user-event"; -import { describe, expect, test, vi } from "vitest"; +import { beforeEach, describe, expect, test, vi } from "vitest"; import { Election, @@ -7,8 +7,13 @@ import { POLLING_STATION_DATA_ENTRY_SAVE_REQUEST_BODY, PollingStationResults, } from "@kiesraad/api"; -import { electionMockData, politicalGroupMockData } from "@kiesraad/api-mocks"; -import { getUrlMethodAndBody, overrideOnce, render, screen, within } from "@kiesraad/test"; +import { + electionMockData, + politicalGroupMockData, + PollingStationDataEntryGetHandler, + PollingStationDataEntrySaveHandler, +} from "@kiesraad/api-mocks"; +import { getUrlMethodAndBody, overrideOnce, render, screen, server, within } from "@kiesraad/test"; import { emptyDataEntryRequest, @@ -41,6 +46,10 @@ const candidatesFieldIds = { }; describe("Test CandidatesVotesForm", () => { + beforeEach(() => { + server.use(PollingStationDataEntryGetHandler, PollingStationDataEntrySaveHandler); + }); + describe("CandidatesVotesForm renders correctly", () => { test("Candidates with first name", async () => { const politicalGroupMockData: PoliticalGroup = { diff --git a/frontend/app/component/form/data_entry/check_and_save/CheckAndSaveForm.test.tsx b/frontend/app/component/form/data_entry/check_and_save/CheckAndSaveForm.test.tsx index c607f424e..54942a97a 100644 --- a/frontend/app/component/form/data_entry/check_and_save/CheckAndSaveForm.test.tsx +++ b/frontend/app/component/form/data_entry/check_and_save/CheckAndSaveForm.test.tsx @@ -2,7 +2,12 @@ import { userEvent } from "@testing-library/user-event"; import { beforeEach, describe, expect, test, vi } from "vitest"; import { ElectionProvider, PollingStationResults } from "@kiesraad/api"; -import { electionDetailsMockResponse, electionMockData } from "@kiesraad/api-mocks"; +import { + electionMockData, + ElectionRequestHandler, + PollingStationDataEntryGetHandler, + PollingStationDataEntrySaveHandler, +} from "@kiesraad/api-mocks"; import { overrideOnce, renderReturningRouter, screen, server, within } from "@kiesraad/test"; import { defaultFormState, emptyDataEntryRequest, errorWarningMocks } from "../../testHelperFunctions"; @@ -29,7 +34,7 @@ function renderForm(defaultFormState: Partial = {}, defaultValues?: P describe("Test CheckAndSaveForm", () => { beforeEach(() => { - overrideOnce("get", "/api/elections/1", 200, electionDetailsMockResponse); + server.use(ElectionRequestHandler, PollingStationDataEntryGetHandler, PollingStationDataEntrySaveHandler); }); test("Data entry can be finalised", async () => { @@ -130,6 +135,9 @@ describe("Test CheckAndSaveForm", () => { }); describe("Test CheckAndSaveForm summary", () => { + beforeEach(() => { + server.use(ElectionRequestHandler, PollingStationDataEntryGetHandler, PollingStationDataEntrySaveHandler); + }); test("Blocking", async () => { const formState = structuredClone(defaultFormState); formState.sections.voters_votes_counts.errors = [errorWarningMocks.F201]; diff --git a/frontend/app/component/form/data_entry/differences/DifferencesForm.test.tsx b/frontend/app/component/form/data_entry/differences/DifferencesForm.test.tsx index d5aedc7ed..a709b7253 100644 --- a/frontend/app/component/form/data_entry/differences/DifferencesForm.test.tsx +++ b/frontend/app/component/form/data_entry/differences/DifferencesForm.test.tsx @@ -1,5 +1,5 @@ import { userEvent } from "@testing-library/user-event"; -import { describe, expect, test, vi } from "vitest"; +import { beforeEach, describe, expect, test, vi } from "vitest"; import { emptyDataEntryRequest, @@ -10,8 +10,12 @@ import { } from "app/component/form/testHelperFunctions"; import { POLLING_STATION_DATA_ENTRY_SAVE_REQUEST_BODY, PollingStationResults } from "@kiesraad/api"; -import { electionMockData } from "@kiesraad/api-mocks"; -import { getUrlMethodAndBody, overrideOnce, render, screen, userTypeInputs } from "@kiesraad/test"; +import { + electionMockData, + PollingStationDataEntryGetHandler, + PollingStationDataEntrySaveHandler, +} from "@kiesraad/api-mocks"; +import { getUrlMethodAndBody, overrideOnce, render, screen, server, userTypeInputs } from "@kiesraad/test"; import { PollingStationFormController } from "../PollingStationFormController"; import { DifferencesForm } from "./DifferencesForm"; @@ -40,6 +44,10 @@ const differencesFieldIds = { }; describe("Test DifferencesForm", () => { + beforeEach(() => { + server.use(PollingStationDataEntryGetHandler, PollingStationDataEntrySaveHandler); + }); + describe("DifferencesForm user interactions", () => { test("hitting enter key does not result in api call", async () => { const user = userEvent.setup(); diff --git a/frontend/app/component/form/data_entry/polling_station_choice/PollingStationChoiceForm.test.tsx b/frontend/app/component/form/data_entry/polling_station_choice/PollingStationChoiceForm.test.tsx index 7080170ea..5e4678123 100644 --- a/frontend/app/component/form/data_entry/polling_station_choice/PollingStationChoiceForm.test.tsx +++ b/frontend/app/component/form/data_entry/polling_station_choice/PollingStationChoiceForm.test.tsx @@ -1,12 +1,17 @@ import { waitFor } from "@testing-library/react"; import { userEvent } from "@testing-library/user-event"; -import { describe, expect, test } from "vitest"; +import { beforeEach, describe, expect, test } from "vitest"; import { PollingStationChoiceForm } from "app/component/form/data_entry/polling_station_choice/PollingStationChoiceForm"; import { ElectionProvider, ElectionStatusProvider, ElectionStatusResponse } from "@kiesraad/api"; -import { electionDetailsMockResponse, electionStatusMockResponse } from "@kiesraad/api-mocks"; -import { overrideOnce, render, renderReturningRouter, screen, within } from "@kiesraad/test"; +import { + electionDetailsMockResponse, + ElectionRequestHandler, + electionStatusMockResponse, + ElectionStatusRequestHandler, +} from "@kiesraad/api-mocks"; +import { overrideOnce, render, renderReturningRouter, screen, server, within } from "@kiesraad/test"; function renderPollingStationChoicePage() { return renderReturningRouter( @@ -19,6 +24,9 @@ function renderPollingStationChoicePage() { } describe("Test PollingStationChoiceForm", () => { + beforeEach(() => { + server.use(ElectionStatusRequestHandler); + }); describe("Polling station choice form", () => { test("Form field entry", async () => { overrideOnce("get", "/api/elections/1", 200, electionDetailsMockResponse); @@ -305,6 +313,7 @@ describe("Test PollingStationChoiceForm", () => { describe("Polling station in progress", () => { test("Show polling stations as 'in progress'", async () => { + server.use(ElectionRequestHandler); overrideOnce("get", "api/elections/1/status", 200, { statuses: [ { polling_station_id: 1, status: "first_entry_not_started" }, diff --git a/frontend/app/component/form/data_entry/recounted/RecountedForm.test.tsx b/frontend/app/component/form/data_entry/recounted/RecountedForm.test.tsx index eb7e0ad73..a9dd91a56 100644 --- a/frontend/app/component/form/data_entry/recounted/RecountedForm.test.tsx +++ b/frontend/app/component/form/data_entry/recounted/RecountedForm.test.tsx @@ -1,11 +1,15 @@ import { userEvent } from "@testing-library/user-event"; -import { describe, expect, test, vi } from "vitest"; +import { beforeEach, describe, expect, test, vi } from "vitest"; import { emptyDataEntryRequest, errorWarningMocks } from "app/component/form/testHelperFunctions"; import { POLLING_STATION_DATA_ENTRY_SAVE_REQUEST_BODY, SaveDataEntryResponse } from "@kiesraad/api"; -import { electionMockData } from "@kiesraad/api-mocks"; -import { getUrlMethodAndBody, overrideOnce, render, screen } from "@kiesraad/test"; +import { + electionMockData, + PollingStationDataEntryGetHandler, + PollingStationDataEntrySaveHandler, +} from "@kiesraad/api-mocks"; +import { getUrlMethodAndBody, overrideOnce, render, screen, server } from "@kiesraad/test"; import { PollingStationFormController } from "../PollingStationFormController"; import { RecountedForm } from "./RecountedForm"; @@ -17,6 +21,9 @@ const Component = ( ); describe("Test RecountedForm", () => { + beforeEach(() => { + server.use(PollingStationDataEntryGetHandler, PollingStationDataEntrySaveHandler); + }); describe("RecountedForm user interactions", () => { test("hitting enter key does not result in api call", async () => { render(Component); diff --git a/frontend/app/component/form/data_entry/voters_and_votes/VotersAndVotesForm.test.tsx b/frontend/app/component/form/data_entry/voters_and_votes/VotersAndVotesForm.test.tsx index d1411dbcf..cd89fc80d 100644 --- a/frontend/app/component/form/data_entry/voters_and_votes/VotersAndVotesForm.test.tsx +++ b/frontend/app/component/form/data_entry/voters_and_votes/VotersAndVotesForm.test.tsx @@ -1,5 +1,5 @@ import { userEvent } from "@testing-library/user-event"; -import { describe, expect, test, vi } from "vitest"; +import { beforeEach, describe, expect, test, vi } from "vitest"; import { emptyDataEntryRequest, @@ -10,8 +10,12 @@ import { } from "app/component/form/testHelperFunctions"; import { POLLING_STATION_DATA_ENTRY_SAVE_REQUEST_BODY, PollingStationResults } from "@kiesraad/api"; -import { electionMockData } from "@kiesraad/api-mocks"; -import { getUrlMethodAndBody, overrideOnce, render, screen, userTypeInputs, waitFor } from "@kiesraad/test"; +import { + electionMockData, + PollingStationDataEntryGetHandler, + PollingStationDataEntrySaveHandler, +} from "@kiesraad/api-mocks"; +import { getUrlMethodAndBody, overrideOnce, render, screen, server, userTypeInputs, waitFor } from "@kiesraad/test"; import { FormState, PollingStationFormController } from "../PollingStationFormController"; import { VotersAndVotesForm } from "./VotersAndVotesForm"; @@ -91,6 +95,10 @@ const recountFieldIds = { }; describe("Test VotersAndVotesForm", () => { + beforeEach(() => { + server.use(PollingStationDataEntryGetHandler, PollingStationDataEntrySaveHandler); + }); + describe("VotersAndVotesForm user interactions", () => { test("hitting enter key does not result in api call", async () => { const user = userEvent.setup(); @@ -124,10 +132,6 @@ describe("Test VotersAndVotesForm", () => { }); test("Form field entry and keybindings", async () => { - overrideOnce("post", "/api/polling_stations/1/data_entries/1", 200, { - validation_results: { errors: [], warnings: [] }, - }); - const user = userEvent.setup(); renderForm({ recounted: true }); diff --git a/frontend/app/component/form/polling_station/PollingStationForm.test.tsx b/frontend/app/component/form/polling_station/PollingStationForm.test.tsx index 0633a00f8..f3f2532e2 100644 --- a/frontend/app/component/form/polling_station/PollingStationForm.test.tsx +++ b/frontend/app/component/form/polling_station/PollingStationForm.test.tsx @@ -1,8 +1,9 @@ import { UserEvent, userEvent } from "@testing-library/user-event"; -import { describe, expect, test, vi } from "vitest"; +import { beforeEach, describe, expect, test, vi } from "vitest"; import { ErrorResponse, PollingStation } from "@kiesraad/api"; -import { overrideOnce, render, screen, waitFor } from "@kiesraad/test"; +import { PollingStationCreateHandler, PollingStationUpdateHandler } from "@kiesraad/api-mocks"; +import { overrideOnce, render, screen, server, waitFor } from "@kiesraad/test"; import { PollingStationForm } from "./PollingStationForm"; @@ -43,6 +44,9 @@ async function fillForm(user: UserEvent, testPollingStation: PollingStation | Om } describe("PollingStationForm", () => { + beforeEach(() => { + server.use(PollingStationCreateHandler, PollingStationUpdateHandler); + }); describe("PollingStationForm create", () => { test("Successful create", async () => { const testPollingStation: Omit = { diff --git a/frontend/app/module/data_entry/page/DataEntryHomePage.test.tsx b/frontend/app/module/data_entry/page/DataEntryHomePage.test.tsx index cb3b4df62..d8f0c12e3 100644 --- a/frontend/app/module/data_entry/page/DataEntryHomePage.test.tsx +++ b/frontend/app/module/data_entry/page/DataEntryHomePage.test.tsx @@ -6,8 +6,13 @@ import { beforeEach, describe, expect, test } from "vitest"; import { routes } from "app/routes"; import { ElectionProvider, ElectionStatusProvider, ElectionStatusResponse } from "@kiesraad/api"; -import { electionDetailsMockResponse } from "@kiesraad/api-mocks"; -import { overrideOnce, Providers, render, screen, setupTestRouter, waitFor, within } from "@kiesraad/test"; +import { + electionDetailsMockResponse, + ElectionListRequestHandler, + ElectionRequestHandler, + ElectionStatusRequestHandler, +} from "@kiesraad/api-mocks"; +import { overrideOnce, Providers, render, screen, server, setupTestRouter, waitFor, within } from "@kiesraad/test"; import { DataEntryHomePage } from "./DataEntryHomePage"; @@ -22,6 +27,7 @@ const renderDataEntryHomePage = () => describe("DataEntryHomePage", () => { beforeEach(() => { + server.use(ElectionListRequestHandler, ElectionRequestHandler, ElectionStatusRequestHandler); overrideOnce("get", "/api/elections/1", 200, electionDetailsMockResponse); }); diff --git a/frontend/app/module/data_entry/polling_station/AbortDataEntryControl.test.tsx b/frontend/app/module/data_entry/polling_station/AbortDataEntryControl.test.tsx index eda6932ac..ec5edf111 100644 --- a/frontend/app/module/data_entry/polling_station/AbortDataEntryControl.test.tsx +++ b/frontend/app/module/data_entry/polling_station/AbortDataEntryControl.test.tsx @@ -8,8 +8,14 @@ import { POLLING_STATION_DATA_ENTRY_SAVE_REQUEST_BODY, SaveDataEntryResponse, } from "@kiesraad/api"; -import { electionDetailsMockResponse, electionMockData } from "@kiesraad/api-mocks"; -import { overrideOnce, renderReturningRouter, screen, server } from "@kiesraad/test"; +import { + electionMockData, + ElectionRequestHandler, + PollingStationDataEntryDeleteHandler, + PollingStationDataEntryGetHandler, + PollingStationDataEntrySaveHandler, +} from "@kiesraad/api-mocks"; +import { renderReturningRouter, screen, server } from "@kiesraad/test"; import { PollingStationFormController } from "../../../component/form/data_entry/PollingStationFormController"; import { VotersAndVotesForm } from "../../../component/form/data_entry/voters_and_votes/VotersAndVotesForm"; @@ -29,7 +35,7 @@ const renderAbortDataEntryControl = () => { describe("Test AbortDataEntryControl", () => { beforeEach(() => { - overrideOnce("get", "/api/elections/1", 200, electionDetailsMockResponse); + server.use(ElectionRequestHandler, PollingStationDataEntryGetHandler, PollingStationDataEntrySaveHandler); }); test("renders and toggles the modal", async () => { @@ -98,7 +104,7 @@ describe("Test AbortDataEntryControl", () => { // set up a listener to check if the delete request is made let request_method, request_url; - overrideOnce("delete", "/api/polling_stations/1/data_entries/1", 204, null); + server.use(PollingStationDataEntryDeleteHandler); server.events.on("request:start", ({ request }) => { request_method = request.method; request_url = request.url; diff --git a/frontend/app/module/data_entry/polling_station/PollingStation.test.tsx b/frontend/app/module/data_entry/polling_station/PollingStation.test.tsx index 97d77d988..436a591d6 100644 --- a/frontend/app/module/data_entry/polling_station/PollingStation.test.tsx +++ b/frontend/app/module/data_entry/polling_station/PollingStation.test.tsx @@ -1,17 +1,26 @@ import { render as rtlRender } from "@testing-library/react"; import { userEvent } from "@testing-library/user-event"; -import { describe, expect, test, vi } from "vitest"; +import { beforeEach, describe, expect, test, vi } from "vitest"; import { errorWarningMocks } from "app/component/form/testHelperFunctions"; import { routes } from "app/routes"; import { SaveDataEntryResponse } from "@kiesraad/api"; -import { electionMockData } from "@kiesraad/api-mocks"; +import { + ElectionListRequestHandler, + electionMockData, + ElectionRequestHandler, + ElectionStatusRequestHandler, + PollingStationDataEntryDeleteHandler, + PollingStationDataEntryGetHandler, + PollingStationDataEntrySaveHandler, +} from "@kiesraad/api-mocks"; import { overrideOnce, Providers, Router, screen, + server, setupTestRouter, userTypeInputs, waitFor, @@ -298,6 +307,16 @@ async function executeStepsForPendingChanges(router: Router) { } describe("Polling Station data entry integration tests", () => { + beforeEach(() => { + server.use( + ElectionListRequestHandler, + ElectionRequestHandler, + ElectionStatusRequestHandler, + PollingStationDataEntryGetHandler, + PollingStationDataEntrySaveHandler, + PollingStationDataEntryDeleteHandler, + ); + }); describe("Navigation through the form", () => { test("Fill in complete form", async () => { const router = renderWithRouter(); diff --git a/frontend/app/module/data_entry/polling_station/PollingStationLayout.test.tsx b/frontend/app/module/data_entry/polling_station/PollingStationLayout.test.tsx index 10bb5b58f..9f7b34b40 100644 --- a/frontend/app/module/data_entry/polling_station/PollingStationLayout.test.tsx +++ b/frontend/app/module/data_entry/polling_station/PollingStationLayout.test.tsx @@ -3,8 +3,16 @@ import { beforeEach, describe, expect, test, vi } from "vitest"; import { PollingStationLayout } from "app/module/data_entry"; import { Election, ElectionListProvider, ElectionProvider, ElectionStatusProvider } from "@kiesraad/api"; -import { electionDetailsMockResponse, pollingStationMockData } from "@kiesraad/api-mocks"; -import { overrideOnce, render, screen, within } from "@kiesraad/test"; +import { + electionDetailsMockResponse, + ElectionListRequestHandler, + ElectionRequestHandler, + ElectionStatusRequestHandler, + PollingStationDataEntryGetHandler, + PollingStationDataEntrySaveHandler, + pollingStationMockData, +} from "@kiesraad/api-mocks"; +import { render, screen, server, within } from "@kiesraad/test"; import { PollingStationFormController } from "../../../component/form/data_entry/PollingStationFormController"; @@ -17,7 +25,13 @@ describe("PollingStationLayout", () => { const election = electionDetailsMockResponse.election as Required; beforeEach(() => { - overrideOnce("get", "/api/elections/1", 200, electionDetailsMockResponse); + server.use( + ElectionListRequestHandler, + ElectionRequestHandler, + ElectionStatusRequestHandler, + PollingStationDataEntryGetHandler, + PollingStationDataEntrySaveHandler, + ); }); test("Render", async () => { diff --git a/frontend/app/module/election/page/ElectionReportPage.test.tsx b/frontend/app/module/election/page/ElectionReportPage.test.tsx index 7cc8faa29..87bd0f539 100644 --- a/frontend/app/module/election/page/ElectionReportPage.test.tsx +++ b/frontend/app/module/election/page/ElectionReportPage.test.tsx @@ -1,13 +1,18 @@ import { render as rtlRender } from "@testing-library/react"; -import { describe, expect, test, vi } from "vitest"; +import { beforeEach, describe, expect, test, vi } from "vitest"; import { ElectionReportPage } from "app/module/election"; import { routes } from "app/routes"; import { ElectionProvider, ElectionStatusProvider } from "@kiesraad/api"; -import { expectErrorPage, overrideOnce, Providers, render, screen, setupTestRouter } from "@kiesraad/test"; +import { ElectionRequestHandler } from "@kiesraad/api-mocks"; +import { expectErrorPage, overrideOnce, Providers, render, screen, server, setupTestRouter } from "@kiesraad/test"; describe("ElectionReportPage", () => { + beforeEach(() => { + server.use(ElectionRequestHandler); + }); + test("Error when election is not ready", async () => { // Since we test what happens after an error, we want vitest to ignore them vi.spyOn(console, "error").mockImplementation(() => { diff --git a/frontend/app/module/polling_stations/page/PollingStationCreatePage.test.tsx b/frontend/app/module/polling_stations/page/PollingStationCreatePage.test.tsx index 82f1ca980..bcbb0252e 100644 --- a/frontend/app/module/polling_stations/page/PollingStationCreatePage.test.tsx +++ b/frontend/app/module/polling_stations/page/PollingStationCreatePage.test.tsx @@ -2,12 +2,15 @@ import { screen } from "@testing-library/react"; import { describe, expect, test } from "vitest"; import { ElectionProvider } from "@kiesraad/api"; -import { render } from "@kiesraad/test"; +import { ElectionRequestHandler } from "@kiesraad/api-mocks"; +import { render, server } from "@kiesraad/test"; import { PollingStationCreatePage } from "./PollingStationCreatePage"; describe("PollingStationCreatePage", () => { test("Shows form", async () => { + server.use(ElectionRequestHandler); + render( diff --git a/frontend/app/module/polling_stations/page/PollingStationListPage.test.tsx b/frontend/app/module/polling_stations/page/PollingStationListPage.test.tsx index 709ebd47d..cd846482b 100644 --- a/frontend/app/module/polling_stations/page/PollingStationListPage.test.tsx +++ b/frontend/app/module/polling_stations/page/PollingStationListPage.test.tsx @@ -1,12 +1,17 @@ import { screen } from "@testing-library/react"; -import { describe, expect, test } from "vitest"; +import { beforeEach, describe, expect, test } from "vitest"; import { PollingStationListPage } from "app/module/polling_stations"; import { ElectionProvider, PollingStationListResponse } from "@kiesraad/api"; -import { overrideOnce, render } from "@kiesraad/test"; +import { ElectionRequestHandler, PollingStationListRequestHandler } from "@kiesraad/api-mocks"; +import { overrideOnce, render, server } from "@kiesraad/test"; describe("PollingStationListPage", () => { + beforeEach(() => { + server.use(ElectionRequestHandler, PollingStationListRequestHandler); + }); + test("Show polling stations", async () => { render( diff --git a/frontend/app/module/polling_stations/page/PollingStationUpdatePage.test.tsx b/frontend/app/module/polling_stations/page/PollingStationUpdatePage.test.tsx index 48186682b..58c48353a 100644 --- a/frontend/app/module/polling_stations/page/PollingStationUpdatePage.test.tsx +++ b/frontend/app/module/polling_stations/page/PollingStationUpdatePage.test.tsx @@ -1,9 +1,10 @@ import { within } from "@testing-library/dom"; import { screen, waitFor } from "@testing-library/react"; import { userEvent } from "@testing-library/user-event"; -import { describe, expect, test, vi } from "vitest"; +import { beforeEach, describe, expect, test, vi } from "vitest"; import { ElectionProvider, PollingStation } from "@kiesraad/api"; +import { ElectionRequestHandler, PollingStationUpdateHandler } from "@kiesraad/api-mocks"; import { overrideOnce, render, renderReturningRouter, server } from "@kiesraad/test"; import { PollingStationUpdatePage } from "./PollingStationUpdatePage"; @@ -26,6 +27,10 @@ describe("PollingStationUpdatePage", () => { number_of_voters: 1, }; + beforeEach(() => { + server.use(ElectionRequestHandler, PollingStationUpdateHandler); + }); + test("Shows form", async () => { overrideOnce( "get", diff --git a/frontend/app/routes.test.tsx b/frontend/app/routes.test.tsx index 5b5d65d08..5d87e6983 100644 --- a/frontend/app/routes.test.tsx +++ b/frontend/app/routes.test.tsx @@ -1,8 +1,13 @@ import { render as rtlRender } from "@testing-library/react"; import { beforeEach, describe, expect, test, vi } from "vitest"; -import { electionStatusMockResponse } from "@kiesraad/api-mocks"; -import { expectErrorPage, expectNotFound, overrideOnce, Providers, setupTestRouter } from "@kiesraad/test"; +import { + ElectionListRequestHandler, + ElectionRequestHandler, + electionStatusMockResponse, + ElectionStatusRequestHandler, +} from "@kiesraad/api-mocks"; +import { expectErrorPage, expectNotFound, overrideOnce, Providers, server, setupTestRouter } from "@kiesraad/test"; import { routes } from "./routes"; @@ -14,6 +19,8 @@ const renderWithRouter = () => { describe("routes", () => { beforeEach(() => { + server.use(ElectionListRequestHandler, ElectionRequestHandler, ElectionStatusRequestHandler); + // Since we test what happens after an error, we want vitest to ignore them vi.spyOn(console, "error").mockImplementation(() => { /* do nothing */ diff --git a/frontend/lib/api-mocks/RequestHandlers.ts b/frontend/lib/api-mocks/RequestHandlers.ts index cab454b3b..3290d92f0 100644 --- a/frontend/lib/api-mocks/RequestHandlers.ts +++ b/frontend/lib/api-mocks/RequestHandlers.ts @@ -29,7 +29,7 @@ type PingResponseBody = { }; // ping handler for testing -const pingHandler = http.post("/ping", async ({ request }) => { +export const pingHandler = http.post("/ping", async ({ request }) => { const data = await request.json(); const pong = data.ping || "pong"; diff --git a/frontend/lib/api/ApiClient.ts b/frontend/lib/api/ApiClient.ts index 072dd71fc..3a8954461 100644 --- a/frontend/lib/api/ApiClient.ts +++ b/frontend/lib/api/ApiClient.ts @@ -158,8 +158,8 @@ export class ApiClient { } const message = (e as Error).message || "Network error"; - console.error(e); - return new NetworkError(message); + console.error(e, method, path); + return new NetworkError(`${message}, ${method} ${path}`); } } diff --git a/frontend/lib/api/api.test.ts b/frontend/lib/api/api.test.ts index f31c3340c..d328ca9fe 100644 --- a/frontend/lib/api/api.test.ts +++ b/frontend/lib/api/api.test.ts @@ -1,11 +1,15 @@ import { describe, expect, test } from "vitest"; +import { pingHandler } from "@kiesraad/api-mocks"; +import { server } from "@kiesraad/test"; + type Response = { pong: string; }; describe("Mock api works", () => { test("echos a value", async () => { + server.use(pingHandler); const resp = await fetch("/ping", { method: "POST", headers: { diff --git a/frontend/lib/test/router.ts b/frontend/lib/test/router.ts deleted file mode 100644 index 7ab5e7b6b..000000000 --- a/frontend/lib/test/router.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ReactNode } from "react"; -import { createMemoryRouter } from "react-router"; - -export type Router = ReturnType; - -export function getRouter(children: ReactNode) { - return createMemoryRouter([{ path: "*", element: children }]); -} diff --git a/frontend/lib/test/router.tsx b/frontend/lib/test/router.tsx new file mode 100644 index 000000000..dba2712db --- /dev/null +++ b/frontend/lib/test/router.tsx @@ -0,0 +1,15 @@ +/* eslint-disable react-refresh/only-export-components */ +import { ReactNode } from "react"; +import { createMemoryRouter, useRouteError } from "react-router"; + +export type Router = ReturnType; + +// Render a small html document with the error, for easier vitest debugging +function ErrorBoundary() { + const error = useRouteError() as Error; + return <>Error thrown during render: {error.message}; +} + +export function getRouter(children: ReactNode) { + return createMemoryRouter([{ path: "*", element: children, errorElement: }]); +} diff --git a/frontend/lib/test/server.ts b/frontend/lib/test/server.ts index d82052666..a8b6dd60c 100644 --- a/frontend/lib/test/server.ts +++ b/frontend/lib/test/server.ts @@ -10,9 +10,7 @@ import { delay, http, HttpResponse, JsonBodyType } from "msw"; import { setupServer } from "msw/node"; -import { handlers } from "@kiesraad/api-mocks"; - -export const server = setupServer(...handlers); +export const server = setupServer(); // Override request handlers in order to test special cases export function overrideOnce(