103 lines
4.6 KiB
Python
103 lines
4.6 KiB
Python
#!/usr/bin/env python3
|
|
"""V129 E2E - URL state (sort + cat) persistence across reload"""
|
|
import asyncio, json, os
|
|
from playwright.async_api import async_playwright
|
|
|
|
OUT = "/var/www/html/api/blade-tasks/v129-url-state-proof"
|
|
os.makedirs(OUT, exist_ok=True)
|
|
|
|
async def main():
|
|
async with async_playwright() as p:
|
|
browser = await p.chromium.launch(headless=True, args=['--no-sandbox'])
|
|
ctx = await browser.new_context(viewport={'width':1920,'height':1080}, record_video_dir=OUT)
|
|
page = await ctx.new_page()
|
|
errs = []
|
|
page.on('pageerror', lambda e: errs.append(str(e)))
|
|
|
|
await page.goto("https://weval-consulting.com/all-ia-hub.html?v=v129", wait_until='load', timeout=30000)
|
|
await page.wait_for_timeout(2000)
|
|
await page.click('[data-view="dashboards"]')
|
|
await page.wait_for_timeout(3500)
|
|
|
|
# Step 1: Select sort=mtime, filter=pharma
|
|
await page.select_option('#dash-sort', 'mtime')
|
|
await page.wait_for_timeout(600)
|
|
await page.click('button[data-cat="pharma"]')
|
|
await page.wait_for_timeout(800)
|
|
|
|
before_reload = await page.evaluate("""() => ({
|
|
sort_value: document.getElementById('dash-sort')?.value,
|
|
active_cat: document.querySelector('.dash-filter.on')?.getAttribute('data-cat'),
|
|
tiles: document.querySelectorAll('#dash-grid a').length,
|
|
url_hash: window.location.hash
|
|
})""")
|
|
print("Before reload:", json.dumps(before_reload, indent=2))
|
|
await page.screenshot(path=f"{OUT}/01-set-state.png", full_page=True)
|
|
|
|
# Step 2: Reload page
|
|
await page.reload(wait_until='load')
|
|
await page.wait_for_timeout(2000)
|
|
await page.click('[data-view="dashboards"]')
|
|
await page.wait_for_timeout(4000)
|
|
|
|
after_reload = await page.evaluate("""() => ({
|
|
sort_value: document.getElementById('dash-sort')?.value,
|
|
active_cat: document.querySelector('.dash-filter.on')?.getAttribute('data-cat'),
|
|
tiles: document.querySelectorAll('#dash-grid a').length,
|
|
url_hash: window.location.hash
|
|
})""")
|
|
print("After reload:", json.dumps(after_reload, indent=2))
|
|
await page.screenshot(path=f"{OUT}/02-after-reload.png", full_page=True)
|
|
|
|
# Step 3: Click "All" to go back - hash should clear cat
|
|
await page.click('button[data-cat="all"]')
|
|
await page.wait_for_timeout(800)
|
|
after_all = await page.evaluate("""() => ({
|
|
active_cat: document.querySelector('.dash-filter.on')?.getAttribute('data-cat'),
|
|
url_hash: window.location.hash,
|
|
tiles: document.querySelectorAll('#dash-grid a').length
|
|
})""")
|
|
print("After All:", json.dumps(after_all, indent=2))
|
|
|
|
# Step 4: Reset sort to 'name' - hash should clear sort
|
|
await page.select_option('#dash-sort', 'name')
|
|
await page.wait_for_timeout(500)
|
|
after_name = await page.evaluate("() => ({url_hash: window.location.hash})")
|
|
print("After sort=name:", after_name)
|
|
|
|
await ctx.close()
|
|
await browser.close()
|
|
|
|
verdict = 'OK' if (
|
|
before_reload['sort_value'] == 'mtime' and
|
|
before_reload['active_cat'] == 'pharma' and
|
|
'sort=mtime' in before_reload['url_hash'] and
|
|
'cat=pharma' in before_reload['url_hash'] and
|
|
after_reload['sort_value'] == 'mtime' and # persisted !
|
|
after_reload['active_cat'] == 'pharma' and # persisted !
|
|
after_reload['tiles'] == 6 and
|
|
after_all['active_cat'] == 'all' and
|
|
'cat=' not in after_all['url_hash'] and
|
|
'sort=' not in after_name['url_hash'] and
|
|
not errs
|
|
) else 'PARTIAL'
|
|
|
|
report = {
|
|
'v129': 'url-state-persistence',
|
|
'before_reload': before_reload,
|
|
'after_reload': after_reload,
|
|
'after_all': after_all,
|
|
'after_name_sort': after_name,
|
|
'sort_persisted': after_reload['sort_value'] == 'mtime',
|
|
'cat_persisted': after_reload['active_cat'] == 'pharma',
|
|
'tiles_filtered_correctly': after_reload['tiles'] == 6,
|
|
'hash_cleaned_on_default': 'cat=' not in after_all['url_hash'] and 'sort=' not in after_name['url_hash'],
|
|
'js_errors': errs,
|
|
'VERDICT': verdict
|
|
}
|
|
with open(f"{OUT}/proof.json",'w') as f: json.dump(report, f, indent=2)
|
|
print("=== VERDICT:", verdict)
|
|
print(json.dumps(report, indent=2))
|
|
|
|
asyncio.run(main())
|