Playwright logout test: dialog handler + wait_for_url for async flow
|
After Width: | Height: | Size: 294 KiB |
|
After Width: | Height: | Size: 213 KiB |
|
After Width: | Height: | Size: 213 KiB |
|
After Width: | Height: | Size: 213 KiB |
|
After Width: | Height: | Size: 365 KiB |
|
After Width: | Height: | Size: 716 KiB |
|
After Width: | Height: | Size: 343 KiB |
|
After Width: | Height: | Size: 291 KiB |
|
After Width: | Height: | Size: 348 KiB |
@@ -0,0 +1,66 @@
|
|||||||
|
{
|
||||||
|
"tests": [
|
||||||
|
{
|
||||||
|
"name": "Login page loads",
|
||||||
|
"status": "PASS"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Login persists JWT",
|
||||||
|
"status": "PASS",
|
||||||
|
"url": "https://sport.rinet.one/app",
|
||||||
|
"token_len": 519
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Profile section accessible",
|
||||||
|
"status": "PASS"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PGŽ logo clickable",
|
||||||
|
"status": "PASS",
|
||||||
|
"href": "/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Logout clears tokens",
|
||||||
|
"status": "PASS"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Mobile login renders",
|
||||||
|
"status": "PASS",
|
||||||
|
"viewport": "width=device-width,initial-scale=1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Mobile login → app",
|
||||||
|
"status": "PASS"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Mobile hamburger button",
|
||||||
|
"status": "PASS",
|
||||||
|
"visible": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Mobile sidebar opens",
|
||||||
|
"status": "PASS"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Mobile homepage no horizontal scroll",
|
||||||
|
"status": "PASS",
|
||||||
|
"body_w": 375,
|
||||||
|
"viewport": 375
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"screenshots": [
|
||||||
|
"/opt/pgz-sport/_audit/playwright_20260505_0924/01_login_page.png",
|
||||||
|
"/opt/pgz-sport/_audit/playwright_20260505_0924/02_post_login.png",
|
||||||
|
"/opt/pgz-sport/_audit/playwright_20260505_0924/03_app_dashboard.png",
|
||||||
|
"/opt/pgz-sport/_audit/playwright_20260505_0924/04_profile_view.png",
|
||||||
|
"/opt/pgz-sport/_audit/playwright_20260505_0924/05_post_logout.png",
|
||||||
|
"/opt/pgz-sport/_audit/playwright_20260505_0924/m01_mobile_login.png",
|
||||||
|
"/opt/pgz-sport/_audit/playwright_20260505_0924/m02_mobile_app.png",
|
||||||
|
"/opt/pgz-sport/_audit/playwright_20260505_0924/m03_mobile_sidebar_open.png",
|
||||||
|
"/opt/pgz-sport/_audit/playwright_20260505_0924/m04_mobile_sport2_homepage.png"
|
||||||
|
],
|
||||||
|
"summary": {
|
||||||
|
"passed": 10,
|
||||||
|
"failed": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -120,6 +120,8 @@ def test_desktop(pw):
|
|||||||
|
|
||||||
# 5. Logout
|
# 5. Logout
|
||||||
try:
|
try:
|
||||||
|
# Register confirm() handler — auto-accept
|
||||||
|
page.on('dialog', lambda d: d.accept())
|
||||||
# Click the logout button (⎋ icon)
|
# Click the logout button (⎋ icon)
|
||||||
# Find a visible logout element across all known selectors
|
# Find a visible logout element across all known selectors
|
||||||
logout_btn = None
|
logout_btn = None
|
||||||
@@ -139,7 +141,10 @@ def test_desktop(pw):
|
|||||||
}""")
|
}""")
|
||||||
if res:
|
if res:
|
||||||
print(f' [debug] logout invoked via JS: {res}')
|
print(f' [debug] logout invoked via JS: {res}')
|
||||||
time.sleep(2)
|
# Wait for async logout (POST /auth/logout + clear + redirect)
|
||||||
|
try: page.wait_for_url('**/login**', timeout=10000)
|
||||||
|
except: pass
|
||||||
|
time.sleep(1)
|
||||||
logout_btn = 'js' # sentinel
|
logout_btn = 'js' # sentinel
|
||||||
if logout_btn is not None:
|
if logout_btn is not None:
|
||||||
if hasattr(logout_btn, 'click'):
|
if hasattr(logout_btn, 'click'):
|
||||||
|
|||||||