补充AGC模型目录异常revision的客户端用例
- 补充旧服务端不返回 revision(两次响应均为 undefined)时仍按目录变化刷新的用例 - 补充服务端目录重建导致 revision 回退(7 到 0)时仍更新界面的用例 - 补充 revision 未变化时不更新界面、沿用已应用目录的用例
This commit is contained in:
@@ -400,3 +400,73 @@ test('reuses a single in-flight catalog request', async () => {
|
||||
await waitFor(() => expect(loadClientLlmModels).toHaveBeenCalledTimes(2));
|
||||
expect(loadClientLlmModels).toHaveBeenCalledTimes(2);
|
||||
});
|
||||
|
||||
test('keeps refreshing when the server omits the catalog revision', async () => {
|
||||
vi.mocked(loadClientLlmModels).mockResolvedValue({
|
||||
defaultModelId: 'quality',
|
||||
models: [
|
||||
{ id: 'quality', displayName: '高质量' },
|
||||
{ id: 'fast', displayName: '快速' },
|
||||
],
|
||||
revision: undefined as unknown as number,
|
||||
});
|
||||
const onReady = vi.fn();
|
||||
render(<ConversationModelSelect disabled={false} onReady={onReady} />);
|
||||
await waitFor(() => expect(onReady).toHaveBeenLastCalledWith(true));
|
||||
|
||||
// 旧服务端不返回 revision 时,两次响应的 revision 都是 undefined,
|
||||
// 不能因此判定「未变化」而停止刷新。
|
||||
vi.mocked(loadClientLlmModels).mockResolvedValue({
|
||||
defaultModelId: 'quality',
|
||||
models: [
|
||||
{ id: 'quality', displayName: '高质量' },
|
||||
{ id: 'vision', displayName: '视觉' },
|
||||
],
|
||||
revision: undefined as unknown as number,
|
||||
});
|
||||
fireEvent(window, new Event('focus'));
|
||||
await waitFor(() => expect(loadClientLlmModels).toHaveBeenCalledTimes(2));
|
||||
fireEvent.click(screen.getByRole('button', { name: '对话模型' }));
|
||||
expect(await screen.findByRole('option', { name: '视觉' })).not.toBeNull();
|
||||
});
|
||||
|
||||
test('applies a catalog when the revision goes backwards', async () => {
|
||||
const onReady = vi.fn();
|
||||
render(<ConversationModelSelect disabled={false} onReady={onReady} />);
|
||||
await waitFor(() => expect(onReady).toHaveBeenLastCalledWith(true));
|
||||
|
||||
// 服务端目录重建后 revision 可能回退,仍要按「已变化」处理。
|
||||
vi.mocked(loadClientLlmModels).mockResolvedValue({
|
||||
defaultModelId: 'quality',
|
||||
models: [
|
||||
{ id: 'quality', displayName: '高质量' },
|
||||
{ id: 'vision', displayName: '视觉' },
|
||||
],
|
||||
revision: 0,
|
||||
});
|
||||
fireEvent(window, new Event('focus'));
|
||||
await waitFor(() => expect(loadClientLlmModels).toHaveBeenCalledTimes(2));
|
||||
fireEvent.click(screen.getByRole('button', { name: '对话模型' }));
|
||||
expect(await screen.findByRole('option', { name: '视觉' })).not.toBeNull();
|
||||
});
|
||||
|
||||
test('keeps the applied catalog when the revision is unchanged', async () => {
|
||||
const onReady = vi.fn();
|
||||
render(<ConversationModelSelect disabled={false} onReady={onReady} />);
|
||||
await waitFor(() => expect(onReady).toHaveBeenLastCalledWith(true));
|
||||
|
||||
// revision 未变化时不更新界面,沿用已应用的目录。
|
||||
vi.mocked(loadClientLlmModels).mockResolvedValue({
|
||||
defaultModelId: 'quality',
|
||||
models: [
|
||||
{ id: 'quality', displayName: '高质量' },
|
||||
{ id: 'vision', displayName: '视觉' },
|
||||
],
|
||||
revision: 1,
|
||||
});
|
||||
fireEvent(window, new Event('focus'));
|
||||
await waitFor(() => expect(loadClientLlmModels).toHaveBeenCalledTimes(2));
|
||||
fireEvent.click(screen.getByRole('button', { name: '对话模型' }));
|
||||
expect(screen.queryByRole('option', { name: '视觉' })).toBeNull();
|
||||
expect(screen.getByRole('option', { name: '快速' })).not.toBeNull();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user