Files
openmaic/OpenMAIC/e2e/tests/full-happy-path.spec.ts
2026-08-16 14:58:47 +08:00

69 lines
3.0 KiB
TypeScript

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('maic:account: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 home.enableInteractiveMode();
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();
}
});
});