| 1 | """Run against an isolated mock Vite server; never invokes a model provider.""" |
| 2 | import argparse |
| 3 | import json |
| 4 | from playwright.sync_api import sync_playwright, expect |
| 5 | |
| 6 | parser = argparse.ArgumentParser() |
| 7 | parser.add_argument('--url', default='http://127.0.0.1:5189/?mock=bench&bench=1') |
| 8 | parser.add_argument('--chromium', required=True) |
| 9 | args = parser.parse_args() |
| 10 | |
| 11 | with sync_playwright() as p: |
| 12 | browser = p.chromium.launch(headless=True, executable_path=args.chromium) |
| 13 | page = browser.new_page(viewport={'width': 1440, 'height': 1000}) |
| 14 | errors = [] |
| 15 | page.on('pageerror', lambda error: errors.append(str(error))) |
| 16 | page.goto(args.url) |
| 17 | page.wait_for_load_state('networkidle') |
| 18 | composer = page.locator('textarea.composer__input:not([aria-hidden=true])') |
| 19 | project_new = page.locator('.project-tree__folder-action--create').first |
| 20 | history = page.locator('.project-tree__topic-main').filter(has_text='bench:small-6t').first |
| 21 | history.click() |
| 22 | expect(composer).to_be_enabled() |
| 23 | rows = page.locator('.project-tree__topic-main').count() |
| 24 | page.locator('.project-tree__folder--project').first.hover() |
| 25 | project_new.click() |
| 26 | expect(page.locator('.main--draft-landing')).to_have_count(1) |
| 27 | expect(page.locator('.welcome-creation__headline')).to_be_visible() |
| 28 | expect(page.locator('.session-draft-surface')).to_have_count(0) |
| 29 | composer.fill('persistent draft ownership fixture') |
| 30 | for _ in range(20): |
| 31 | page.locator('.project-tree__folder--project').first.hover() |
| 32 | project_new.click() |
| 33 | expect(composer).to_have_value('persistent draft ownership fixture') |
| 34 | assert page.locator('.project-tree__topic-main').count() == rows |
| 35 | page.locator('.sidebar__quick-action').first.click() |
| 36 | expect(composer).to_have_value('persistent draft ownership fixture') |
| 37 | history.click() |
| 38 | expect(page.locator('.main--draft-landing')).to_have_count(0) |
| 39 | page.keyboard.press('Meta+n') |
| 40 | expect(page.locator('.main--draft-landing')).to_have_count(1) |
| 41 | expect(page.locator('.welcome-creation__headline')).to_be_visible() |
| 42 | expect(composer).to_have_value('persistent draft ownership fixture') |
| 43 | history.click() |
| 44 | expect(page.locator('.main--draft-landing')).to_have_count(0) |
| 45 | page.locator('.project-tree__folder--project').first.click(button='right') |
| 46 | page.get_by_role('menuitem', name='New session', exact=True).click() |
| 47 | expect(composer).to_have_value('persistent draft ownership fixture') |
| 48 | history.click() |
| 49 | expect(page.locator('.main--draft-landing')).to_have_count(0) |
| 50 | page.keyboard.press('Meta+k') |
| 51 | page.locator('.palette input').fill('New session') |
| 52 | page.get_by_role('option').filter(has_text='New session').first.click() |
| 53 | expect(composer).to_have_value('persistent draft ownership fixture') |
| 54 | page.evaluate('() => window.__reasonixFlushSessionDraft()') |
| 55 | page.evaluate('() => window.__reasonixResumeSessionDraftEditing()') |
| 56 | # Each sample begins from a different, fully installed history surface. |
| 57 | times = [] |
| 58 | for _ in range(30): |
| 59 | history.click() |
| 60 | expect(page.locator('.main--draft-landing')).to_have_count(0) |
| 61 | expect(page.locator('.transcript-navigation-surface[aria-busy=false]')).to_be_visible() |
| 62 | elapsed = page.evaluate('''() => new Promise(resolve => { |
| 63 | const start = performance.now(); |
| 64 | document.querySelector('.project-tree__folder-action--create').click(); |
| 65 | const inspect = () => { |
| 66 | const input = document.querySelector('textarea.composer__input:not([aria-hidden=true])'); |
| 67 | if (document.querySelector('.main--draft-landing') && input && !input.disabled && input.value === 'persistent draft ownership fixture') resolve(performance.now()-start); |
| 68 | else requestAnimationFrame(inspect); |
| 69 | }; |
| 70 | requestAnimationFrame(inspect); |
| 71 | })''') |
| 72 | times.append(elapsed) |
| 73 | expect(composer).to_have_value('persistent draft ownership fixture') |
| 74 | assert not errors, errors |
| 75 | print(json.dumps({'mode': 'mock-browser', 'new_clicks': 20, 'entrypoints': ['project-plus','top-new','shortcut','context-menu','command-palette'], 'session_rows_unchanged': True, |
| 76 | 'restore_samples': len(times), 'restore_p95_ms': sorted(times)[28], 'errors': errors})) |
| 77 | browser.close() |
| 78 |