import type { App, AppSSO } from '@/types/app' import { render, screen } from '@testing-library/react' import { useStore as useAppStore } from '@/app/components/app/store' import StartTabContent from './index' type MockWorkflowState = { setUploadStatus: ReturnType setUploadProgress: ReturnType openTab: ReturnType } const mocks = vi.hoisted(() => ({ mutateAsync: vi.fn(), existingNames: new Set(), emitTreeUpdate: vi.fn(), workflowState: { setUploadStatus: vi.fn(), setUploadProgress: vi.fn(), openTab: vi.fn(), } as MockWorkflowState, })) vi.mock('@/service/use-app-asset', () => ({ useBatchUpload: () => ({ mutateAsync: mocks.mutateAsync, }), })) vi.mock('../hooks/file-tree/data/use-skill-asset-tree', () => ({ useExistingSkillNames: () => ({ data: mocks.existingNames, }), })) vi.mock('../hooks/file-tree/data/use-skill-tree-collaboration', () => ({ useSkillTreeUpdateEmitter: () => mocks.emitTreeUpdate, })) vi.mock('@/app/components/workflow/store', () => ({ useWorkflowStore: () => ({ getState: () => mocks.workflowState, }), })) describe('StartTabContent', () => { beforeEach(() => { vi.clearAllMocks() mocks.existingNames = new Set() useAppStore.setState({ appDetail: { id: 'app-1' } as App & Partial, }) }) describe('Rendering', () => { it('should render create/import actions and template list when mounted', () => { const { container } = render() const intro = screen.getByText('skill.startTab.fileExplorerIntro') const createButton = screen.getByRole('button', { name: /workflow\.skill\.startTab\.createBlankSkill/i }) expect(intro).toBeInTheDocument() expect(createButton).toBeInTheDocument() expect(screen.getByRole('button', { name: /workflow\.skill\.startTab\.importSkill/i })).toBeInTheDocument() expect(screen.getByRole('textbox')).toBeInTheDocument() expect(screen.getByText('workflow.skill.startTab.templatesTitle')).toBeInTheDocument() expect(screen.getByRole('region', { name: 'workflow.skill.startTab.templatesTitle' })).toBeInTheDocument() expect(screen.getAllByRole('button', { name: /workflow\.skill\.startTab\.useThisSkill/i }).length).toBeGreaterThan(0) expect(intro.compareDocumentPosition(createButton) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy() expect(container.firstChild).toHaveClass('flex', 'h-full', 'min-h-0', 'w-full', 'bg-components-panel-bg') }) }) })