diff --git a/src/i18n/generated/da-v2.json b/src/i18n/generated/da-v2.json index 4d375946..850ab1bc 100644 --- a/src/i18n/generated/da-v2.json +++ b/src/i18n/generated/da-v2.json @@ -4575,7 +4575,9 @@ "loading_department": "@.capitalize:{'words.generated.indlæser'} @:{'words.generated.afdeling'}...", "loading_types": "@.capitalize:{'words.generated.indlæser'} @:{'words.generated.typer'}...", "loading_vehicle_types": "@.capitalize:{'words.generated.indlæser'} @:{'words.generated.tilgængelige'} @:{'words.generated.køretøjstyper'}...", + "lane_unavailable": "Vaskebanen er ikke tilgaengelig", "machine": "@.capitalize:{'words.generated.maskine'}", + "machine_unavailable_for_lane": "Maskinvask er ikke tilgaengelig for den valgte bane. Vaelg manuel vask eller en anden ledig bane.", "no_departments_found": "@:{'templates.generated.compat.departments.no_departments'}", "occupied": "Optaget", "open_property_access_gate": "@:{'words.generated.abn'} adgangsport", @@ -4591,6 +4593,10 @@ "start_wash": "@:{'templates.generated.compat.guest.start_wash'}", "total_time": "@.capitalize:{'words.generated.samlet'} @:{'words.generated.tid'}: {minutes} @:{'words.generated.minutter'} @:{'words.generated.og'} {seconds} @:{'words.generated.sekunder'}", "unavailable": "@.capitalize:{'words.generated.utilgængelig'}", + "vehicle_step_missing_customer_number": "Indtast kundenummer for at fortsaette.", + "vehicle_step_missing_department": "Vent paa, at naermeste afdeling er indlaest, foer du fortsaetter.", + "vehicle_step_missing_registration": "Indtast registreringsnummer for at fortsaette.", + "vehicle_step_missing_vehicle_type": "Vaelg en tilgaengelig koeretoejstype for at fortsaette.", "wash_completed_contact": "@.capitalize:{'words.generated.vi'} håber, @:{'words.generated.at'} @:{'words.generated.du'} @:{'words.generated.er'} tilfreds @:{'words.generated.med'} resultatet. @.capitalize:{'words.generated.hvis'} @:{'words.generated.du'} @:{'words.generated.har'} @:{'words.generated.brug'} @:{'words.generated.for'} @:{'words.generated.yderligere'} assistance, @:{'words.generated.er'} @:{'words.generated.du'} @:{'words.generated.velkommen'} @:{'words.generated.til'} @:{'words.generated.at'} kontakte @:{'words.generated.vores'} personale.", "wash_completed_message": "@.capitalize:{'words.generated.din'} @:{'words.generated.vask'} @:{'words.generated.er'} @:{'words.generated.nu'} @:{'words.generated.færdig'}! @:{'words.generated.tak'} @:{'words.generated.fordi'} @:{'words.generated.du'} brugte @:{'words.generated.vores'} selvbetjeningsvask.", "wash_completed": "@.capitalize:{'words.generated.vask'} @:{'words.generated.færdig'}", diff --git a/src/i18n/generated/de-v2.json b/src/i18n/generated/de-v2.json index 43ace025..cce3e08d 100644 --- a/src/i18n/generated/de-v2.json +++ b/src/i18n/generated/de-v2.json @@ -4668,7 +4668,9 @@ "loading_department": "@:{'words.generated.abteilung'} @:{'words.generated.wird'} @:{'words.generated.geladen'}...", "loading_types": "@.capitalize:{'words.generated.typen'} @:{'words.generated.werden'} @:{'words.generated.geladen'}...", "loading_vehicle_types": "@.capitalize:{'words.generated.verf'}?@:{'words.generated.gbare'} @:{'words.generated.fahrzeugtypen'} @:{'words.generated.werden'} @:{'words.generated.geladen'}...", + "lane_unavailable": "Waschspur nicht verfugbar", "machine": "@:{'words.generated.maschine'}", + "machine_unavailable_for_lane": "Maschinenwasche ist fur die ausgewahlte Spur nicht verfugbar. Wahlen Sie manuelle Wasche oder eine andere freie Spur.", "no_departments_found": "@:{'templates.generated.compat.departments.no_departments'}", "occupied": "Belegt", "open_property_access_gate": "Grundstueckszugangstor @:{'words.generated.oeffnen'}", @@ -4684,6 +4686,10 @@ "start_wash": "@:{'templates.generated.compat.guest.start_wash'}", "total_time": "Gesamtzeit: {minutes} Minuten @:{'words.generated.und'} {seconds} @:{'words.generated.sekunden'}", "unavailable": "@.capitalize:{'words.generated.nicht'} @:{'words.generated.verfugbar'}", + "vehicle_step_missing_customer_number": "Geben Sie Ihre Kundennummer ein, um fortzufahren.", + "vehicle_step_missing_department": "Warten Sie, bis die nachste Abteilung geladen ist, bevor Sie fortfahren.", + "vehicle_step_missing_registration": "Geben Sie das Kennzeichen ein, um fortzufahren.", + "vehicle_step_missing_vehicle_type": "Wahlen Sie einen verfugbaren Fahrzeugtyp, um fortzufahren.", "wash_completed_contact": "@.capitalize:{'words.generated.wir'} hoffen, @.capitalize:{'words.generated.sie'} @:{'words.generated.sind'} @:{'words.generated.mit'} @:{'words.generated.dem'} @:{'words.generated.ergebnis'} zufrieden. @.capitalize:{'words.generated.wenn'} @.capitalize:{'words.generated.sie'} @:{'words.generated.weitere'} @:{'words.generated.hilfe'} @:{'words.generated.ben'}?@:{'words.generated.tigen'}, @:{'words.generated.kontaktieren'} @.capitalize:{'words.generated.sie'} @:{'words.generated.bitte'} @:{'words.generated.unser'} Personal.", "wash_completed_message": "@.capitalize:{'words.generated.ihre'} @.upper:{'words.generated.w'}?@:{'words.generated.sche'} @:{'words.generated.ist'} @:{'words.generated.jetzt'} @:{'words.generated.abgeschlossen'}! @:{'words.generated.danke'}, @:{'words.generated.dass'} @.capitalize:{'words.generated.sie'} @:{'words.generated.unsere'} Selbstbedienungsw?@:{'words.generated.sche'} genutzt @:{'words.generated.haben'}.", "wash_completed": "@.upper:{'words.generated.w'}?@:{'words.generated.sche'} @:{'words.generated.abgeschlossen'}", diff --git a/src/i18n/generated/en-v2.json b/src/i18n/generated/en-v2.json index 8bece67a..bbbd6846 100644 --- a/src/i18n/generated/en-v2.json +++ b/src/i18n/generated/en-v2.json @@ -4409,7 +4409,9 @@ "loading_department": "@.capitalize:{'words.generated.loading'} @:{'words.generated.department'}...", "loading_types": "@.capitalize:{'words.generated.loading'} @:{'words.generated.types'}...", "loading_vehicle_types": "@.capitalize:{'words.generated.loading'} @:{'words.generated.available'} @:{'words.generated.vehicle'} @:{'words.generated.types'}...", + "lane_unavailable": "Lane unavailable", "machine": "@.capitalize:{'words.generated.machine'}", + "machine_unavailable_for_lane": "Machine wash is unavailable for the selected lane. Choose manual wash or another available lane.", "no_departments_found": "@:{'templates.generated.compat.departments.no_departments'}", "occupied": "Occupied", "open_property_access_gate": "@.capitalize:{'words.generated.open'} @:{'words.generated.property'} @:{'words.generated.access'} @:{'words.generated.gate'}", @@ -4425,6 +4427,10 @@ "start_wash": "@.capitalize:{'words.generated.start'} @:{'words.generated.wash'}", "total_time": "@.capitalize:{'words.generated.total'} @:{'words.generated.time'}: {minutes} @:{'words.generated.minutes'} @:{'words.generated.and'} {seconds} @:{'words.generated.seconds'}", "unavailable": "@.capitalize:{'words.generated.unavailable'}", + "vehicle_step_missing_customer_number": "Enter your customer number to continue.", + "vehicle_step_missing_department": "Wait for the nearest department to load before continuing.", + "vehicle_step_missing_registration": "Enter your registration number to continue.", + "vehicle_step_missing_vehicle_type": "Choose an available vehicle type to continue.", "wash_completed_contact": "@.capitalize:{'words.generated.we'} hope @:{'words.generated.you'} @:{'words.generated.are'} satisfied @:{'words.generated.with'} @:{'words.replication.article.host_mention'} @:{'words.generated.result'}. @.capitalize:{'words.generated.if'} @:{'words.generated.you'} @:{'words.generated.need'} @:{'words.generated.further'} @:{'words.generated.assistance'}, @:{'words.generated.please'} @:{'words.generated.contact'} @:{'words.generated.our'} staff.", "wash_completed_message": "@.capitalize:{'words.generated.your'} @:{'words.generated.wash'} @:{'words.generated.is'} @:{'words.generated.now'} @:{'words.generated.complete'}! @:{'words.generated.thank'} @:{'words.generated.you'} @:{'words.generated.for'} @:{'words.generated.using'} @:{'words.generated.our'} @:{'words.generated.self'}-@:{'words.generated.service'} @:{'words.generated.wash'}.", "wash_completed": "@.capitalize:{'words.generated.wash'} @:{'words.generated.completed'}", diff --git a/src/i18n/generated/global-v2.json b/src/i18n/generated/global-v2.json index 3d6ba5bb..c4019035 100644 --- a/src/i18n/generated/global-v2.json +++ b/src/i18n/generated/global-v2.json @@ -4188,7 +4188,9 @@ "loading_department": "@:{'templates.generated.compat.self_wash.loading_department'}", "loading_types": "@:{'templates.generated.compat.self_wash.loading_types'}", "loading_vehicle_types": "@:{'templates.generated.compat.self_wash.loading_vehicle_types'}", + "lane_unavailable": "@:{'templates.generated.compat.self_wash.lane_unavailable'}", "machine": "@:{'templates.generated.compat.self_wash.machine'}", + "machine_unavailable_for_lane": "@:{'templates.generated.compat.self_wash.machine_unavailable_for_lane'}", "no_departments_found": "@:{'templates.generated.compat.self_wash.no_departments_found'}", "no_vehicles_found": "@:vehicles.no_vehicles", "occupied": "@:{'templates.generated.compat.self_wash.occupied'}", @@ -4205,6 +4207,10 @@ "start_wash": "@:{'templates.generated.compat.self_wash.start_wash'}", "total_time": "@:{'templates.generated.compat.self_wash.total_time'}", "unavailable": "@:{'templates.generated.compat.self_wash.unavailable'}", + "vehicle_step_missing_customer_number": "@:{'templates.generated.compat.self_wash.vehicle_step_missing_customer_number'}", + "vehicle_step_missing_department": "@:{'templates.generated.compat.self_wash.vehicle_step_missing_department'}", + "vehicle_step_missing_registration": "@:{'templates.generated.compat.self_wash.vehicle_step_missing_registration'}", + "vehicle_step_missing_vehicle_type": "@:{'templates.generated.compat.self_wash.vehicle_step_missing_vehicle_type'}", "vehicle_type": "@:{'templates.generated.compat.products.form.vehicle_type'}", "vehicle": "@:common.vehicle", "wash_completed_contact": "@:{'templates.generated.compat.self_wash.wash_completed_contact'}", diff --git a/src/i18n/generated/no-v2.json b/src/i18n/generated/no-v2.json index dd502564..ac3a5c4c 100644 --- a/src/i18n/generated/no-v2.json +++ b/src/i18n/generated/no-v2.json @@ -4669,7 +4669,9 @@ "loading_department": "@.capitalize:{'words.generated.laster'} @:{'words.generated.avdelingen'}...", "loading_types": "@.capitalize:{'words.generated.laster'} @:{'words.generated.inn'} @:{'words.generated.typer'}...", "loading_vehicle_types": "@.capitalize:{'words.generated.laster'} @:{'words.generated.inn'} @:{'words.generated.tilgjengelige'} @:{'words.generated.kjøretøytyper'}...", + "lane_unavailable": "Vaskebanen er ikke tilgjengelig", "machine": "@.capitalize:{'words.generated.maskin'}", + "machine_unavailable_for_lane": "Maskinvask er ikke tilgjengelig for valgt bane. Velg manuell vask eller en annen ledig bane.", "no_departments_found": "@:{'templates.generated.compat.departments.no_departments'}", "occupied": "Okkupert", "open_property_access_gate": "@:{'words.generated.aapne'} @:{'words.generated.eiendommens'} inngangsport", @@ -4685,6 +4687,10 @@ "start_wash": "@:{'templates.generated.compat.guest.start_wash'}", "total_time": "@:{'words.generated.total'} @:{'words.generated.tid'}: {minutes} minutter @:{'words.generated.og'} {seconds} @:{'words.generated.sekunder'}", "unavailable": "@.capitalize:{'words.generated.utilgjengelig'}", + "vehicle_step_missing_customer_number": "Skriv inn kundenummer for a fortsette.", + "vehicle_step_missing_department": "Vent til naermeste avdeling er lastet inn for du fortsetter.", + "vehicle_step_missing_registration": "Skriv inn registreringsnummer for a fortsette.", + "vehicle_step_missing_vehicle_type": "Velg en tilgjengelig kjoretoytype for a fortsette.", "wash_completed_contact": "@.capitalize:{'words.generated.vi'} håper @:{'words.generated.du'} @:{'words.generated.er'} fornøyd @:{'words.generated.med'} resultatet. @.capitalize:{'words.generated.hvis'} @:{'words.generated.du'} @:{'words.generated.trenger'} @:{'words.generated.ytterligere'} @:{'words.generated.hjelp'}, @:{'words.generated.vennligst'} @:{'words.generated.kontakt'} @:{'words.generated.vare'} @:{'words.generated.ansatte'}.", "wash_completed_message": "@.capitalize:{'words.generated.vasken'} @:{'words.generated.din'} @:{'words.generated.er'} @:{'words.generated.na'} @:{'words.generated.fullført'}! @:{'words.generated.takk'} @:{'words.generated.for'} @:{'words.generated.at'} @:{'words.generated.du'} @:{'words.generated.bruker'} @:{'words.generated.var_2'} @:{'words.generated.selvbetjente'} @:{'words.generated.vask'}.", "wash_completed": "@:{'words.generated.vasking'} @:{'words.generated.fullført'}", diff --git a/src/i18n/generated/sv-v2.json b/src/i18n/generated/sv-v2.json index dde093b0..d501d056 100644 --- a/src/i18n/generated/sv-v2.json +++ b/src/i18n/generated/sv-v2.json @@ -4719,7 +4719,9 @@ "loading_department": "@.capitalize:{'words.generated.laser'} @:{'words.generated.in'} @:{'words.generated.avdelning'}...", "loading_types": "@:{'words.generated.laddar'} @:{'words.generated.typer'}...", "loading_vehicle_types": "@.capitalize:{'words.generated.laser'} @:{'words.generated.in'} @:{'words.generated.tillgangliga'} @:{'words.generated.fordonstyper'}...", + "lane_unavailable": "Tvattbanan ar inte tillganglig", "machine": "@.capitalize:{'words.generated.machine'}", + "machine_unavailable_for_lane": "Maskintvatt ar inte tillganglig for vald bana. Valj manuell tvatt eller en annan ledig bana.", "no_departments_found": "@.capitalize:{'words.generated.inga'} @:{'words.generated.avdelningar'} @:{'words.generated.hittades'}", "occupied": "Upptagen", "open_property_access_gate": "@:{'words.generated.oeppna'} @:{'words.generated.fastighetens'} ingangsgrind", @@ -4735,6 +4737,10 @@ "start_wash": "@.capitalize:{'words.generated.start'} @:{'words.generated.wash'}", "total_time": "@.capitalize:{'words.generated.total'} @:{'words.generated.tid'}: {minutes} minuter @:{'words.generated.och'} {seconds} @:{'words.generated.sekunder'}", "unavailable": "@:{'templates.generated.compat.common.not_available'}", + "vehicle_step_missing_customer_number": "Ange kundnummer for att fortsatta.", + "vehicle_step_missing_department": "Vanta tills narmaste avdelning har laddats innan du fortsatter.", + "vehicle_step_missing_registration": "Ange registreringsnummer for att fortsatta.", + "vehicle_step_missing_vehicle_type": "Valj en tillganglig fordonstyp for att fortsatta.", "wash_completed_contact": "@.capitalize:{'words.generated.vi'} hoppas @:{'words.generated.att'} @:{'words.generated.du'} @:{'words.generated.ar'} nöjd @:{'words.generated.med'} resultatet. @.capitalize:{'words.generated.om'} @:{'words.generated.du'} @:{'words.generated.behover'} @:{'words.generated.ytterligare'} @:{'words.generated.hjalp'}, @:{'words.generated.kontakta'} @:{'words.generated.var_2'} personal.", "wash_completed_message": "@.capitalize:{'words.generated.din'} @:{'words.generated.tvatt'} @:{'words.generated.ar'} @:{'words.generated.nu'} @:{'words.generated.klar'}! @:{'words.generated.tack'} @:{'words.generated.for'} @:{'words.generated.att'} @:{'words.generated.du'} @:{'words.generated.anvander'} @:{'words.generated.var_2'} självbetjäningstvätt.", "wash_completed": "@.capitalize:{'words.generated.tvatt'} @:{'words.generated.slutford'}", diff --git a/tests/e2e/self-serve-wash.spec.js b/tests/e2e/self-serve-wash.spec.js index 01860cd6..e729096a 100644 --- a/tests/e2e/self-serve-wash.spec.js +++ b/tests/e2e/self-serve-wash.spec.js @@ -367,6 +367,52 @@ test.describe("Self-serve wash", () => { await expect(page.getByTestId("self-serve-department-name")).toContainText("Roskilde"); }); + test("start route skips an empty question set and waits for lane confirmation", async ({ page }) => { + const requests = captureSelfServeGatewayRequests(page); + const api = await mockApi(page, { + authenticated: true, + permissions: ["user"], + selfServe: true, + }); + api.selfServe.previewByKey["7:AB12345"] = { + ...api.selfServe.previewByKey["7:AB12345"], + questions: [], + tasks: [], + }; + api.selfServe.summaryBySessionId[501] = { + ...api.selfServe.summaryBySessionId[501], + questions: [], + tasks: [], + }; + api.selfServe.summaryByKey["7:AB12345"] = { + ...api.selfServe.summaryByKey["7:AB12345"], + questions: [], + tasks: [], + }; + await primeSession(page, { + token: "self-serve-empty-questions-token", + permissions: ["user"], + }); + + await page.goto("/user/wash/start"); + await fillRegistration(page, "ab12345"); + await selectVehicleType(page, 2); + await page.getByTestId("self-serve-nav-next").click(); + + await expect(page.getByTestId("self-serve-lane-step")).toBeVisible({ timeout: 10_000 }); + await expect(page.getByTestId("self-serve-question-11")).toHaveCount(0); + await expect(page.getByTestId("self-serve-nav-confirm")).toContainText(/start/i); + expect(requests.commands).toHaveLength(0); + + const startCommandRequestPromise = waitForLaneCommandRequest(page, "START"); + await page.getByTestId("self-serve-nav-confirm").click(); + const startCommandRequest = await startCommandRequestPromise; + expect(startCommandRequest.postDataJSON?.()).toMatchObject({ + lane_id: 7, + command: "START", + }); + }); + test("lane flow gates invalid lanes, direct wash path auto-starts, and expired progress is discarded", async ({ page, }) => {