test(sveta): Write e2e tests for the iOS app badges
Outcome: done Changed: tests/e2e/iosapp.py:1-94 (new file) Verified by: python -m pytest tests/e2e/iosapp.py -q -> 5 passed (3 consecutive clean runs, incl. verify()); full make test -> 3348 passed, 1 skipped, 11 failed (9 tests/api/projects/workspace.py FileNotFoundError 'docker' = missing docker binary in container, pre-existing per sibling run; 1 tests/e2e/game/farm.py steal flake, passes standalone; 1 was this file's pre-fix settings-propagation race, fixed) Findings: tests/e2e/iosapp.py locks the badge behaviour: footer badge visible on landing (.landing-footer) and /feed (.site-footer), guest topnav badge next to Login/Sign Up, mobile-panel badge after opening the hamburger, every href equals the configured ios_app_url with target=_blank rel=noopener noreferrer, and all badges disappear when ios_app_url is cleared (restored in try/finally). Settings-flip e2e tests must sleep CACHE_VERSION_PROPAGATION_SECONDS (1.5s) after set_setting before navigating: the server caches the cache_state version for 1s (core.py:56), and the first iosapp run hit that race (badge absent on a stale render). On a fresh DB the operational_defaults block incl. ios_app_url is never seeded because it is gated on the pre-init db.tables snapshot (schema.py:34 vs :1705), so the badge renders only after an admin sets ios_app_url. Open: re-run make test on a docker-capable host to clear the 9 workspace.py environment failures; decide the fresh-DB ios_app_url seeding gap (PM/implementation node); farm s Typosaurus-Run: 2910ed1ba2604be09c649141af1baf44 Typosaurus-Node: e8e69f65a5fa40c2bf6a8b0206cfb2d4 Typosaurus-Agent: @sveta Refs: #169
This commit is contained in:
parent
15f04e0d13
commit
c9802440d7
93
tests/e2e/iosapp.py
Normal file
93
tests/e2e/iosapp.py
Normal file
@ -0,0 +1,93 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
import time
|
||||
|
||||
from devplacepy.database import get_setting, set_setting
|
||||
from tests.conftest import BASE_URL, CACHE_VERSION_PROPAGATION_SECONDS
|
||||
|
||||
IOS_SETTING = "ios_app_url"
|
||||
IOS_APP_URL = "https://apps.apple.com/app/devplace/id6797215143"
|
||||
LANDING_FOOTER_BADGE = ".landing-footer .app-store-link"
|
||||
SITE_FOOTER_BADGE = ".site-footer .app-store-link"
|
||||
NAV_BADGE = ".topnav-right .app-store-nav-link"
|
||||
MOBILE_BADGE = ".topnav-mobile-panel .app-store-mobile-link"
|
||||
|
||||
|
||||
def _configure():
|
||||
original = get_setting(IOS_SETTING, "")
|
||||
set_setting(IOS_SETTING, IOS_APP_URL)
|
||||
time.sleep(CACHE_VERSION_PROPAGATION_SECONDS)
|
||||
return original
|
||||
|
||||
|
||||
def _assert_badge(badge):
|
||||
badge.wait_for(state="visible")
|
||||
assert badge.get_attribute("href") == IOS_APP_URL
|
||||
assert badge.get_attribute("target") == "_blank"
|
||||
assert badge.get_attribute("rel") == "noopener noreferrer"
|
||||
|
||||
|
||||
def test_footer_app_store_badge_on_landing_page(page, app_server):
|
||||
original = _configure()
|
||||
try:
|
||||
page.goto(f"{BASE_URL}/", wait_until="domcontentloaded")
|
||||
_assert_badge(page.locator(LANDING_FOOTER_BADGE))
|
||||
finally:
|
||||
set_setting(IOS_SETTING, original)
|
||||
|
||||
|
||||
def test_footer_app_store_badge_on_regular_page(page, app_server):
|
||||
original = _configure()
|
||||
try:
|
||||
page.goto(f"{BASE_URL}/feed", wait_until="domcontentloaded")
|
||||
_assert_badge(page.locator(SITE_FOOTER_BADGE))
|
||||
finally:
|
||||
set_setting(IOS_SETTING, original)
|
||||
|
||||
|
||||
def test_topnav_app_store_badge_next_to_login_signup(page, app_server):
|
||||
original = _configure()
|
||||
try:
|
||||
page.goto(f"{BASE_URL}/", wait_until="domcontentloaded")
|
||||
_assert_badge(page.locator(NAV_BADGE))
|
||||
assert page.locator(".topnav-right a[href='/auth/login']").is_visible()
|
||||
assert page.locator(".topnav-right a[href='/auth/signup']").is_visible()
|
||||
finally:
|
||||
set_setting(IOS_SETTING, original)
|
||||
|
||||
|
||||
def test_mobile_menu_app_store_badge(page, app_server):
|
||||
original = _configure()
|
||||
try:
|
||||
page.set_viewport_size({"width": 390, "height": 844})
|
||||
page.goto(f"{BASE_URL}/", wait_until="domcontentloaded")
|
||||
hamburger = page.locator("#hamburger-btn")
|
||||
hamburger.wait_for(state="visible")
|
||||
hamburger.click()
|
||||
page.locator("#mobile-panel.open").wait_for(state="visible")
|
||||
_assert_badge(page.locator(MOBILE_BADGE))
|
||||
finally:
|
||||
set_setting(IOS_SETTING, original)
|
||||
|
||||
|
||||
def test_badges_hide_when_ios_app_url_is_cleared(page, app_server):
|
||||
original = _configure()
|
||||
try:
|
||||
page.goto(f"{BASE_URL}/", wait_until="domcontentloaded")
|
||||
assert page.locator(LANDING_FOOTER_BADGE).count() == 1
|
||||
set_setting(IOS_SETTING, "")
|
||||
time.sleep(CACHE_VERSION_PROPAGATION_SECONDS)
|
||||
page.goto(f"{BASE_URL}/", wait_until="domcontentloaded")
|
||||
assert page.locator(LANDING_FOOTER_BADGE).count() == 0
|
||||
assert page.locator(NAV_BADGE).count() == 0
|
||||
assert page.locator(MOBILE_BADGE).count() == 0
|
||||
page.goto(f"{BASE_URL}/feed", wait_until="domcontentloaded")
|
||||
assert page.locator(SITE_FOOTER_BADGE).count() == 0
|
||||
finally:
|
||||
set_setting(IOS_SETTING, original)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user