feat: 前端集成 Prettier 代码格式化
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import userEvent from '@testing-library/user-event';
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
||||
import { ModelTable } from '@/pages/Providers/ModelTable';
|
||||
import type { Model } from '@/types';
|
||||
import { render, screen } from '@testing-library/react'
|
||||
import userEvent from '@testing-library/user-event'
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
||||
import { ModelTable } from '@/pages/Providers/ModelTable'
|
||||
import type { Model } from '@/types'
|
||||
|
||||
const mockModels: Model[] = [
|
||||
{
|
||||
@@ -21,103 +21,103 @@ const mockModels: Model[] = [
|
||||
createdAt: '2024-01-02T00:00:00Z',
|
||||
unifiedId: 'openai/gpt-3.5-turbo',
|
||||
},
|
||||
];
|
||||
]
|
||||
|
||||
const mockMutate = vi.fn();
|
||||
const mockMutate = vi.fn()
|
||||
|
||||
vi.mock('@/hooks/useModels', () => ({
|
||||
useModels: vi.fn((providerId: string) => {
|
||||
if (providerId === 'openai') {
|
||||
return { data: mockModels, isLoading: false };
|
||||
return { data: mockModels, isLoading: false }
|
||||
}
|
||||
return { data: [], isLoading: false };
|
||||
return { data: [], isLoading: false }
|
||||
}),
|
||||
useDeleteModel: vi.fn(() => ({ mutate: mockMutate })),
|
||||
}));
|
||||
}))
|
||||
|
||||
const defaultProps = {
|
||||
providerId: 'openai',
|
||||
onAdd: vi.fn(),
|
||||
onEdit: vi.fn(),
|
||||
};
|
||||
}
|
||||
|
||||
describe('ModelTable', () => {
|
||||
beforeEach(() => {
|
||||
mockMutate.mockClear();
|
||||
});
|
||||
mockMutate.mockClear()
|
||||
})
|
||||
|
||||
it('renders model list with unified ID and model name', () => {
|
||||
render(<ModelTable {...defaultProps} />);
|
||||
render(<ModelTable {...defaultProps} />)
|
||||
|
||||
expect(screen.getByText(/关联模型/)).toBeInTheDocument();
|
||||
expect(screen.getByText('openai/gpt-4o')).toBeInTheDocument();
|
||||
expect(screen.getByText('openai/gpt-3.5-turbo')).toBeInTheDocument();
|
||||
expect(screen.getByText('gpt-4o')).toBeInTheDocument();
|
||||
expect(screen.getByText('gpt-3.5-turbo')).toBeInTheDocument();
|
||||
});
|
||||
expect(screen.getByText(/关联模型/)).toBeInTheDocument()
|
||||
expect(screen.getByText('openai/gpt-4o')).toBeInTheDocument()
|
||||
expect(screen.getByText('openai/gpt-3.5-turbo')).toBeInTheDocument()
|
||||
expect(screen.getByText('gpt-4o')).toBeInTheDocument()
|
||||
expect(screen.getByText('gpt-3.5-turbo')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('renders status tags correctly', () => {
|
||||
render(<ModelTable {...defaultProps} />);
|
||||
render(<ModelTable {...defaultProps} />)
|
||||
|
||||
const enabledTags = screen.getAllByText('启用');
|
||||
const disabledTags = screen.getAllByText('禁用');
|
||||
expect(enabledTags.length).toBeGreaterThanOrEqual(1);
|
||||
expect(disabledTags.length).toBeGreaterThanOrEqual(1);
|
||||
});
|
||||
const enabledTags = screen.getAllByText('启用')
|
||||
const disabledTags = screen.getAllByText('禁用')
|
||||
expect(enabledTags.length).toBeGreaterThanOrEqual(1)
|
||||
expect(disabledTags.length).toBeGreaterThanOrEqual(1)
|
||||
})
|
||||
|
||||
it('calls onAdd when clicking "添加模型" button', async () => {
|
||||
const user = userEvent.setup();
|
||||
const onAdd = vi.fn();
|
||||
render(<ModelTable {...defaultProps} onAdd={onAdd} />);
|
||||
const user = userEvent.setup()
|
||||
const onAdd = vi.fn()
|
||||
render(<ModelTable {...defaultProps} onAdd={onAdd} />)
|
||||
|
||||
await user.click(screen.getByRole('button', { name: '添加模型' }));
|
||||
expect(onAdd).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
await user.click(screen.getByRole('button', { name: '添加模型' }))
|
||||
expect(onAdd).toHaveBeenCalledTimes(1)
|
||||
})
|
||||
|
||||
it('calls onEdit with correct model when clicking "编辑"', async () => {
|
||||
const user = userEvent.setup();
|
||||
const onEdit = vi.fn();
|
||||
render(<ModelTable {...defaultProps} onEdit={onEdit} />);
|
||||
const user = userEvent.setup()
|
||||
const onEdit = vi.fn()
|
||||
render(<ModelTable {...defaultProps} onEdit={onEdit} />)
|
||||
|
||||
const editButtons = screen.getAllByRole('button', { name: /编 ?辑/ });
|
||||
await user.click(editButtons[0]);
|
||||
const editButtons = screen.getAllByRole('button', { name: /编 ?辑/ })
|
||||
await user.click(editButtons[0])
|
||||
|
||||
expect(onEdit).toHaveBeenCalledTimes(1);
|
||||
expect(onEdit).toHaveBeenCalledWith(mockModels[0]);
|
||||
});
|
||||
expect(onEdit).toHaveBeenCalledTimes(1)
|
||||
expect(onEdit).toHaveBeenCalledWith(mockModels[0])
|
||||
})
|
||||
|
||||
it('calls deleteModel.mutate with correct model ID when delete is confirmed', async () => {
|
||||
const user = userEvent.setup();
|
||||
const user = userEvent.setup()
|
||||
|
||||
render(<ModelTable {...defaultProps} />);
|
||||
render(<ModelTable {...defaultProps} />)
|
||||
|
||||
// Find and click the delete button for the first row
|
||||
const deleteButtons = screen.getAllByRole('button', { name: '删除' });
|
||||
await user.click(deleteButtons[0]);
|
||||
const deleteButtons = screen.getAllByRole('button', { name: '删除' })
|
||||
await user.click(deleteButtons[0])
|
||||
|
||||
// TDesign Popconfirm renders confirmation popup with "确定" button
|
||||
const confirmButton = await screen.findByRole('button', { name: '确定' });
|
||||
await user.click(confirmButton);
|
||||
const confirmButton = await screen.findByRole('button', { name: '确定' })
|
||||
await user.click(confirmButton)
|
||||
|
||||
// Assert that deleteModel.mutate was called with the correct model ID
|
||||
expect(mockMutate).toHaveBeenCalledTimes(1);
|
||||
expect(mockMutate).toHaveBeenCalledWith('model-1');
|
||||
}, 10000);
|
||||
expect(mockMutate).toHaveBeenCalledTimes(1)
|
||||
expect(mockMutate).toHaveBeenCalledWith('model-1')
|
||||
}, 10000)
|
||||
|
||||
it('shows custom empty text when models list is empty', () => {
|
||||
render(<ModelTable providerId="anthropic" />);
|
||||
expect(screen.getByText('暂无模型,点击上方按钮添加')).toBeInTheDocument();
|
||||
});
|
||||
render(<ModelTable providerId='anthropic' />)
|
||||
expect(screen.getByText('暂无模型,点击上方按钮添加')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('does not render add button when onAdd is not provided', () => {
|
||||
render(<ModelTable providerId="openai" />);
|
||||
render(<ModelTable providerId='openai' />)
|
||||
|
||||
expect(screen.queryByRole('button', { name: '添加模型' })).not.toBeInTheDocument();
|
||||
});
|
||||
expect(screen.queryByRole('button', { name: '添加模型' })).not.toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('does not render edit button when onEdit is not provided', () => {
|
||||
render(<ModelTable providerId="openai" onAdd={vi.fn()} />);
|
||||
render(<ModelTable providerId='openai' onAdd={vi.fn()} />)
|
||||
|
||||
expect(screen.queryByRole('button', { name: /编 ?辑/ })).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
expect(screen.queryByRole('button', { name: /编 ?辑/ })).not.toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user