收口 Makelore 客户端变更
Some checks failed
Electron E2E / Electron E2E (macos-latest) (push) Has been cancelled
Electron E2E / Electron E2E (ubuntu-latest) (push) Has been cancelled
Electron E2E / Electron E2E (windows-latest) (push) Has been cancelled

This commit is contained in:
inman
2026-08-12 22:35:06 +08:00
parent 253bad8b40
commit f4113a872f
232 changed files with 4617 additions and 20121 deletions

View File

@@ -1,25 +1,43 @@
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 continue to the login page', async ({ page }) => {
test('can skip setup and open the public module chooser', async ({ page }) => {
await expect(page.getByTestId('setup-page')).toBeVisible();
await page.getByTestId('setup-skip-button').click();
await expect(page.getByRole('button', { name: 'Continue in browser' })).toBeVisible();
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('button', { name: '在浏览器中继续' })).toBeVisible();
});
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.getByRole('button', { name: 'Continue in browser' })).toBeVisible();
await expect(firstWindow.getByTestId('ai-module-selection-page')).toBeVisible();
await closeElectronApp(electronApp);
@@ -28,7 +46,7 @@ test.describe('Makelore Electron smoke flows', () => {
const relaunchedWindow = await relaunchedApp.firstWindow();
await relaunchedWindow.waitForLoadState('domcontentloaded');
await expect(relaunchedWindow.getByRole('button', { name: 'Continue in browser' })).toBeVisible();
await expect(relaunchedWindow.getByTestId('ai-module-selection-page')).toBeVisible();
await expect(relaunchedWindow.getByTestId('setup-page')).toHaveCount(0);
} finally {
await closeElectronApp(relaunchedApp);

View File

@@ -277,6 +277,9 @@ export async function completeSetup(page: Page): Promise<void> {
if (await setupPage.isVisible()) {
await page.getByTestId('setup-skip-button').click();
}
const moduleSelectionPage = page.getByTestId('ai-module-selection-page');
await expect(moduleSelectionPage).toBeVisible();
await page.getByTestId('ai-module-option-programming').click();
await expect(page.getByTestId('main-layout')).toBeVisible();
}

View File

@@ -66,13 +66,15 @@ test.describe('Russian language localization', () => {
// Skip setup
await page.getByTestId('setup-skip-button').click();
await expect(page.getByRole('button', { name: 'Continue in browser' })).toBeVisible();
await expect(page.getByTestId('ai-module-selection-page')).toBeVisible();
await closeElectronApp(app);
firstAppClosed = true;
relaunchedApp = await launchElectronApp({ skipSetup: true });
const relaunchedPage = await getStableWindow(relaunchedApp);
await expect(relaunchedPage.getByTestId('ai-module-selection-page')).toBeVisible();
await relaunchedPage.getByTestId('ai-module-option-programming').click();
await expect(relaunchedPage.getByTestId('main-layout')).toBeVisible();
// Bypass authentication only for the relaunch so the persisted setting
@@ -96,6 +98,8 @@ test.describe('Russian language localization', () => {
try {
const page = await getStableWindow(app);
await expect(page.getByTestId('ai-module-selection-page')).toBeVisible();
await page.getByTestId('ai-module-option-programming').click();
await expect(page.getByTestId('main-layout')).toBeVisible();
// Navigate to Settings (in English by default after skipSetup)

View File

@@ -1,15 +1,17 @@
import { closeElectronApp, expect, getStableWindow, test } from './fixtures/electron';
test.describe('NianCode main navigation without setup flow', () => {
test('navigates between core pages with setup bypassed', async ({ launchElectronApp }) => {
test.describe('Makelore module navigation without setup flow', () => {
test('opens the module chooser and switches between enabled modules', async ({ launchElectronApp }) => {
const app = await launchElectronApp({ skipSetup: true });
try {
const page = await getStableWindow(app);
const minimumSize = await app.evaluate(({ BrowserWindow }) => BrowserWindow.getAllWindows()[0]?.getMinimumSize());
expect(minimumSize).toEqual([1100, 700]);
expect(minimumSize).toEqual([1024, 700]);
await expect(page.getByTestId('ai-module-selection-page')).toBeVisible();
await page.getByTestId('ai-module-option-programming').click();
await expect(page.getByTestId('main-layout')).toBeVisible();
await expect(page.getByText('请先新建项目')).toHaveCount(0);
await expect(page.getByText('一念成光,万物可创。')).toBeVisible();
@@ -20,28 +22,11 @@ test.describe('NianCode main navigation without setup flow', () => {
await expect(page.getByTestId('sidebar-nav-project-config')).toHaveCount(0);
await expect(page.getByTestId('sidebar-nav-agent-chat')).toHaveCount(0);
await expect(page.getByRole('button', { name: '添加已有项目' })).toHaveCount(0);
await expect(page.getByTestId('sidebar-nav-character')).toHaveText('角色场景');
await expect(page.getByText('成长成就在这里')).toHaveCount(0);
await expect(page.getByText('已创建 Phaser 2D 小游戏起步工程')).toHaveCount(0);
await expect(page.getByTestId('game-asset-browser')).toHaveCount(0);
await expect(page.getByTestId('game-asset-review-summary')).toHaveCount(0);
await page.getByTestId('resource-card-models').click();
await expect(page.getByTestId('makelore-model-config-refresh-button')).toBeVisible();
await page.keyboard.press('Escape');
await page.getByTestId('resource-card-skills').click();
await expect(page.getByRole('heading', { name: '可用技能库' })).toBeVisible();
await expect(page.getByTestId('skill-library-card-youth-plain-language')).toContainText('青少年通俗表达');
await expect(page.getByTestId('skill-library-card-youth-plain-language')).not.toContainText('youth-plain-language');
await expect(page.getByTestId('skill-library-card-pm-project-plan')).toContainText('通用软件项目规划');
await expect(page.getByTestId('skill-library-card-pm-project-plan')).not.toContainText('pm-project-plan');
await page.keyboard.press('Escape');
await page.getByTestId('sidebar-nav-models').click();
await expect(page.getByTestId('models-page')).toBeVisible();
await expect(page.getByTestId('models-page-title')).toBeVisible();
await expect(page.getByTestId('sidebar-module-switcher')).toBeVisible();
await expect(page.getByTestId('sidebar-module-switcher-trigger')).toHaveAttribute('aria-expanded', 'false');
await page.getByTestId('sidebar-module-switcher-trigger').click();
@@ -50,28 +35,19 @@ test.describe('NianCode main navigation without setup flow', () => {
await page.getByTestId('sidebar-module-painting').click();
await expect(page.getByTestId('image-canvas-page')).toBeVisible();
await expect(page.getByTestId('image-workspace-unavailable')).toBeVisible();
await expect(page.getByText('创作空间暂不可用').first()).toBeVisible();
await expect(page.getByText('AI 设计暂不可用').first()).toBeVisible();
await expect(page.getByTestId('sidebar-image-workspace')).toBeVisible();
await expect(page.getByTestId('sidebar-create-image-project')).toBeVisible();
await expect(page.getByTestId('sidebar-image-projects')).toBeVisible();
await expect(page.getByText('本地开发')).toHaveCount(0);
await expect(page.getByTestId('sidebar-reset-local-image-workspace')).toHaveCount(0);
await expect(page.getByTestId('sidebar-create-project')).toHaveCount(0);
await expect(page.getByText('制作中心')).toHaveCount(0);
await expect(page.getByText('任务模块')).toHaveCount(0);
await expect(page.getByTestId('sidebar-module-painting')).toHaveAttribute('aria-current', 'page');
await page.getByTestId('sidebar-module-switcher-trigger').click();
await page.getByTestId('sidebar-module-programming').click();
await expect(page.getByText('请先新建项目')).toHaveCount(0);
await expect(page.getByText('一念成光,万物可创。')).toBeVisible();
await expect(page.getByTestId('chat-operation-page')).toHaveCount(0);
await expect(page.getByTestId('sidebar-nav-asset-square')).toHaveCount(0);
await page.getByTestId('sidebar-nav-agents').click();
await expect(page.getByTestId('agents-page')).toBeVisible();
await page.getByTestId('sidebar-nav-channels').click();
await expect(page.getByTestId('channels-page')).toBeVisible();
} finally {
await closeElectronApp(app);
}

View File

@@ -88,6 +88,8 @@ test.describe('OpenCode image compression composer', () => {
const page = await getStableWindow(app);
await page.reload();
await expect(page.getByTestId('ai-module-selection-page')).toBeVisible();
await page.getByTestId('ai-module-option-programming').click();
await expect(page.getByTestId('sidebar-nav-agent-chat')).toBeVisible();
await page.getByTestId('sidebar-nav-agent-chat').click();
await expect(page.getByTestId('opencode-message-composer')).toBeVisible();

View File

@@ -329,4 +329,95 @@ test.describe('OpenCode slash commands', () => {
model: 'niancode-user-models/qwen3.7-plus',
});
});
test('keeps the project and conversation rails at the minimum width without covering the chat canvas', async ({
electronApp,
page,
}) => {
await completeSetup(page);
await installSlashCommandHost(electronApp);
await page.reload();
await page.setViewportSize({ width: 1280, height: 800 });
await page.getByTestId('sidebar-module-switcher-trigger').click();
await page.getByTestId('sidebar-module-programming').click();
await expect(page).toHaveURL(/\/opencode-chat$/);
await expect(page.getByTestId('opencode-message-composer')).toBeVisible();
const createPartnerButton = page.getByRole('button', { name: '创建伙伴' });
await expect(createPartnerButton).toHaveClass(/text-brand/);
await expect(createPartnerButton).toHaveAttribute('aria-expanded', 'false');
await createPartnerButton.click();
await expect(createPartnerButton).toHaveClass(/text-primary-foreground/);
await expect(createPartnerButton).toHaveAttribute('aria-expanded', 'true');
const createPartnerDialog = page.getByRole('dialog', { name: '创建项目伙伴' });
await expect(createPartnerDialog).toHaveCSS('z-index', '110');
await createPartnerDialog.getByLabel(/伙伴名称/).fill('E2E层级检查');
await page.getByRole('button', { name: '取消' }).click();
await expect(createPartnerButton).toHaveClass(/text-brand/);
await expect(page.getByRole('heading', { name: '我的项目空间' })).toHaveCount(0);
await page.getByTestId('agent-browser-panel-open').click();
await expect(page.getByTestId('agent-browser-panel')).toBeVisible();
const diagnostics = page.getByTestId('agent-browser-diagnostics');
await expect(diagnostics).toHaveAttribute('data-state', 'closed');
await page.getByRole('tab', { name: /Console/ }).click();
await expect(diagnostics).toHaveAttribute('data-state', 'open');
await expect(diagnostics).toHaveCSS('height', '260px');
await page.getByRole('button', { name: '收起调试面板' }).click();
await expect(diagnostics).toHaveAttribute('data-state', 'closed');
const rect = async (testId: string) => page.getByTestId(testId).evaluate((element) => {
const box = element.getBoundingClientRect();
return { top: box.top, left: box.left, right: box.right, width: box.width };
});
const [layout, project, conversations, conversationHeader, conversationContext, chat, browser] = await Promise.all([
rect('opencode-chat-layout'),
rect('sidebar'),
rect('agent-conversation-sidebar'),
rect('agent-conversation-sidebar-header'),
rect('agent-conversation-dialog-context'),
rect('opencode-chat-canvas'),
rect('agent-browser-panel'),
]);
const isHeaderInsideConversationSidebar = async () => page.getByTestId('agent-conversation-sidebar').evaluate((sidebar) => sidebar.contains(document.querySelector('[data-testid="agent-conversation-sidebar-header"]')));
expect(project.width).toBeGreaterThanOrEqual(255);
expect(project.width).toBeLessThan(257);
expect(conversations.width).toBeGreaterThanOrEqual(255);
expect(conversations.width).toBeLessThan(257);
expect(Math.abs(conversations.top)).toBeLessThan(2);
expect(Math.abs(conversationHeader.top)).toBeLessThan(2);
expect(Math.abs(conversationHeader.left - conversations.left)).toBeLessThan(2);
expect(Math.abs(conversationHeader.width - conversations.width)).toBeLessThan(2);
expect(Math.abs(conversationContext.top)).toBeLessThan(2);
expect(Math.abs(conversationContext.left - chat.left)).toBeLessThan(2);
expect(await isHeaderInsideConversationSidebar()).toBe(false);
expect(Math.abs(conversations.left - project.right)).toBeLessThan(2);
expect(Math.abs(chat.left - conversations.right)).toBeLessThan(2);
expect(Math.abs(browser.right - layout.right)).toBeLessThan(2);
expect(browser.left).toBeGreaterThanOrEqual(chat.right - 1);
const readRailAlignment = async () => {
const [collapsedProject, collapsedConversations] = await Promise.all([
rect('sidebar'),
rect('agent-conversation-sidebar'),
]);
return {
projectWidth: collapsedProject.width,
conversationLeft: collapsedConversations.left,
projectRight: collapsedProject.right,
alignmentDelta: Math.abs(collapsedConversations.left - collapsedProject.right),
};
};
await page.getByRole('button', { name: '折叠侧栏' }).click();
await expect.poll(async () => (await readRailAlignment()).projectWidth).toBeLessThan(1);
await expect.poll(async () => (await readRailAlignment()).conversationLeft).toBeLessThan(2);
await expect.poll(isHeaderInsideConversationSidebar).toBe(false);
await page.getByRole('button', { name: '展开侧栏' }).click();
await expect.poll(async () => (await readRailAlignment()).alignmentDelta).toBeLessThan(2);
await expect.poll(async () => (await readRailAlignment()).projectWidth).toBeGreaterThan(255);
await expect.poll(isHeaderInsideConversationSidebar).toBe(false);
});
});

View File

@@ -0,0 +1,115 @@
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
import { tmpdir } from 'node:os';
import path from 'node:path';
import { closeElectronApp, expect, getStableWindow, test } from './fixtures/electron';
import { createProjectConfig } from '../../shared/project-config';
test.describe('Project configuration skills', () => {
test('does not expose the removed Superpowers feature and supports Skill details', async ({ launchElectronApp }) => {
const parentPath = await mkdtemp(path.join(tmpdir(), 'niancode-project-configuration-e2e-'));
const app = await launchElectronApp({ skipSetup: true });
try {
const userDataDir = await app.evaluate(({ app: electronApp }) => electronApp.getPath('userData'));
const skillDir = path.join(userDataDir, 'opencode', 'niancode-config', 'skills', 'pm-project-plan');
await mkdir(path.join(skillDir, 'references'), { recursive: true });
await writeFile(path.join(skillDir, 'SKILL.md'), '---\nname: pm-project-plan\ndescription: E2E project planning skill.\n---\n\n# Project planning\n');
await writeFile(path.join(skillDir, 'references', 'guide.md'), '# Reference guide\n');
await app.evaluate(({ ipcMain }, selectedPath) => {
ipcMain.removeHandler('dialog:open');
ipcMain.handle('dialog:open', async () => ({ canceled: false, filePaths: [selectedPath] }));
}, parentPath);
const page = await getStableWindow(app);
await expect(page.getByTestId('ai-module-selection-page')).toBeVisible();
await page.getByTestId('ai-module-option-programming').click();
await expect(page.getByTestId('main-layout')).toBeVisible();
await page.getByTestId('sidebar-create-project').click();
await expect(page.getByRole('radio', { name: '小游戏' })).toBeChecked();
await expect(page.getByRole('radio', { name: '小程序' })).not.toBeChecked();
await expect(page.getByRole('radio', { name: '自定义项目' })).not.toBeChecked();
await page.getByRole('radio', { name: '小程序' }).click();
await expect(page.getByRole('radio', { name: '小程序' })).toBeChecked();
await page.getByRole('radio', { name: '小游戏' }).click();
await expect(page.getByRole('radio', { name: '直接使用所选文件夹(默认)' })).toBeChecked();
await page.getByRole('button', { name: '选择路径' }).click();
await expect(page.getByLabel('项目路径')).toHaveValue(parentPath);
await page.getByRole('button', { name: '确认创建' }).click();
await expect(page.getByTestId('project-configuration-page')).toBeVisible();
await expect(page.getByTestId('sidebar-nav-publish')).toHaveCount(0);
await expect(page.getByText(/新项目还没有伙伴/)).toHaveCount(0);
await expect(page.getByTestId('project-configuration-actions')).toBeVisible();
const actionBarBottomGap = await page.getByTestId('project-configuration-actions').evaluate((element) => window.innerHeight - element.getBoundingClientRect().bottom);
expect(actionBarBottomGap).toBeLessThan(40);
await expect(page.getByRole('button', { name: '创建伙伴' })).toBeVisible();
for (const [resourceId, title] of [
['resource-card-models', '大脑(大语言模型)'],
['resource-card-knowledge', '笔记本(知识库)'],
['resource-card-skills', '工具箱(技能)'],
] as const) {
await page.getByTestId(resourceId).click();
const drawer = page.getByRole('dialog', { name: title });
await expect(drawer).toBeVisible();
if (resourceId === 'resource-card-models') {
await expect(drawer.getByRole('combobox')).toHaveCount(0);
await expect(drawer.locator('[data-testid="project-model-list"], [data-testid="project-model-empty-state"]')).toHaveCount(1);
}
await page.getByRole('button', { name: '关闭' }).click();
await expect(page.getByRole('dialog', { name: title })).toHaveCount(0);
}
const now = new Date().toISOString();
await mkdir(path.join(parentPath, '.niancode'), { recursive: true });
await writeFile(path.join(parentPath, '.niancode', 'project.json'), JSON.stringify({
...createProjectConfig(undefined, 'mini_game'),
initialized: true,
agents: [{
id: 'e2e-partner',
avatarId: 'avatar-01',
roleName: '项目伙伴',
name: 'E2E伙伴',
builtIn: false,
enabled: true,
model: 'moonshot/kimi-k2.6',
skillIds: [],
responsibility: { mission: '验证伙伴维护弹窗。', owns: [], boundaries: [], collaborators: [], principles: [] },
prompt: '',
archivedAt: null,
pinned: false,
createdAt: now,
updatedAt: now,
}],
}, null, 2));
await page.reload();
await expect(page.getByTestId('project-configuration-page')).toBeVisible();
await page.getByTestId('resource-card-skills').click();
await expect(page.getByTestId('superpowers-card')).toHaveCount(0);
await expect(page.getByRole('switch', { name: '启用 Superpowers' })).toHaveCount(0);
await expect(page.getByTestId('skill-card-pm-project-plan')).toBeVisible();
await page.getByTestId('skill-card-pm-project-plan').click();
await expect(page.getByTestId('skill-detail-view')).toBeVisible();
await expect(page.getByTestId('skill-structure')).toContainText('references/guide.md');
await expect(page.getByTestId('skill-main-file')).toContainText('# Project planning');
await page.getByRole('button', { name: '返回技能列表' }).click();
await expect(page.getByTestId('skill-card-pm-project-plan')).toBeVisible();
await page.getByRole('button', { name: '关闭' }).click();
await expect(page.getByTestId('resource-card-publish')).toHaveCount(0);
await expect(page.getByRole('button', { name: '一键提交审核' })).toBeVisible();
const agentCard = page.getByTestId('project-agent-e2e-partner');
await expect(agentCard).toContainText('E2E伙伴');
await agentCard.click();
const maintenanceDialog = page.getByRole('dialog', { name: 'E2E伙伴 · 伙伴维护' });
await expect(maintenanceDialog).toBeVisible();
await expect(maintenanceDialog.getByLabel(/伙伴名称/)).toHaveValue('E2E伙伴');
await expect(page.getByText('完成配置')).toHaveCount(0);
} finally {
await closeElectronApp(app);
await rm(parentPath, { recursive: true, force: true });
}
});
});

View File

@@ -1,47 +0,0 @@
import { mkdtemp, rm } from 'node:fs/promises';
import { tmpdir } from 'node:os';
import path from 'node:path';
import { closeElectronApp, expect, getStableWindow, test } from './fixtures/electron';
test.describe('Project-level Superpowers setting', () => {
test('starts publishable projects with Superpowers disabled and only the one-click release entry', async ({ launchElectronApp }) => {
const parentPath = await mkdtemp(path.join(tmpdir(), 'niancode-superpowers-e2e-'));
const app = await launchElectronApp({ skipSetup: true });
try {
await app.evaluate(({ ipcMain }, selectedPath) => {
ipcMain.removeHandler('dialog:open');
ipcMain.handle('dialog:open', async () => ({ canceled: false, filePaths: [selectedPath] }));
}, parentPath);
const page = await getStableWindow(app);
await page.getByTestId('sidebar-create-project').click();
await expect(page.getByRole('radio', { name: '小游戏' })).toBeChecked();
await expect(page.getByRole('radio', { name: '小程序' })).not.toBeChecked();
await expect(page.getByRole('radio', { name: '自定义项目' })).not.toBeChecked();
await page.getByRole('radio', { name: '小程序' }).click();
await expect(page.getByRole('radio', { name: '小程序' })).toBeChecked();
await page.getByRole('radio', { name: '小游戏' }).click();
await expect(page.getByRole('radio', { name: '直接使用所选文件夹(默认)' })).toBeChecked();
await page.getByRole('button', { name: '选择路径' }).click();
await expect(page.getByLabel('项目路径')).toHaveValue(parentPath);
await page.getByRole('button', { name: '确认创建' }).click();
await expect(page.getByTestId('project-configuration-page')).toBeVisible();
await expect(page.getByTestId('sidebar-nav-publish')).toHaveCount(0);
await expect(page.getByText(/新项目还没有联系人/)).toBeVisible();
await expect(page.getByRole('button', { name: '新增伙伴' })).toBeVisible();
await page.getByTestId('resource-card-skills').click();
await expect(page.getByRole('switch', { name: '启用 Superpowers' })).toHaveAttribute('aria-checked', 'false');
await expect(page.getByText('已关闭')).toBeVisible();
await page.getByRole('button', { name: '关闭' }).click();
await expect(page.getByTestId('resource-card-publish')).toHaveCount(0);
await expect(page.getByRole('button', { name: '一键提交审核' })).toHaveCount(1);
await expect(page.getByText('自动部署', { exact: false })).toHaveCount(0);
await expect(page.getByText('部署发布检查', { exact: false })).toHaveCount(0);
} finally {
await closeElectronApp(app);
await rm(parentPath, { recursive: true, force: true });
}
});
});

View File

@@ -52,6 +52,8 @@ test.describe('NianCode provider lifecycle', () => {
try {
const relaunchedPage = await relaunchedApp.firstWindow();
await relaunchedPage.waitForLoadState('domcontentloaded');
await expect(relaunchedPage.getByTestId('ai-module-selection-page')).toBeVisible();
await relaunchedPage.getByTestId('ai-module-option-programming').click();
await expect(relaunchedPage.getByTestId('main-layout')).toBeVisible();
await relaunchedPage.getByTestId('sidebar-nav-models').click();

View File

@@ -6,6 +6,8 @@ test.describe('hover-only scrollbar visibility', () => {
try {
const page = await getStableWindow(app);
await expect(page.getByTestId('ai-module-selection-page')).toBeVisible();
await page.getByTestId('ai-module-option-programming').click();
await page.getByTestId('sidebar-nav-models').click();
await expect(page.getByTestId('models-page')).toBeVisible();

View File

@@ -28,6 +28,8 @@ test.describe('NianCode window zoom shortcuts', () => {
try {
const page = await getStableWindow(app);
await expect(page.getByTestId('ai-module-selection-page')).toBeVisible();
await page.getByTestId('ai-module-option-programming').click();
await expect(page.getByTestId('main-layout')).toBeVisible();
await app.evaluate(({ BrowserWindow }) => {