From 31c5329d4da0ad3b40677daa899ee969ba01e02d Mon Sep 17 00:00:00 2001 From: phanirithvij Date: Sat, 18 Apr 2026 19:54:02 +0530 Subject: [PATCH] nixosTests.goupile: fix nixos test - account for the new __hid column introduced in the new version - fix flakiness of the test - capture traces in the test output Signed-off-by: phanirithvij --- .../goupile/basic_interaction_test.py | 55 ++++++++++++------- nixos/tests/web-apps/goupile/default.nix | 8 ++- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/nixos/tests/web-apps/goupile/basic_interaction_test.py b/nixos/tests/web-apps/goupile/basic_interaction_test.py index 46b0f78903fc..efb9cd7c1e87 100644 --- a/nixos/tests/web-apps/goupile/basic_interaction_test.py +++ b/nixos/tests/web-apps/goupile/basic_interaction_test.py @@ -1,7 +1,7 @@ import os import openpyxl import tempfile -from playwright.sync_api import sync_playwright +from playwright.sync_api import sync_playwright, Page BASE_URL = "http://localhost:8889" @@ -10,6 +10,15 @@ ADMIN_PASSWD = "car-shop-in-the-mall" ALICE_PASSWD = "user-goes-to-the-car-shop" +def click_save_and_wait(page: Page): + save_btn = page.get_by_role("button", name="Save") + with page.expect_response( + lambda r: r.request.method in ["POST", "PUT", "PATCH"] and r.status < 400 + ): + save_btn.click() + page.wait_for_selector(".ui_busy", state="hidden", timeout=30000) + + def run_test(): is_headful = os.getenv("HEADFUL") == "1" @@ -20,6 +29,8 @@ def run_test(): ) # more default timeout for slow nixos test vms context.set_default_timeout(90 * 1000) + context.tracing.start(screenshots=True, snapshots=True, sources=True) + page = context.new_page() page.goto(f"{BASE_URL}/admin") @@ -48,10 +59,17 @@ def run_test(): page.get_by_role("button", name="No", exact=True).click() page.get_by_role("textbox", name="Password *").fill(ALICE_PASSWD) page.get_by_role("textbox", name="Confirmation").fill(ALICE_PASSWD) - page.get_by_role("button", name="Create").click() + + with page.expect_response( + lambda r: r.request.method == "POST" and r.status < 400 + ): + page.get_by_role("button", name="Create").click() # give alice, permissions to access the project - page.get_by_role("button", name="Assign").nth(1).click() + assign_button = page.get_by_role("button", name="Assign").nth(1) + assign_button.wait_for(state="visible") + assign_button.click() + page.get_by_text("Read", exact=True).click() page.get_by_text("Save", exact=True).click() page.get_by_text("Export", exact=True).click() @@ -71,25 +89,23 @@ def run_test(): page1.get_by_role("textbox", name="Inclusion date *").fill("2000-01-01") page1.get_by_role("spinbutton", name="Age *").click() page1.get_by_role("spinbutton", name="Age *").fill("1") - page1.get_by_role("button", name="Save").click() - page1.wait_for_timeout(1000) + click_save_and_wait(page1) page1.get_by_role("button", name="Advanced").click() page1.get_by_role("spinbutton", name="Age *").click() page1.get_by_role("spinbutton", name="Age *").fill("1") - page1.get_by_role("button", name="Save").click() - page1.wait_for_timeout(1000) + click_save_and_wait(page1) page1.get_by_role("button", name="Page layout").click() page1.get_by_role("spinbutton", name="Variable A1").fill("1") - page1.get_by_role("button", name="Save").click() - page1.wait_for_timeout(1000) + click_save_and_wait(page1) # create export #1 page1.get_by_role("button", name="Data").click() - page1.wait_for_timeout(1000) + page1.get_by_role("button", name="Data exports").wait_for(state="visible") page1.get_by_role("button", name="Data exports").click() + with page1.expect_download() as download_info: page1.get_by_role("button", name="Create export").click() @@ -115,26 +131,24 @@ def run_test(): page2.get_by_role("textbox", name="Inclusion date *").fill("2000-01-01") page2.get_by_role("spinbutton", name="Age *").click() page2.get_by_role("spinbutton", name="Age *").fill("2") - page2.get_by_role("button", name="Save").click() - page2.wait_for_timeout(1000) + click_save_and_wait(page2) page2.get_by_role("button", name="Advanced").click() page2.get_by_role("spinbutton", name="Age *").click() page2.get_by_role("spinbutton", name="Age *").fill("2") - page2.get_by_role("button", name="Save").click() - page2.wait_for_timeout(1000) + click_save_and_wait(page2) page2.get_by_role("button", name="Page layout").click() page2.get_by_role("spinbutton", name="Variable A1").click() page2.get_by_role("spinbutton", name="Variable A1").fill("2") - page2.get_by_role("button", name="Save").click() - page2.wait_for_timeout(1000) + click_save_and_wait(page2) # create export #2 page2.get_by_role("button", name="Data").click() - page2.wait_for_timeout(1000) + page2.get_by_role("button", name="Data exports").wait_for(state="visible") page2.get_by_role("button", name="Data exports").click() + page2.get_by_role("button", name="Previous exports").click() with page2.expect_download() as download1_info: @@ -156,18 +170,19 @@ def run_test(): print(f"exported all records to {save_path2}") + context.tracing.stop(path="/tmp/videos/trace.zip") + context.close() browser.close() # check that exported files have correct entries - wb1 = openpyxl.load_workbook(save_path1) - for sheet, cell in zip(["intro", "advanced", "layout"], ["D2", "D2", "C2"]): + for sheet, cell in zip(["intro", "advanced", "layout"], ["E2", "E2", "D2"]): val = wb1[sheet][cell].value assert val == 1, f"Sheet {sheet}, Cell {cell}: Expected 1 (admin), got {val}" wb2 = openpyxl.load_workbook(save_path2) - for sheet, cell in zip(["intro", "advanced", "layout"], ["D3", "D3", "C3"]): + for sheet, cell in zip(["intro", "advanced", "layout"], ["E3", "E3", "D3"]): val = wb2[sheet][cell].value assert val == 2, f"Sheet {sheet}, Cell {cell}: Expected 2 (alice), got {val}" diff --git a/nixos/tests/web-apps/goupile/default.nix b/nixos/tests/web-apps/goupile/default.nix index 06c5ea9dc535..54246b01e6a7 100644 --- a/nixos/tests/web-apps/goupile/default.nix +++ b/nixos/tests/web-apps/goupile/default.nix @@ -110,9 +110,11 @@ in machine.succeed("curl -q http://machine.local") machine.succeed("curl -q http://localhost") - machine.succeed("run-goupile-test") - out_dir = os.environ.get("out", os.getcwd()) - machine.copy_from_machine("/tmp/videos", out_dir) + try: + machine.succeed("run-goupile-test") + finally: + out_dir = os.environ.get("out", os.getcwd()) + machine.copy_from_vm("/tmp/videos", out_dir) ''; # Debug interactively with: