diff --git a/web/app/components/base/prompt-editor/plugins/hitl-input-block/__tests__/variable-block.spec.tsx b/web/app/components/base/prompt-editor/plugins/hitl-input-block/__tests__/variable-block.spec.tsx index f16951aed1..c8c6bd2d36 100644 --- a/web/app/components/base/prompt-editor/plugins/hitl-input-block/__tests__/variable-block.spec.tsx +++ b/web/app/components/base/prompt-editor/plugins/hitl-input-block/__tests__/variable-block.spec.tsx @@ -33,7 +33,7 @@ const createWorkflowNodesMap = (title = 'Node One'): WorkflowNodesMap => ({ }) const hasErrorIcon = (container: HTMLElement) => { - return container.querySelector('svg.text-text-destructive') !== null + return container.querySelector('svg.text-text-warning') !== null } const renderVariableBlock = (props: { diff --git a/web/app/components/datasets/settings/form/__tests__/index.spec.tsx b/web/app/components/datasets/settings/form/__tests__/index.spec.tsx index b2a2e3c9d8..7048059736 100644 --- a/web/app/components/datasets/settings/form/__tests__/index.spec.tsx +++ b/web/app/components/datasets/settings/form/__tests__/index.spec.tsx @@ -127,6 +127,14 @@ vi.mock('@/service/use-common', () => ({ ], }, }), + useCurrentWorkspace: () => ({ + data: { + trial_credits: 1000, + trial_credits_used: 100, + next_credit_reset_date: undefined, + }, + isPending: false, + }), })) vi.mock('@/app/components/header/account-setting/model-provider-page/hooks', () => ({ diff --git a/web/app/components/datasets/settings/form/components/__tests__/indexing-section.spec.tsx b/web/app/components/datasets/settings/form/components/__tests__/indexing-section.spec.tsx index f49bdbc576..2f771d4c25 100644 --- a/web/app/components/datasets/settings/form/components/__tests__/indexing-section.spec.tsx +++ b/web/app/components/datasets/settings/form/components/__tests__/indexing-section.spec.tsx @@ -30,6 +30,21 @@ vi.mock('@/context/app-context', () => ({ }, })) +vi.mock('@/service/use-common', async () => { + const actual = await vi.importActual('@/service/use-common') + return { + ...actual, + useCurrentWorkspace: () => ({ + data: { + trial_credits: 1000, + trial_credits_used: 100, + next_credit_reset_date: undefined, + }, + isPending: false, + }), + } +}) + // Mock model-provider-page hooks vi.mock('@/app/components/header/account-setting/model-provider-page/hooks', () => ({ useModelList: () => ({ data: [], mutate: vi.fn(), isLoading: false }), diff --git a/web/app/components/plugins/plugin-detail-panel/model-selector/__tests__/index.spec.tsx b/web/app/components/plugins/plugin-detail-panel/model-selector/__tests__/index.spec.tsx index e5750d007b..9b04a710e0 100644 --- a/web/app/components/plugins/plugin-detail-panel/model-selector/__tests__/index.spec.tsx +++ b/web/app/components/plugins/plugin-detail-panel/model-selector/__tests__/index.spec.tsx @@ -9,40 +9,6 @@ import ModelParameterModal from '../index' // ==================== Mock Setup ==================== -// Mock shared state for portal -let mockPortalOpenState = false - -vi.mock('@/app/components/base/portal-to-follow-elem', () => ({ - PortalToFollowElem: ({ children, open }: { children: React.ReactNode, open: boolean }) => { - mockPortalOpenState = open || false - return ( -
- {children} -
- ) - }, - PortalToFollowElemTrigger: ({ children, onClick, className }: { children: React.ReactNode, onClick: () => void, className?: string }) => ( -
- {children} -
- ), - PortalToFollowElemContent: ({ children, className }: { children: React.ReactNode, className?: string }) => { - if (!mockPortalOpenState) - return null - return ( -
- {children} -
- ) - }, -})) - -vi.mock('@/app/components/base/toast', () => ({ - default: { - notify: vi.fn(), - }, -})) - // Mock provider context const mockProviderContextValue = { isAPIKeySet: true, @@ -87,6 +53,8 @@ vi.mock('@/utils/completion-params', () => ({ fetchAndMergeValidCompletionParams: (...args: unknown[]) => mockFetchAndMergeValidCompletionParams(...args), })) +const mockToastNotify = vi.spyOn(Toast, 'notify') + // Mock child components vi.mock('@/app/components/header/account-setting/model-provider-page/model-selector', () => ({ default: ({ defaultModel, modelList, scopeFeatures, onSelect }: { @@ -108,30 +76,33 @@ vi.mock('@/app/components/header/account-setting/model-provider-page/model-selec })) vi.mock('@/app/components/header/account-setting/model-provider-page/model-parameter-modal/trigger', () => ({ - default: ({ disabled, hasDeprecated, modelDisabled, currentProvider, currentModel, providerName, modelId, isInWorkflow }: { - disabled?: boolean - hasDeprecated?: boolean - modelDisabled?: boolean + default: ({ currentProvider, currentModel, providerName, modelId, isInWorkflow }: { currentProvider?: Model currentModel?: ModelItem providerName?: string modelId?: string isInWorkflow?: boolean - }) => ( -
- Trigger -
- ), + }) => { + const hasDeprecated = !currentProvider || !currentModel + const modelDisabled = currentModel?.status !== ModelStatusEnum.active + const disabled = !mockProviderContextValue.isAPIKeySet || hasDeprecated || modelDisabled + + return ( +
+ Trigger +
+ ) + }, })) vi.mock('@/app/components/header/account-setting/model-provider-page/model-parameter-modal/agent-model-trigger', () => ({ @@ -273,7 +244,7 @@ const setupModelLists = (config: { describe('ModelParameterModal', () => { beforeEach(() => { vi.clearAllMocks() - mockPortalOpenState = false + mockToastNotify.mockReturnValue({}) mockProviderContextValue.isAPIKeySet = true mockProviderContextValue.modelProviders = [] setupModelLists() @@ -356,7 +327,7 @@ describe('ModelParameterModal', () => { render() // Assert - expect(screen.queryByTestId('portal-content')).not.toBeInTheDocument() + expect(screen.queryByTestId('model-selector')).not.toBeInTheDocument() }) it('should render model selector inside portal content when open', async () => { @@ -365,13 +336,12 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { - expect(screen.getByTestId('portal-content')).toBeInTheDocument() + expect(screen.getByTestId('model-selector')).toBeInTheDocument() }) - expect(screen.getByTestId('model-selector')).toBeInTheDocument() }) }) @@ -405,12 +375,11 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { - const content = screen.getByTestId('portal-content') - expect(content.querySelector('.custom-popup-class')).toBeInTheDocument() + expect(document.querySelector('.custom-popup-class')).toBeInTheDocument() }) }) @@ -422,7 +391,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert const selector = screen.getByTestId('model-selector') @@ -438,13 +407,13 @@ describe('ModelParameterModal', () => { // Act render() - expect(screen.queryByTestId('portal-content')).not.toBeInTheDocument() + expect(screen.queryByTestId('model-selector')).not.toBeInTheDocument() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { - expect(screen.getByTestId('portal-content')).toBeInTheDocument() + expect(screen.getByTestId('model-selector')).toBeInTheDocument() }) }) @@ -454,15 +423,15 @@ describe('ModelParameterModal', () => { // Act const { rerender } = render() - expect(screen.getByTestId('portal-elem')).toHaveAttribute('data-open', 'false') + expect(screen.queryByTestId('model-selector')).not.toBeInTheDocument() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Force a re-render to ensure state is stable rerender() // Assert - open state should remain false due to readonly - expect(screen.getByTestId('portal-elem')).toHaveAttribute('data-open', 'false') + expect(screen.queryByTestId('model-selector')).not.toBeInTheDocument() }) }) @@ -474,7 +443,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -489,7 +458,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -512,7 +481,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -530,7 +499,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -547,7 +516,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -564,7 +533,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -581,7 +550,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -598,7 +567,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -615,7 +584,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -632,7 +601,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -831,7 +800,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) await waitFor(() => { fireEvent.click(screen.getByTestId('model-selector')) @@ -856,7 +825,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) await waitFor(() => { fireEvent.click(screen.getByTestId('model-selector')) @@ -888,7 +857,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) await waitFor(() => { fireEvent.click(screen.getByTestId('model-selector')) @@ -915,7 +884,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) await waitFor(() => { fireEvent.click(screen.getByTestId('model-selector')) @@ -951,7 +920,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) await waitFor(() => { const panel = screen.getByTestId('llm-params-panel') @@ -988,7 +957,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) await waitFor(() => { const panel = screen.getByTestId('tts-params-panel') @@ -1025,7 +994,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -1051,7 +1020,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -1077,7 +1046,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -1104,12 +1073,11 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { - const content = screen.getByTestId('portal-content') - expect(content.querySelector('.bg-divider-subtle')).toBeInTheDocument() + expect(document.querySelector('.bg-divider-subtle')).toBeInTheDocument() }) }) }) @@ -1146,7 +1114,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -1185,7 +1153,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -1264,7 +1232,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert await waitFor(() => { @@ -1280,7 +1248,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert - defaultModel is created with undefined provider await waitFor(() => { @@ -1297,7 +1265,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert - defaultModel is created with undefined model await waitFor(() => { @@ -1314,7 +1282,7 @@ describe('ModelParameterModal', () => { // Act render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) // Assert - when defaultModel is undefined, attribute is not set (returns null) await waitFor(() => { @@ -1350,14 +1318,13 @@ describe('ModelParameterModal', () => { // Act const { rerender } = render() - fireEvent.click(screen.getByTestId('portal-trigger')) + fireEvent.click(screen.getByTestId('trigger')) await waitFor(() => { expect(screen.getByTestId('model-selector')).toHaveAttribute('data-model-list-count', '1') }) // Rerender with different scope - mockPortalOpenState = true rerender() // Assert @@ -1398,7 +1365,7 @@ describe('ModelParameterModal', () => { render() // Assert - const trigger = screen.getByTestId('portal-trigger') + const trigger = screen.getByTestId('trigger') expect(trigger).toBeInTheDocument() }) })