From a69e6d0a7c2afbb8263a9d1b2c97ae8cc219e62c Mon Sep 17 00:00:00 2001 From: Adam Moussa <166072409+amoussa1229@users.noreply.github.com> Date: Mon, 3 Aug 2026 16:19:46 -0400 Subject: [PATCH] fix(form): restore description toggles after sign-in (#107) * fix(form): restore description toggles after sign-in * fix(form): reset expanded descriptions on re-auth --- src/server/templates/form.js | 8 +++ tests/test_generate_form.py | 97 ++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) diff --git a/src/server/templates/form.js b/src/server/templates/form.js index e05e700..f785e01 100644 --- a/src/server/templates/form.js +++ b/src/server/templates/form.js @@ -124,6 +124,7 @@ function handleCredentialResponse(response) { document.getElementById("app").classList.remove("is-hidden"); const footer = document.getElementById("sticky-footer"); if (footer) footer.classList.remove("is-hidden"); + refreshAllDescToggles(); document.getElementById("user-name").textContent = payload.name; document.getElementById("user-email").textContent = payload.email; if (payload.picture) { @@ -266,6 +267,13 @@ function scheduleDescToggle(card) { }); } +function refreshAllDescToggles() { + document.querySelectorAll("#meals-list [data-meal-index]").forEach((card) => { + card.querySelector(".meal-desc")?.classList.remove("is-expanded"); + scheduleDescToggle(card); + }); +} + function updateMealCard(card, meal, i) { const qty = quantities[i] || 0; card.dataset.mealIndex = String(i); diff --git a/tests/test_generate_form.py b/tests/test_generate_form.py index dd07dce..9c6d49b 100644 --- a/tests/test_generate_form.py +++ b/tests/test_generate_form.py @@ -927,6 +927,103 @@ class TestGenerateFormPlaywright: class TestGenerateFormGooglePlaywright: + def test_desc_toggle_attaches_after_auth_reveal(self, tmp_path): + sync_api = pytest.importorskip("playwright.sync_api") + sync_playwright = sync_api.sync_playwright + + out = tmp_path / "google-order-form.html" + out.write_text(_render_for_browser(google=True)) + + with sync_playwright() as p: + try: + browser = p.chromium.launch(headless=True) + except Exception as exc: + raise RuntimeError( + "Chromium is required for form Playwright tests. " + "Run: playwright install --with-deps chromium" + ) from exc + try: + page = browser.new_page() + page.add_init_script( + """window.google = { + accounts: { + id: { + initialize() {}, + renderButton() {}, + disableAutoSelect() {}, + }, + }, + };""" + ) + page.route( + "https://accounts.google.com/gsi/client", + lambda route: route.abort(), + ) + _mock_form_routes(page) + page.goto(out.as_uri(), wait_until="domcontentloaded") + + short_card = page.locator('[data-meal-index="0"]') + long_card = page.locator('[data-meal-index="1"]') + long_card.wait_for(state="attached") + page.evaluate( + """() => new Promise((resolve) => { + requestAnimationFrame(() => requestAnimationFrame(resolve)); + })""" + ) + assert "is-hidden" in ( + page.locator("#app").get_attribute("class") or "" + ) + assert long_card.locator(".meal-desc-toggle").count() == 0 + + page.evaluate( + "(credential) => handleCredentialResponse({ credential })", + _google_credential(), + ) + toggle = long_card.locator(".meal-desc-toggle") + toggle.wait_for(state="visible") + + assert short_card.locator(".meal-desc-toggle").count() == 0 + assert toggle.inner_text() == "More" + assert toggle.get_attribute("aria-expanded") == "false" + toggle.click() + assert toggle.inner_text() == "Less" + assert toggle.get_attribute("aria-expanded") == "true" + assert "is-expanded" in ( + long_card.locator(".meal-desc").get_attribute("class") or "" + ) + + page.evaluate("signOut()") + assert "is-hidden" in ( + page.locator("#app").get_attribute("class") or "" + ) + page.evaluate( + "(credential) => handleCredentialResponse({ credential })", + _google_credential(), + ) + page.wait_for_function( + """() => { + const card = document.querySelector('[data-meal-index="1"]'); + const desc = card?.querySelector('.meal-desc'); + const toggle = card?.querySelector('.meal-desc-toggle'); + return !desc?.classList.contains('is-expanded') + && toggle?.textContent === 'More' + && toggle?.getAttribute('aria-expanded') === 'false'; + }""" + ) + + toggle = long_card.locator(".meal-desc-toggle") + toggle.click() + assert toggle.inner_text() == "Less" + assert toggle.get_attribute("aria-expanded") == "true" + toggle.click() + assert toggle.inner_text() == "More" + assert toggle.get_attribute("aria-expanded") == "false" + assert "is-expanded" not in ( + long_card.locator(".meal-desc").get_attribute("class") or "" + ) + finally: + browser.close() + @pytest.fixture(scope="class") @classmethod def signed_in_admin_page(cls, tmp_path_factory):