import { closeElectronApp, expect, test } from './fixtures/electron'; test.describe('Makelore Electron smoke flows', () => { test('loads the bundled mixed-script UI font', async ({ page }) => { await page.evaluate(async () => { await document.fonts.load('400 16px "Makelore Latin"', 'Makelore'); await document.fonts.load('400 16px "Makelore CJK"', '中文'); await document.fonts.load('600 16px "Makelore Latin"', 'Makelore'); await document.fonts.load('600 16px "Makelore CJK"', '中文'); }); await expect.poll(async () => page.evaluate(() => getComputedStyle(document.body).fontFamily)) .toContain('Makelore Latin'); await expect.poll(async () => page.evaluate(() => ( Array.from(document.fonts).some((font) => font.family === 'Makelore CJK' && font.status === 'loaded') ))).toBe(true); }); test('shows the setup wizard on a fresh profile', async ({ page }) => { await expect(page.getByTestId('setup-page')).toBeVisible(); await expect(page.getByTestId('setup-welcome-step')).toBeVisible(); await expect(page.getByTestId('setup-skip-button')).toBeVisible(); }); test('can skip setup and open the native login surface', async ({ page }) => { await expect(page.getByTestId('setup-page')).toBeVisible(); await page.getByTestId('setup-skip-button').click(); await expect(page.getByTestId('ai-module-selection-page')).toBeVisible(); await expect(page.getByTestId('main-layout')).toHaveCount(0); await page.getByTestId('ai-module-option-programming').click(); await expect(page.getByRole('tab', { name: '密码登录', exact: true })).toBeVisible(); await expect(page.getByRole('tab', { name: '密码登录', exact: true })) .toHaveAttribute('aria-selected', 'true'); await expect(page.getByLabel('用户名', { exact: true })).toBeVisible(); await expect(page.getByLabel('密码', { exact: true })).toBeVisible(); const loginButton = page.getByRole('button', { name: '登录', exact: true }); const rememberPasswordCheckbox = page.getByRole('checkbox', { name: '记住密码', exact: true }); await expect(rememberPasswordCheckbox).toBeVisible(); const [loginButtonBox, rememberPasswordBox] = await Promise.all([ loginButton.boundingBox(), rememberPasswordCheckbox.boundingBox(), ]); if (!loginButtonBox || !rememberPasswordBox) { throw new Error('Login controls did not produce visible bounds'); } expect(rememberPasswordBox.y).toBeGreaterThan(loginButtonBox.y + loginButtonBox.height); await expect(page.getByRole('button', { name: '在浏览器中继续', exact: true })).toHaveCount(0); }); test('redirects a signed-out direct workspace route to login', async ({ page }) => { await expect(page.getByTestId('setup-page')).toBeVisible(); await page.getByTestId('setup-skip-button').click(); await expect(page.getByTestId('ai-module-selection-page')).toBeVisible(); await page.evaluate(() => { window.location.hash = '#/chat'; }); await expect(page.getByRole('tab', { name: '密码登录', exact: true })).toBeVisible(); await expect(page.getByTestId('main-layout')).toHaveCount(0); }); test('persists skipped setup across relaunch for the same isolated profile', async ({ electronApp, launchElectronApp }) => { const firstWindow = await electronApp.firstWindow(); await firstWindow.waitForLoadState('domcontentloaded'); await firstWindow.getByTestId('setup-skip-button').click(); await expect(firstWindow.getByTestId('ai-module-selection-page')).toBeVisible(); await closeElectronApp(electronApp); const relaunchedApp = await launchElectronApp(); try { const relaunchedWindow = await relaunchedApp.firstWindow(); await relaunchedWindow.waitForLoadState('domcontentloaded'); await expect(relaunchedWindow.getByTestId('ai-module-selection-page')).toBeVisible(); await expect(relaunchedWindow.getByTestId('setup-page')).toHaveCount(0); } finally { await closeElectronApp(relaunchedApp); } }); });