mirror of
https://github.com/langgenius/dify.git
synced 2026-05-06 02:18:08 +08:00
Merge remote-tracking branch 'origin/main' into refactor/migrate-app-detail-to-tanstack-query
# Conflicts: # web/app/components/app/switch-app-modal/index.spec.tsx # web/app/components/workflow-app/components/workflow-header/features-trigger.spec.tsx # web/app/components/workflow-app/components/workflow-header/index.spec.tsx
This commit is contained in:
@ -21,7 +21,6 @@ const mockUseFeatures = vi.fn()
|
||||
const mockUseProviderContext = vi.fn()
|
||||
const mockUseNodes = vi.fn()
|
||||
const mockUseEdges = vi.fn()
|
||||
const mockUseAppStoreSelector = vi.fn()
|
||||
|
||||
const mockNotify = vi.fn()
|
||||
const mockHandleCheckBeforePublish = vi.fn()
|
||||
@ -137,10 +136,6 @@ vi.mock('@/hooks/use-theme', () => ({
|
||||
default: () => mockUseTheme(),
|
||||
}))
|
||||
|
||||
vi.mock('@/app/components/app/store', () => ({
|
||||
useStore: (selector: (state: { appDetail?: { id: string } }) => unknown) => mockUseAppStoreSelector(selector),
|
||||
}))
|
||||
|
||||
const createProviderContext = ({
|
||||
type = Plan.sandbox,
|
||||
isFetchedPlan = true,
|
||||
@ -181,7 +176,6 @@ describe('FeaturesTrigger', () => {
|
||||
mockUseProviderContext.mockReturnValue(createProviderContext({}))
|
||||
mockUseNodes.mockReturnValue([])
|
||||
mockUseEdges.mockReturnValue([])
|
||||
mockUseAppStoreSelector.mockImplementation(selector => selector({ appDetail: { id: 'app-id' } }))
|
||||
mockPublishWorkflow.mockResolvedValue({ created_at: '2024-01-01T00:00:00Z' })
|
||||
})
|
||||
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
import type { IChatItem } from '@/app/components/base/chat/chat/type'
|
||||
import type { HeaderProps } from '@/app/components/workflow/header'
|
||||
import type { App } from '@/types/app'
|
||||
import { fireEvent, render, screen } from '@testing-library/react'
|
||||
import { cleanup, fireEvent, render, screen } from '@testing-library/react'
|
||||
import { useStore as useAppStore } from '@/app/components/app/store'
|
||||
import { AppModeEnum } from '@/types/app'
|
||||
import WorkflowHeader from './index'
|
||||
|
||||
const mockSetCurrentLogItem = vi.fn()
|
||||
const mockSetShowMessageLogModal = vi.fn()
|
||||
const mockResetWorkflowVersionHistory = vi.fn()
|
||||
const mockUseAppDetail = vi.fn()
|
||||
|
||||
@ -39,9 +39,10 @@ const createMockApp = (overrides: Partial<App> = {}): App => ({
|
||||
...overrides,
|
||||
})
|
||||
|
||||
const mockAppStore = (overrides: Partial<App> = {}) => {
|
||||
const setupAppDetail = (overrides: Partial<App> = {}) => {
|
||||
const appDetail = createMockApp(overrides)
|
||||
mockUseAppDetail.mockReturnValue({ data: appDetail })
|
||||
return appDetail
|
||||
}
|
||||
|
||||
vi.mock('next/navigation', () => ({
|
||||
@ -52,13 +53,6 @@ vi.mock('@/service/use-apps', () => ({
|
||||
useAppDetail: (...args: unknown[]) => mockUseAppDetail(...args),
|
||||
}))
|
||||
|
||||
vi.mock('@/app/components/app/store', () => ({
|
||||
useStore: (selector: (state: { setCurrentLogItem: typeof mockSetCurrentLogItem, setShowMessageLogModal: typeof mockSetShowMessageLogModal }) => unknown) => selector({
|
||||
setCurrentLogItem: mockSetCurrentLogItem,
|
||||
setShowMessageLogModal: mockSetShowMessageLogModal,
|
||||
}),
|
||||
}))
|
||||
|
||||
vi.mock('@/app/components/workflow/header', () => ({
|
||||
default: (props: HeaderProps) => {
|
||||
return (
|
||||
@ -92,7 +86,12 @@ vi.mock('@/service/use-workflow', () => ({
|
||||
describe('WorkflowHeader', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
mockAppStore()
|
||||
setupAppDetail()
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
// Cleanup before zustand mock resets store to avoid re-render with undefined appDetail
|
||||
cleanup()
|
||||
})
|
||||
|
||||
// Verifies the wrapper renders the workflow header shell.
|
||||
@ -110,7 +109,7 @@ describe('WorkflowHeader', () => {
|
||||
describe('Props', () => {
|
||||
it('should configure preview mode when app is in advanced chat mode', () => {
|
||||
// Arrange
|
||||
mockAppStore({ mode: AppModeEnum.ADVANCED_CHAT })
|
||||
setupAppDetail({ mode: AppModeEnum.ADVANCED_CHAT })
|
||||
|
||||
// Act
|
||||
render(<WorkflowHeader />)
|
||||
@ -124,7 +123,7 @@ describe('WorkflowHeader', () => {
|
||||
|
||||
it('should configure run mode when app is not in advanced chat mode', () => {
|
||||
// Arrange
|
||||
mockAppStore({ mode: AppModeEnum.COMPLETION })
|
||||
setupAppDetail({ mode: AppModeEnum.COMPLETION })
|
||||
|
||||
// Act
|
||||
render(<WorkflowHeader />)
|
||||
@ -141,14 +140,18 @@ describe('WorkflowHeader', () => {
|
||||
describe('User Interactions', () => {
|
||||
it('should clear log and close message modal when clearing history modal state', () => {
|
||||
// Arrange
|
||||
useAppStore.setState({
|
||||
currentLogItem: { id: 'log-item' } as unknown as IChatItem,
|
||||
showMessageLogModal: true,
|
||||
})
|
||||
render(<WorkflowHeader />)
|
||||
|
||||
// Act
|
||||
fireEvent.click(screen.getByRole('button', { name: /clear-history/i }))
|
||||
|
||||
// Assert
|
||||
expect(mockSetCurrentLogItem).toHaveBeenCalledWith()
|
||||
expect(mockSetShowMessageLogModal).toHaveBeenCalledWith(false)
|
||||
// Assert - verify store state was updated
|
||||
expect(useAppStore.getState().currentLogItem).toBeUndefined()
|
||||
expect(useAppStore.getState().showMessageLogModal).toBe(false)
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user