import { completeSetup, expect, test } from './fixtures/electron'; const testConfigResponses = { channelsAccounts: { success: true, channels: [ { channelType: 'feishu', defaultAccountId: 'default', status: 'connected', accounts: [ { accountId: 'default', name: 'Primary Account', configured: true, status: 'connected', isDefault: true, }, ], }, ], }, agents: { success: true, agents: [], }, credentialsValidate: { success: true, valid: true, warnings: [], }, channelConfig: { success: true, }, }; test.describe('Channels account ID validation', () => { test('rejects non-canonical custom account ID before save', async ({ electronApp, page }) => { await electronApp.evaluate(({ ipcMain }, responses) => { // eslint-disable-next-line @typescript-eslint/no-explicit-any (globalThis as any).__clawxE2eChannelConfigSaveCount = 0; ipcMain.removeHandler('hostapi:fetch'); ipcMain.handle('hostapi:fetch', async (_event, request: { path?: string; method?: string }) => { const method = request?.method ?? 'GET'; const path = request?.path ?? ''; if (path === '/api/channels/accounts' && method === 'GET') { return { ok: true, data: { status: 200, ok: true, json: responses.channelsAccounts } }; } if (path === '/api/agents' && method === 'GET') { return { ok: true, data: { status: 200, ok: true, json: responses.agents } }; } if (path === '/api/channels/credentials/validate' && method === 'POST') { return { ok: true, data: { status: 200, ok: true, json: responses.credentialsValidate } }; } if (path === '/api/channels/config' && method === 'POST') { // eslint-disable-next-line @typescript-eslint/no-explicit-any (globalThis as any).__clawxE2eChannelConfigSaveCount += 1; return { ok: true, data: { status: 200, ok: true, json: responses.channelConfig } }; } if (path.startsWith('/api/channels/config/') && method === 'GET') { return { ok: true, data: { status: 200, ok: true, json: { success: true, values: {} } } }; } return { ok: false, error: { message: `Unexpected hostapi:fetch request: ${method} ${path}` }, }; }); }, testConfigResponses); await completeSetup(page); await page.getByTestId('sidebar-nav-channels').click(); await expect(page.getByTestId('channels-page')).toBeVisible(); await expect(page.getByText('Feishu / Lark')).toBeVisible(); await page.getByRole('button', { name: /Add Account|account\.add/i }).click(); await expect(page.getByText(/Configure Feishu \/ Lark|dialog\.configureTitle/)).toBeVisible(); await page.locator('#account-id').fill('测试账号'); await page.locator('#appId').fill('cli_test'); await page.locator('#appSecret').fill('secret_test'); await page.getByRole('button', { name: /Save & Connect|dialog\.saveAndConnect/ }).click(); await expect(page.getByText(/account\.invalidCanonicalId|must use lowercase letters/i).first()).toBeVisible(); const saveCalls = await electronApp.evaluate(() => { // eslint-disable-next-line @typescript-eslint/no-explicit-any const count = Number((globalThis as any).__clawxE2eChannelConfigSaveCount || 0); return { count }; }); expect(saveCalls.count).toBe(0); }); });