#!/usr/bin/env python3 """V126 - Verify 'new' badge renders on recent tiles + sort by date works""" import asyncio, json, os from playwright.async_api import async_playwright OUT = "/var/www/html/api/blade-tasks/v126-new-badge-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=v126", wait_until='load', timeout=30000) await page.wait_for_timeout(2000) await page.click('[data-view="dashboards"]') await page.wait_for_timeout(3500) state = await page.evaluate("""() => { const tiles = document.querySelectorAll('#dash-grid a'); // Count tiles with "new" indicator (sparkle emoji or green badge) const newBadges = Array.from(tiles).filter(a => a.innerHTML.includes('✨') || a.innerHTML.includes('✨') || a.innerHTML.includes('new') ).length; return { total_tiles: tiles.length, new_badges: newBadges, first_tile_html: tiles[0]?.innerHTML.substring(0, 300) }; }""") print("V124 new badge state:", json.dumps(state, indent=2)) await page.screenshot(path=f"{OUT}/01-new-badges.png", full_page=True) # Try sort by mtime (latest first) sort = await page.query_selector('#dash-sort') if sort: await page.select_option('#dash-sort', 'mtime') await page.wait_for_timeout(1000) sort_state = await page.evaluate("""() => { const tiles = document.querySelectorAll('#dash-grid a'); return { first_3: Array.from(tiles).slice(0,3).map(a => a.querySelector('div:last-child')?.textContent?.trim().substring(0,80)) }; }""") print("After sort by mtime:", json.dumps(sort_state, indent=2)) await page.screenshot(path=f"{OUT}/02-sorted-mtime.png", full_page=True) await ctx.close() await browser.close() verdict = 'OK' if (state['total_tiles'] == 84 and not errs) else 'PARTIAL' report = { 'v126': 'new-badge-mtime-verify', 'total_tiles': state['total_tiles'], 'new_badges_rendered': state['new_badges'], 'js_errors': errs, 'VERDICT': verdict } with open(f"{OUT}/proof.json",'w') as f: json.dump(report, f, indent=2) print("=== VERDICT:", verdict) asyncio.run(main())