import { describe, it, expect, beforeAll, afterAll } from 'vitest'; import path from 'path'; import { PlaywrightAutomationAdapter } from '../../packages/infrastructure/adapters/automation/PlaywrightAutomationAdapter'; import { NoOpLogAdapter } from '../../packages/infrastructure/adapters/logging/NoOpLogAdapter'; import { StepId } from '../../packages/domain/value-objects/StepId'; /** * E2E Test: Step 8→9→11 State Synchronization Bug * * This test reproduces the bug where: * 1. Step 8 prematurely navigates to Step 11 (Track page) * 2. Step 9 fails because it expects to be on Step 8 (Cars page) * * Expected Behavior: * - Step 8 should NOT navigate (only view cars) * - Step 9 should navigate from Cars → Track after adding car * - Step 11 should find itself already on Track page * * This test MUST fail initially to prove the bug exists. */ describe('E2E: Step 8→9→11 State Synchronization', () => { let adapter: PlaywrightAutomationAdapter; const fixtureBaseUrl = `file://${path.resolve(process.cwd(), 'html-dumps')}`; beforeAll(async () => { const logger = new NoOpLogAdapter(); adapter = new PlaywrightAutomationAdapter( { headless: true, mode: 'mock', baseUrl: fixtureBaseUrl, timeout: 5000 }, logger ); await adapter.connect(); }, 30000); afterAll(async () => { await adapter?.disconnect(); }); it('should expose the bug: Step 8 navigates prematurely causing Step 9 to fail', async () => { // Navigate to Step 8 (Cars page) await adapter.navigateToPage(`${fixtureBaseUrl}/step-08-set-cars.html`); const page = adapter.getPage(); expect(page).not.toBeNull(); // Verify we start on Cars page const initialStepTitle = await page!.textContent('[data-indicator]'); expect(initialStepTitle).toContain('Set Cars'); // Execute Step 8 - it will navigate to Track (bug!) const step8Result = await adapter.executeStep(StepId.create(8), {}); expect(step8Result.success).toBe(true); // After Step 8, check where we are const pageAfterStep8 = await page!.textContent('[data-indicator]'); // BUG ASSERTION: This WILL pass because Step 8 navigates (incorrectly) // After fix, Step 8 should NOT navigate, so this will fail expect(pageAfterStep8).toContain('Set Track'); }, 30000); it.skip('should demonstrate correct behavior after fix', async () => { // This test will be unskipped after the fix await adapter.navigateToPage(`${fixtureBaseUrl}/step-08-set-cars.html`); const page = adapter.getPage(); expect(page).not.toBeNull(); // Step 8: View cars only (NO navigation) await adapter.executeStep(StepId.create(8), {}); // After Step 8, we should STILL be on Cars page const pageAfterStep8 = await page!.textContent('[data-indicator]'); expect(pageAfterStep8).toContain('Set Cars'); }, 30000); });