n8n/packages/editor-ui/src/components/WorkflowSettings.spec.ts
2024-08-28 14:01:05 +02:00

149 lines
4.9 KiB
TypeScript

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<typeof createPinia>;
let workflowsStore: ReturnType<typeof useWorkflowsStore>;
let settingsStore: ReturnType<typeof useSettingsStore>;
let uiStore: ReturnType<typeof useUIStore>;
const createComponent = createComponentRenderer(WorkflowSettingsVue);
describe('WorkflowSettingsVue', () => {
let server: ReturnType<typeof setupServer>;
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);
});
});