import { createPinia, setActivePinia } from 'pinia'; import WorkflowSettingsVue from '@/components/WorkflowSettings.vue'; import { setupServer } from '@/__tests__/server'; import { afterAll, beforeAll } from 'vitest'; import { within } from '@testing-library/vue'; import userEvent from '@testing-library/user-event'; import { useWorkflowsStore } from '@/stores/workflows.store'; import { useSettingsStore } from '@/stores/settings.store'; import { useUIStore } from '@/stores/ui.store'; import { createComponentRenderer } from '@/__tests__/render'; import { cleanupAppModals, createAppModals, getDropdownItems } from '@/__tests__/utils'; import { EnterpriseEditionFeature, WORKFLOW_SETTINGS_MODAL_KEY } from '@/constants'; import { nextTick } from 'vue'; import type { IWorkflowDb } from '@/Interface'; import * as permissions from '@/permissions'; import type { PermissionsRecord } from '@/permissions'; let pinia: ReturnType; let workflowsStore: ReturnType; let settingsStore: ReturnType; let uiStore: ReturnType; const createComponent = createComponentRenderer(WorkflowSettingsVue); describe('WorkflowSettingsVue', () => { let server: ReturnType; beforeAll(() => { server = setupServer(); }); beforeEach(async () => { pinia = createPinia(); setActivePinia(pinia); createAppModals(); workflowsStore = useWorkflowsStore(); settingsStore = useSettingsStore(); uiStore = useUIStore(); await settingsStore.getSettings(); vi.spyOn(workflowsStore, 'workflowName', 'get').mockReturnValue('Test Workflow'); vi.spyOn(workflowsStore, 'workflowId', 'get').mockReturnValue('1'); vi.spyOn(workflowsStore, 'getWorkflowById').mockReturnValue({ id: '1', name: 'Test Workflow', active: true, nodes: [], connections: {}, createdAt: 1, updatedAt: 1, versionId: '123', } as IWorkflowDb); vi.spyOn(permissions, 'getResourcePermissions').mockReturnValue({ workflow: { update: true, }, } as PermissionsRecord); uiStore.modalsById[WORKFLOW_SETTINGS_MODAL_KEY] = { open: true, }; }); afterEach(() => { cleanupAppModals(); }); afterAll(() => { server.shutdown(); }); it('should render correctly', async () => { settingsStore.settings.enterprise[EnterpriseEditionFeature.Sharing] = false; const { getByTestId } = createComponent({ pinia }); await nextTick(); expect(getByTestId('workflow-settings-dialog')).toBeVisible(); }); it('should not render workflow caller policy when sharing is not enabled', async () => { settingsStore.settings.enterprise[EnterpriseEditionFeature.Sharing] = false; const { getByTestId } = createComponent({ pinia }); await nextTick(); expect( within(getByTestId('workflow-settings-dialog')).queryByTestId('workflow-caller-policy'), ).not.toBeInTheDocument(); }); it('should render workflow caller policy when sharing is enabled', async () => { settingsStore.settings.enterprise[EnterpriseEditionFeature.Sharing] = true; const { getByTestId } = createComponent({ pinia }); await nextTick(); expect(getByTestId('workflow-caller-policy')).toBeVisible(); }); it('should render list of workflows field when policy is set to workflowsFromAList', async () => { settingsStore.settings.enterprise[EnterpriseEditionFeature.Sharing] = true; const { getByTestId } = createComponent({ pinia }); await nextTick(); const dropdownItems = await getDropdownItems(getByTestId('workflow-caller-policy')); await userEvent.click(dropdownItems[2]); expect(getByTestId('workflow-caller-policy-workflow-ids')).toBeVisible(); }); it('should not remove valid workflow ID characters', async () => { const validWorkflowList = '1234567890, abcde, efgh, 1234'; settingsStore.settings.enterprise[EnterpriseEditionFeature.Sharing] = true; const { getByTestId } = createComponent({ pinia }); await nextTick(); const dropdownItems = await getDropdownItems(getByTestId('workflow-caller-policy')); await userEvent.click(dropdownItems[2]); await userEvent.type(getByTestId('workflow-caller-policy-workflow-ids'), validWorkflowList); expect(getByTestId('workflow-caller-policy-workflow-ids')).toHaveValue(validWorkflowList); }); it('should remove invalid workflow ID characters', async () => { const invalidWorkflowList = '1234567890@, abc/de, ef*gh, 12%34'; const cleanedUpWorkflowList = '1234567890, abcde, efgh, 1234'; settingsStore.settings.enterprise[EnterpriseEditionFeature.Sharing] = true; const { getByTestId } = createComponent({ pinia }); await nextTick(); const dropdownItems = await getDropdownItems(getByTestId('workflow-caller-policy')); await userEvent.click(dropdownItems[2]); await userEvent.type(getByTestId('workflow-caller-policy-workflow-ids'), invalidWorkflowList); expect(getByTestId('workflow-caller-policy-workflow-ids')).toHaveValue(cleanedUpWorkflowList); }); });