File size: 2,969 Bytes
a0ebf39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import { test, expect } from '../fixtures/base';
import { HomePage } from '../pages/home.page';
import { GenerationPreviewPage } from '../pages/generation-preview.page';
import { ClassroomPage } from '../pages/classroom.page';
import { createSettingsStorage } from '../fixtures/test-data/settings';

const SETTINGS_STORAGE = createSettingsStorage({ sidebarCollapsed: false });

test.describe('Full Happy Path', () => {
  test.beforeEach(async ({ page, mockApi }) => {
    // Pre-seed settings in localStorage (all tests do this)
    await page.addInitScript((settings) => {
      localStorage.setItem('settings-storage', settings);
    }, SETTINGS_STORAGE);

    // Set up generation API mocks BEFORE any navigation โ€”
    // generation auto-starts when generation-preview mounts.
    await mockApi.setupGenerationMocks();
  });

  test('home โ†’ generation-preview โ†’ classroom with scene navigation', async ({ page }) => {
    // โ”€โ”€ Phase 1: Home page โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    const home = new HomePage(page);
    await home.goto();

    // Core UI elements visible
    await expect(home.logo).toBeVisible();
    await expect(home.textarea).toBeVisible();
    await expect(home.enterButton).toBeDisabled();

    // Fill requirement text โ†’ submit button activates
    await home.fillRequirement('่ฎฒ่งฃๅ…‰ๅˆไฝœ็”จ');
    await expect(home.enterButton).toBeEnabled();

    // Submit โ†’ navigate to generation-preview
    await home.submit();
    await page.waitForURL(/\/generation-preview/);

    // โ”€โ”€ Phase 2: Generation preview โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    const preview = new GenerationPreviewPage(page);

    // Generation progress UI should be visible
    await expect(preview.stepTitle).toBeVisible();

    // Wait for mocked generation to complete and auto-redirect to classroom
    await preview.waitForRedirectToClassroom();
    expect(page.url()).toMatch(/\/classroom\//);

    // โ”€โ”€ Phase 3: Classroom โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    const classroom = new ClassroomPage(page);
    await classroom.waitForLoaded();

    // At least one scene should be visible in the sidebar
    await expect(classroom.sidebarScenes.first()).toBeVisible({ timeout: 10_000 });

    // First scene title should match mock data
    await expect(classroom.getSceneTitle(0)).toContainText('ๅ…‰ๅˆไฝœ็”จ');

    // If more than one scene item is rendered, verify scene switching works
    const sceneCount = await classroom.sidebarScenes.count();
    if (sceneCount > 1) {
      await classroom.clickScene(1);
      // Verify the clicked scene is visible (active)
      await expect(classroom.sidebarScenes.nth(1)).toBeVisible();
    }
  });
});