import { beforeEach, describe, expect, it, vi } from 'vitest' const mockGet = vi.fn() const mockPut = vi.fn() const mockDelete = vi.fn() const mockUseApi = vi.fn((_options?: unknown) => ({ get: mockGet, put: mockPut, delete: mockDelete, })) vi.mock('../../composables/useApi', () => ({ useApi: (options: unknown) => mockUseApi(options), })) import { useBioTemplatePackWorkspace } from '../../composables/useBioTemplatePackWorkspace' describe('useBioTemplatePackWorkspace', () => { beforeEach(() => { vi.clearAllMocks() mockGet.mockResolvedValue({}) mockPut.mockResolvedValue({}) mockDelete.mockResolvedValue({}) window.history.replaceState({}, '', '/') }) it('creates renderer props and component bindings from one pack id', () => { const workspace = useBioTemplatePackWorkspace('cell culture') expect(workspace.packId).toBe('cell-culture-screen') expect(workspace.pack.templates).toContain('dose-response') expect(workspace.collection.value.metadata?.pack).toBe('cell-culture-screen') expect(workspace.templateIds.value).toEqual([ 'sample-sheet', 'sample-prep', 'plate-map', 'reagent-list', 'protocol-steps', 'dose-response', 'flow-cytometry-panel', ]) expect(workspace.renderer.value.target).toBe(workspace.collection.value) expect(workspace.workspace.value.renderer?.target).toBe(workspace.collection.value) expect(workspace.form.value).toBe(workspace.workspace.value.form) expect(workspace.form.value.modelValue).toBe(workspace.workspace.value.values) expect(workspace.sidebar.value).toBe(workspace.workspace.value.sidebar) expect(workspace.sidebar.value.values).toBe(workspace.workspace.value.values) expect(workspace.sidebar.value.activeView).toBe('design') expect(workspace.topBar.value).toBe(workspace.workspace.value.topBar.value) expect(workspace.pillNav.value).toBe(workspace.workspace.value.pillNav) expect(workspace.pillNav.value.items.map(item => item.id)).toContain('design') expect(workspace.topBarSettings.value).toBe(workspace.workspace.value.topBarSettings) expect(workspace.bindings.value).toBe(workspace.workspace.value.bindings) expect(workspace.bindings.value.form).toBe(workspace.form.value) expect(workspace.bindings.value.topBar.value.currentPillId).toBe('design') expect(workspace.topBarSettings.value.settingsConfig.values).toBe(workspace.workspace.value.values) expect(workspace.sidebar.value.panels.design.map(panel => panel.id)).toContain('dose') expect(workspace.componentBindings.value.map(binding => binding.component)).toContain('DoseCalculator') expect(workspace.componentBindingsById.value['dose-response:DoseCalculator'].component).toBe('DoseCalculator') expect(workspace.componentBindingsById.value['dose-response:DoseCalculator'].props.mode).toBe('serial') expect(workspace.componentProps.value.map(binding => binding.component)).toContain('PlateEditor') expect(workspace.componentPropsById.value['plate-map:WellPlate'].wells).toBeDefined() expect(workspace.bindings.value.componentPropsById['plate-map:WellPlate'].wells).toBeDefined() expect(workspace.bindings.value.componentBindingsById['plate-map:WellPlate'].props.wells).toBeDefined() expect(workspace.componentPropsByComponent.value.WellPlate.length).toBeGreaterThan(0) expect(workspace.getComponentProps('WellPlate')?.wells).toBeDefined() expect(workspace.bindings.value.getComponentProps('WellPlate')?.wells).toBeDefined() expect(workspace.componentUsage.value?.template).toContain(' { const workspace = useBioTemplatePackWorkspace('omics-assay') const inner = workspace.workspace.value expect(workspace.pillNav.value.items.map(item => item.id)).toEqual([ 'design', 'run', 'analysis', ]) expect(inner.activeView.value).toBe('design') workspace.pillNav.value.onSelect({ id: 'analysis', label: 'Analysis' }) expect(inner.activeView.value).toBe('analysis') expect(workspace.sidebar.value.activeView).toBe('analysis') expect(workspace.topBar.value.currentPillId).toBe('analysis') expect(workspace.bindings.value.topBar.value.currentPillId).toBe('analysis') workspace.topBar.value.onPillSelect({ id: 'run', label: 'Run' }) expect(inner.activeView.value).toBe('run') expect(workspace.sidebar.value.activeView).toBe('run') expect(workspace.pillNav.value.currentItemId).toBe('run') expect(workspace.bindings.value.topBar.value.currentPillId).toBe('run') }) it('applies and resets pack collections', () => { const workspace = useBioTemplatePackWorkspace('longitudinal-study') workspace.applyCollection({ templates: {}, metadata: { source: 'empty' } }) expect(workspace.templateIds.value).toEqual([]) expect(workspace.collection.value.metadata?.source).toBe('empty') workspace.resetToDefaultCollection() expect(workspace.collection.value.metadata?.pack).toBe('longitudinal-study') expect(workspace.templateIds.value).toEqual([ 'sample-sheet', 'time-course', 'protocol-steps', 'assay-matrix', ]) }) it('saves the generated pack collection through current experiment wiring', async () => { window.history.replaceState({}, '', '/experiments/42/templates') const workspace = useBioTemplatePackWorkspace('molecular-assay', { pluginId: 'p1' }) const ok = await workspace.saveCurrent() expect(ok).toBe(true) expect(mockPut).toHaveBeenCalledWith('/experiments/42/data', { plugin_id: 'p1', data: workspace.collection.value, schema_version: '1.0', }) }) })