收口 Makelore 客户端变更
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
115
tests/e2e/project-configuration-skills.spec.ts
Normal file
115
tests/e2e/project-configuration-skills.spec.ts
Normal 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 });
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -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 });
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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 }) => {
|
||||
|
||||
Reference in New Issue
Block a user