"""UIE-01: E2E test for printer edit modal — open, pre-fill, submit, list update.""" from __future__ import annotations import pytest # The Edit button's label goes through the i18n store, which follows # navigator.language — on a French-locale machine it reads "Modifier", so a # has-text('Edit') locator only ever matched on English hosts. Target the # showModal() hook instead: it is the same in every language. # showModal(), not just edit-modal: the dialog's own close buttons reference # the same element id via .close(). EDIT_BUTTON = "button[onclick*='showModal']" def test_printer_edit_modal_open_and_prefill(page, live_server: str, _e2e_owner_key: str) -> None: """Edit button opens modal with printer's current name pre-filled.""" import httpx from imptune.services.session import COOKIE_NAME # Create a printer via API, under the same owner the page's cookie is seeded with with httpx.Client( base_url=live_server, follow_redirects=True, cookies={COOKIE_NAME: _e2e_owner_key} ) as api: api.post( "/printers", data={ "name": "EditTest Printer", "ip_address": "10.0.5.1", "port_name": "IP_10_0_5_1", }, ) page.goto(f"{live_server}/printers", wait_until="domcontentloaded") page.wait_for_selector(EDIT_BUTTON) page.click(EDIT_BUTTON) # Dialog should be open page.wait_for_selector("dialog[open]") # Name input should be pre-filled name_val = page.input_value("dialog[open] input[name='name']") assert name_val == "EditTest Printer" def test_printer_edit_submit_updates_list(page, live_server: str, _e2e_owner_key: str) -> None: """Submitting the edit form updates the printer name in the list (no page reload).""" import httpx from imptune.services.session import COOKIE_NAME with httpx.Client( base_url=live_server, follow_redirects=True, cookies={COOKIE_NAME: _e2e_owner_key} ) as api: resp = api.post( "/printers", data={ "name": "OriginalName", "ip_address": "10.0.5.2", "port_name": "IP_10_0_5_2", }, ) # Find the printer ID from the DB via API — target the specific Edit button by printer ID page.goto(f"{live_server}/printers", wait_until="domcontentloaded") # Find the row containing "OriginalName" and click its Edit button row = page.locator("tr", has=page.locator("a", has_text="OriginalName")) row.wait_for() row.locator(EDIT_BUTTON).click() page.wait_for_selector("dialog[open]") # Clear and update the name field page.fill("dialog[open] input[name='name']", "UpdatedName") page.click("dialog[open] button[type='submit']") # Wait for HTMX to swap the updated list — the anchor for the printer should show new name page.wait_for_selector("a:has-text('UpdatedName')") assert page.locator("a:has-text('UpdatedName')").is_visible() assert page.locator("a:has-text('OriginalName')").count() == 0