mirror of
https://github.com/langgenius/dify.git
synced 2026-03-21 06:18:27 +08:00
test: add unit tests for RerankingModelSelector component
This commit is contained in:
@ -0,0 +1,121 @@
|
||||
import type {
|
||||
DefaultModel,
|
||||
Model,
|
||||
ModelItem,
|
||||
} from '@/app/components/header/account-setting/model-provider-page/declarations'
|
||||
import { fireEvent, render, screen } from '@testing-library/react'
|
||||
import {
|
||||
ConfigurationMethodEnum,
|
||||
ModelStatusEnum,
|
||||
ModelTypeEnum,
|
||||
} from '@/app/components/header/account-setting/model-provider-page/declarations'
|
||||
import RerankingModelSelector from './reranking-model-selector'
|
||||
|
||||
type MockModelSelectorProps = {
|
||||
defaultModel?: DefaultModel
|
||||
modelList: Model[]
|
||||
onSelect?: (model: DefaultModel) => void
|
||||
}
|
||||
|
||||
const mockUseModelListAndDefaultModel = vi.hoisted(() => vi.fn())
|
||||
|
||||
vi.mock('@/app/components/header/account-setting/model-provider-page/hooks', () => ({
|
||||
useModelListAndDefaultModel: mockUseModelListAndDefaultModel,
|
||||
}))
|
||||
|
||||
vi.mock('@/app/components/header/account-setting/model-provider-page/model-selector', () => ({
|
||||
default: ({ defaultModel, modelList, onSelect }: MockModelSelectorProps) => (
|
||||
<div>
|
||||
<div data-testid="default-model">
|
||||
{defaultModel ? `${defaultModel.provider}/${defaultModel.model}` : 'no-default-model'}
|
||||
</div>
|
||||
<div data-testid="model-list-count">{modelList.length}</div>
|
||||
<button type="button" onClick={() => onSelect?.({ provider: 'cohere', model: 'rerank-v3' })}>
|
||||
select-model
|
||||
</button>
|
||||
</div>
|
||||
),
|
||||
}))
|
||||
|
||||
const createModelItem = (overrides: Partial<ModelItem> = {}): ModelItem => ({
|
||||
model: 'rerank-v3',
|
||||
label: { en_US: 'Rerank V3', zh_Hans: 'Rerank V3' },
|
||||
model_type: ModelTypeEnum.rerank,
|
||||
fetch_from: ConfigurationMethodEnum.predefinedModel,
|
||||
status: ModelStatusEnum.active,
|
||||
model_properties: {},
|
||||
load_balancing_enabled: false,
|
||||
...overrides,
|
||||
})
|
||||
|
||||
const createModel = (overrides: Partial<Model> = {}): Model => ({
|
||||
provider: 'cohere',
|
||||
icon_small: {
|
||||
en_US: 'https://example.com/cohere.png',
|
||||
zh_Hans: 'https://example.com/cohere.png',
|
||||
},
|
||||
icon_small_dark: {
|
||||
en_US: 'https://example.com/cohere-dark.png',
|
||||
zh_Hans: 'https://example.com/cohere-dark.png',
|
||||
},
|
||||
label: { en_US: 'Cohere', zh_Hans: 'Cohere' },
|
||||
models: [createModelItem()],
|
||||
status: ModelStatusEnum.active,
|
||||
...overrides,
|
||||
})
|
||||
|
||||
describe('RerankingModelSelector', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
mockUseModelListAndDefaultModel.mockReturnValue({
|
||||
modelList: [createModel()],
|
||||
defaultModel: undefined,
|
||||
})
|
||||
})
|
||||
|
||||
// Rendering behavior for mapped rerank model state.
|
||||
describe('Rendering', () => {
|
||||
it('should not pass a default model when reranking model fields are empty strings', () => {
|
||||
render(
|
||||
<RerankingModelSelector
|
||||
rerankingModel={{
|
||||
reranking_provider_name: '',
|
||||
reranking_model_name: '',
|
||||
}}
|
||||
/>,
|
||||
)
|
||||
|
||||
expect(screen.getByTestId('default-model')).toHaveTextContent('no-default-model')
|
||||
expect(screen.getByTestId('model-list-count')).toHaveTextContent('1')
|
||||
})
|
||||
|
||||
it('should map reranking model to default model when both fields exist', () => {
|
||||
render(
|
||||
<RerankingModelSelector
|
||||
rerankingModel={{
|
||||
reranking_provider_name: 'cohere',
|
||||
reranking_model_name: 'rerank-v3',
|
||||
}}
|
||||
/>,
|
||||
)
|
||||
|
||||
expect(screen.getByTestId('default-model')).toHaveTextContent('cohere/rerank-v3')
|
||||
})
|
||||
})
|
||||
|
||||
// Selection behavior should convert back to workflow reranking model shape.
|
||||
describe('Interactions', () => {
|
||||
it('should map selected model back to reranking model fields', () => {
|
||||
const onRerankingModelChange = vi.fn()
|
||||
|
||||
render(<RerankingModelSelector onRerankingModelChange={onRerankingModelChange} />)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: 'select-model' }))
|
||||
|
||||
expect(onRerankingModelChange).toHaveBeenCalledWith({
|
||||
reranking_provider_name: 'cohere',
|
||||
reranking_model_name: 'rerank-v3',
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
@ -22,12 +22,12 @@ const RerankingModelSelector = ({
|
||||
modelList: rerankModelList,
|
||||
} = useModelListAndDefaultModel(ModelTypeEnum.rerank)
|
||||
const rerankModel = useMemo(() => {
|
||||
if (!rerankingModel)
|
||||
if (!rerankingModel?.reranking_provider_name || !rerankingModel?.reranking_model_name)
|
||||
return undefined
|
||||
|
||||
return {
|
||||
providerName: rerankingModel.reranking_provider_name,
|
||||
modelName: rerankingModel.reranking_model_name,
|
||||
provider: rerankingModel.reranking_provider_name,
|
||||
model: rerankingModel.reranking_model_name,
|
||||
}
|
||||
}, [rerankingModel])
|
||||
|
||||
@ -40,7 +40,7 @@ const RerankingModelSelector = ({
|
||||
|
||||
return (
|
||||
<ModelSelector
|
||||
defaultModel={rerankModel && { provider: rerankModel.providerName, model: rerankModel.modelName }}
|
||||
defaultModel={rerankModel}
|
||||
modelList={rerankModelList}
|
||||
onSelect={handleRerankingModelChange}
|
||||
readonly={readonly}
|
||||
|
||||
Reference in New Issue
Block a user