Compare commits

..

7 commits

Author SHA1 Message Date
5ba3f00157
test(form): stub admin lookup in browser tests 2026-07-30 20:29:43 -04:00
91286fc922
fix(form): guard stale admin edit responses 2026-07-30 20:27:19 -04:00
e60b8e26dd fix(form): address review findings 2026-07-30 20:25:37 -04:00
dea398626f test(form): cover sticky footer at narrow widths 2026-07-30 20:25:37 -04:00
0b60d4db55
fix(tests): restore class fixture discovery 2026-07-30 20:22:48 -04:00
Adam Moussa
bb1107ad7f
fix: add @classmethod and use cls in tests/test_generate_form.py
Co-authored-by: seahaven-openswe[bot] <296972425+seahaven-openswe[bot]@users.noreply.github.com>
2026-07-30 20:12:56 -04:00
2df66fd36f
test(form): strengthen phone-width coverage 2026-07-30 19:49:47 -04:00
2 changed files with 51 additions and 7 deletions

View file

@ -332,13 +332,15 @@ function downloadSummaryPdf() {
}
function adminStartEdit(email) {
const requestedWeek = currentAdminWeek;
setAdminActionDisabled('start-edit', true);
adminFetch(ADMIN_URL + '?week=' + encodeURIComponent(currentAdminWeek), { headers: adminHeaders() })
adminFetch(ADMIN_URL + '?week=' + encodeURIComponent(requestedWeek), { headers: adminHeaders() })
.then(r => {
if (!r.ok) throw new Error('HTTP ' + r.status);
return r.json();
})
.then(data => {
if (currentAdminWeek !== requestedWeek) return;
lastAdminData = data;
const order = data.orders.find(o => o.employee_email === email);
if (!order) return;

View file

@ -70,8 +70,8 @@ def _render(*, google: bool = False, api_key: str = "test-key") -> str:
def _google_credential() -> str:
payload = json.dumps(
{
"name": "Adam Moussa",
"email": "adam.moussa@seahavenind.com",
"name": "Test Admin",
"email": "test-admin@example.com",
"picture": (
"data:image/svg+xml,"
"<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'/>"
@ -101,6 +101,14 @@ def _mock_form_routes(page):
),
),
)
page.route(
"**/api/admin/orders",
lambda route: route.fulfill(
status=403,
content_type="application/json",
body='{"error":"Forbidden"}',
),
)
class TestGenerateFormStructural:
@ -357,10 +365,15 @@ class TestGenerateFormPlaywright:
bottom: box.bottom,
};
};
const footer = document.querySelector('#sticky-footer');
return {
clientWidth: document.documentElement.clientWidth,
scrollWidth: document.documentElement.scrollWidth,
footer: rect('#sticky-footer'),
viewportHeight: window.innerHeight,
footer: {
...rect('#sticky-footer'),
position: getComputedStyle(footer).position,
},
total: rect('#total-display'),
count: rect('#count-display'),
submit: rect('#submit-btn'),
@ -373,6 +386,9 @@ class TestGenerateFormPlaywright:
for selector in ("footer", "total", "count", "submit"):
assert layout[selector]["left"] >= 0
assert layout[selector]["right"] <= layout["clientWidth"]
assert layout["footer"]["position"] == "fixed"
assert layout["footer"]["top"] >= 0
assert layout["footer"]["bottom"] <= layout["viewportHeight"]
assert layout["lastCard"]["bottom"] <= layout["footer"]["top"]
finally:
browser.close()
@ -431,7 +447,7 @@ class TestGenerateFormPlaywright:
)
assert page.locator("#total-display").inner_text() == "$10.80"
@pytest.mark.parametrize("width", [320, 375])
@pytest.mark.parametrize("width", [320, 375, 479])
def test_local_roster_has_no_horizontal_overflow(self, browser_page, width):
page = browser_page
page.set_viewport_size({"width": width, "height": 800})
@ -446,7 +462,8 @@ class TestGenerateFormPlaywright:
class TestGenerateFormGooglePlaywright:
@pytest.fixture(scope="class")
def signed_in_admin_page(self, tmp_path_factory):
@classmethod
def signed_in_admin_page(cls, tmp_path_factory):
try:
from playwright.sync_api import sync_playwright
except ImportError as exc: # pragma: no cover
@ -528,7 +545,32 @@ class TestGenerateFormGooglePlaywright:
"#admin-btn",
"#sign-out-btn",
):
assert page.locator(selector).is_visible()
locator = page.locator(selector)
assert locator.is_visible()
bounds = locator.evaluate(
"""element => {
const rect = element.getBoundingClientRect();
return {
left: rect.left,
top: rect.top,
right: rect.right,
bottom: rect.bottom,
viewportWidth: window.innerWidth,
viewportHeight: window.innerHeight,
};
}"""
)
assert bounds["left"] >= 0
assert bounds["top"] >= 0
assert bounds["right"] <= bounds["viewportWidth"]
assert bounds["bottom"] <= bounds["viewportHeight"]
for selector in ("#user-name", "#user-email"):
assert page.locator(selector).evaluate(
"""element =>
element.scrollWidth <= element.clientWidth &&
element.scrollHeight <= element.clientHeight"""
)
assert page.locator("#admin-btn").is_enabled()
assert page.locator("#sign-out-btn").is_enabled()