mirror of
https://github.com/langgenius/dify.git
synced 2026-05-03 17:08:03 +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,
|
modelList: rerankModelList,
|
||||||
} = useModelListAndDefaultModel(ModelTypeEnum.rerank)
|
} = useModelListAndDefaultModel(ModelTypeEnum.rerank)
|
||||||
const rerankModel = useMemo(() => {
|
const rerankModel = useMemo(() => {
|
||||||
if (!rerankingModel)
|
if (!rerankingModel?.reranking_provider_name || !rerankingModel?.reranking_model_name)
|
||||||
return undefined
|
return undefined
|
||||||
|
|
||||||
return {
|
return {
|
||||||
providerName: rerankingModel.reranking_provider_name,
|
provider: rerankingModel.reranking_provider_name,
|
||||||
modelName: rerankingModel.reranking_model_name,
|
model: rerankingModel.reranking_model_name,
|
||||||
}
|
}
|
||||||
}, [rerankingModel])
|
}, [rerankingModel])
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ const RerankingModelSelector = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<ModelSelector
|
<ModelSelector
|
||||||
defaultModel={rerankModel && { provider: rerankModel.providerName, model: rerankModel.modelName }}
|
defaultModel={rerankModel}
|
||||||
modelList={rerankModelList}
|
modelList={rerankModelList}
|
||||||
onSelect={handleRerankingModelChange}
|
onSelect={handleRerankingModelChange}
|
||||||
readonly={readonly}
|
readonly={readonly}
|
||||||
|
|||||||
Reference in New Issue
Block a user