收口 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

@@ -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);
});
});