fix(feishu): feishu connector name validate (#797)
Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Haze <hazeone@users.noreply.github.com>
This commit is contained in:
94
tests/e2e/channels-account-id-validation.spec.ts
Normal file
94
tests/e2e/channels-account-id-validation.spec.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user