test: enhance ModelSelectorTrigger tests and integrate credential panel state

- Added tests for ModelSelectorTrigger to validate rendering based on credential panel state, including handling of credits exhausted scenarios.
- Updated ModelSelectorTrigger component to utilize useCredentialPanelState for determining status and rendering appropriate UI elements.
- Adjusted related tests to ensure correct behavior when model quota is exceeded and when the selected model is readonly.
- Improved styling for credits exhausted badge in the component.
This commit is contained in:
CodingOnStar
2026-03-11 11:09:03 +08:00
parent e8ade9ad64
commit 5709a34a7f
5 changed files with 130 additions and 11 deletions

View File

@ -701,8 +701,8 @@ describe('update-plugin', () => {
})
})
it('should show error toast when task status is failed', async () => {
// Arrange - covers lines 99-100
it('should reset loading state when task status check fails', async () => {
// Arrange
const mockToastNotify = vi.fn()
vi.mocked(await import('../../../base/toast')).default.notify = mockToastNotify
@ -739,6 +739,53 @@ describe('update-plugin', () => {
})
// onSave should NOT be called when task fails
expect(onSave).not.toHaveBeenCalled()
await waitFor(() => {
expect(screen.getByRole('button', { name: 'plugin.upgrade.upgrade' })).toBeInTheDocument()
})
expect(screen.getByRole('button', { name: 'common.operation.cancel' })).toBeInTheDocument()
})
it('should stop loading when upgrade API returns failed task directly', async () => {
// Arrange
const mockToastNotify = vi.fn()
vi.mocked(await import('../../../base/toast')).default.notify = mockToastNotify
mockUpdateFromMarketPlace.mockResolvedValue({
task: {
status: TaskStatus.failed,
plugins: [{
plugin_unique_identifier: 'test-target-id',
status: TaskStatus.failed,
message: 'failed to init environment',
}],
},
})
const onSave = vi.fn()
const payload = createMockMarketPlacePayload()
// Act
renderWithQueryClient(
<UpdateFromMarketplace
payload={payload}
onSave={onSave}
onCancel={vi.fn()}
/>,
)
fireEvent.click(screen.getByRole('button', { name: 'plugin.upgrade.upgrade' }))
// Assert
await waitFor(() => {
expect(mockToastNotify).toHaveBeenCalledWith({
type: 'error',
message: 'failed to init environment',
})
})
expect(mockCheck).not.toHaveBeenCalled()
expect(onSave).not.toHaveBeenCalled()
await waitFor(() => {
expect(screen.getByRole('button', { name: 'plugin.upgrade.upgrade' })).toBeInTheDocument()
})
expect(screen.getByRole('button', { name: 'common.operation.cancel' })).toBeInTheDocument()
})
})

View File

@ -33,6 +33,16 @@ type Props = {
isShowDowngradeWarningModal?: boolean
}
type FailedUpgradeResponse = {
task?: {
status?: TaskStatus
plugins?: Array<{
plugin_unique_identifier: string
message: string
}>
}
}
enum UploadStep {
notStarted = 'notStarted',
upgrading = 'upgrading',
@ -83,13 +93,20 @@ const UpdatePluginModal: FC<Props> = ({
if (uploadStep === UploadStep.notStarted) {
setUploadStep(UploadStep.upgrading)
try {
const response = await updateFromMarketPlace({
original_plugin_unique_identifier: originalPackageInfo.id,
new_plugin_unique_identifier: targetPackageInfo.id,
}) as Awaited<ReturnType<typeof updateFromMarketPlace>> & FailedUpgradeResponse
if (response.task?.status === TaskStatus.failed) {
setUploadStep(UploadStep.notStarted)
return
}
const {
all_installed: isInstalled,
task_id: taskId,
} = await updateFromMarketPlace({
original_plugin_unique_identifier: originalPackageInfo.id,
new_plugin_unique_identifier: targetPackageInfo.id,
})
} = response
if (isInstalled) {
onSave()
@ -102,6 +119,7 @@ const UpdatePluginModal: FC<Props> = ({
})
if (status === TaskStatus.failed) {
Toast.notify({ type: 'error', message: error! })
setUploadStep(UploadStep.notStarted)
return
}
onSave()