import { test, expect } from '../fixtures/base'; import { GenerationPreviewPage } from '../pages/generation-preview.page'; import { createSettingsStorage, SETTINGS_KV_KEY } from '../fixtures/test-data/settings'; import { mockOutlines } from '../fixtures/test-data/scene-outlines'; const SETTINGS_STORAGE = createSettingsStorage(); const REVIEW_SETTINGS_STORAGE = createSettingsStorage({ reviewOutlineEnabled: true }); const GENERATION_SESSION = JSON.stringify({ sessionId: 'e2e-test-session', requirements: { requirement: '讲解光合作用', language: 'zh-CN', }, pdfText: '', pdfImages: [], imageStorageIds: [], sceneOutlines: null, currentStep: 'generating', }); const PERSISTED_REVIEW_SESSION = JSON.stringify({ sessionId: 'e2e-review-session', requirements: { requirement: '讲解光合作用', language: 'zh-CN', }, pdfText: '', pdfImages: [], imageStorageIds: [], sceneOutlines: mockOutlines, languageDirective: 'Use Chinese for the generated course.', currentStep: 'generating', previewPhase: 'review', }); test.describe('Generation Flow', () => { test.beforeEach(async ({ page }) => { await page.addInitScript( ({ settings, session }) => { localStorage.setItem('maic:account:settings-storage', settings); sessionStorage.setItem('generationSession', session); }, { settings: SETTINGS_STORAGE, session: GENERATION_SESSION }, ); }); test('completes generation pipeline and redirects to classroom', async ({ page, mockApi }) => { // Set up all API mocks await mockApi.setupGenerationMocks(); const preview = new GenerationPreviewPage(page); await preview.goto(); // Generation card with progress dots should be visible await expect(preview.stepTitle).toBeVisible(); // Wait for auto-redirect to classroom await preview.waitForRedirectToClassroom(); expect(page.url()).toMatch(/\/classroom\//); }); test('opens outline editor from preview review opportunity and resumes generation', async ({ page, mockApi, }) => { await mockApi.setupGenerationMocks(); const preview = new GenerationPreviewPage(page); await preview.goto(); await preview.waitForReviewOpportunity(); await preview.openOutlineReview(); await expect(preview.editorTitle).toBeVisible(); await preview.confirmOutlines(); await preview.waitForRedirectToClassroom(); expect(page.url()).toMatch(/\/classroom\//); }); test('persists always review preference from the outline editor', async ({ page, mockApi }) => { await mockApi.setupGenerationMocks(); const preview = new GenerationPreviewPage(page); await preview.goto(); await preview.waitForReviewOpportunity(); await preview.openOutlineReview(); await preview.enableAlwaysReview(); // The persist write goes through the KVStore and is asynchronous, so poll // rather than reading once straight after the toggle. await expect .poll(() => page.evaluate((key) => { const raw = localStorage.getItem(key); return raw ? JSON.parse(raw).state.reviewOutlineEnabled : undefined; }, SETTINGS_KV_KEY), ) .toBe(true); await preview.confirmOutlines(); await preview.waitForRedirectToClassroom(); }); test('automatically opens outline editor when always review is enabled', async ({ page, mockApi, }) => { await page.addInitScript( ({ settings, session }) => { localStorage.setItem('maic:account:settings-storage', settings); sessionStorage.setItem('generationSession', session); }, { settings: REVIEW_SETTINGS_STORAGE, session: GENERATION_SESSION }, ); await mockApi.setupGenerationMocks(); const preview = new GenerationPreviewPage(page); await preview.goto(); await preview.waitForEditor(); await expect(preview.editorTitle).toBeVisible(); await preview.confirmOutlines(); await preview.waitForRedirectToClassroom(); }); }); test('resumes generation from a persisted outline review session', async ({ page, mockApi }) => { await page.addInitScript( ({ settings, session }) => { localStorage.setItem('maic:account:settings-storage', settings); sessionStorage.setItem('generationSession', session); }, { settings: SETTINGS_STORAGE, session: PERSISTED_REVIEW_SESSION }, ); await mockApi.setupGenerationMocks(); const preview = new GenerationPreviewPage(page); await preview.goto(); await preview.waitForEditor(); await preview.confirmOutlines(); await preview.waitForRedirectToClassroom(); expect(page.url()).toMatch(/\/classroom\//); });