import userEvent from '@testing-library/user-event';
import { createComponentRenderer } from '@/__tests__/render';
import { getDropdownItems } from '@/__tests__/utils';
import PersonalizationModal from '@/components/PersonalizationModal.vue';
import { createTestingPinia } from '@pinia/testing';
import {
COMPANY_TYPE_KEY,
COMPANY_INDUSTRY_EXTENDED_KEY,
OTHER_COMPANY_INDUSTRY_EXTENDED_KEY,
MARKETING_AUTOMATION_GOAL_KEY,
OTHER_MARKETING_AUTOMATION_GOAL_KEY,
ROLE_KEY,
ROLE_OTHER_KEY,
DEVOPS_AUTOMATION_GOAL_OTHER_KEY,
DEVOPS_AUTOMATION_GOAL_KEY,
} from '@/constants';
vi.mock('vue-router', () => ({
useRouter: () => ({
replace: vi.fn(),
}),
useRoute: () => ({
location: {},
}),
RouterLink: vi.fn(),
}));
const renderModal = createComponentRenderer(PersonalizationModal, {
global: {
stubs: {
Modal: {
template: `
`,
},
},
},
});
describe('PersonalizationModal', () => {
it('mounts', () => {
const { getByTitle } = renderModal({ pinia: createTestingPinia() });
expect(getByTitle('Customize n8n to you')).toBeInTheDocument();
});
describe('Company field', () => {
it('allows completion of company related fields', async () => {
const { getByTestId } = renderModal({ pinia: createTestingPinia() });
const companyTypeSelect = getByTestId(COMPANY_TYPE_KEY);
const otherTypeOfCompanyOption = [...(await getDropdownItems(companyTypeSelect))].find(
(node) => node.textContent === 'Other',
) as Element;
await userEvent.click(otherTypeOfCompanyOption);
const industrySelect = getByTestId(COMPANY_INDUSTRY_EXTENDED_KEY);
expect(industrySelect).toBeInTheDocument();
const otherIndustryOption = [...(await getDropdownItems(industrySelect))].find(
(node) => node.textContent === 'Other (please specify)',
) as Element;
await userEvent.click(otherIndustryOption);
expect(getByTestId(OTHER_COMPANY_INDUSTRY_EXTENDED_KEY)).toBeInTheDocument();
});
it('shows only company and source select when not used for work', async () => {
const { getByTestId, baseElement } = renderModal({ pinia: createTestingPinia() });
const companyTypeSelect = getByTestId(COMPANY_TYPE_KEY);
const nonWorkOption = [...(await getDropdownItems(companyTypeSelect))].find(
(node) => node.textContent === "I'm not using n8n for work",
) as Element;
await userEvent.click(nonWorkOption);
expect(baseElement.querySelectorAll('input').length).toBe(2);
});
});
it('allows completion of role related fields', async () => {
const { getByTestId, queryByTestId } = renderModal({ pinia: createTestingPinia() });
const roleSelect = getByTestId(ROLE_KEY);
const roleItems = [...(await getDropdownItems(roleSelect))];
const devOps = roleItems.find((node) => node.textContent === 'Devops') as Element;
const engineering = roleItems.find((node) => node.textContent === 'Engineering') as Element;
const it = roleItems.find((node) => node.textContent === 'IT') as Element;
const other = roleItems.find(
(node) => node.textContent === 'Other (please specify)',
) as Element;
await userEvent.click(devOps);
const automationGoalSelect = getByTestId(DEVOPS_AUTOMATION_GOAL_KEY);
expect(automationGoalSelect).toBeInTheDocument();
await userEvent.click(engineering);
expect(automationGoalSelect).toBeInTheDocument();
await userEvent.click(it);
expect(automationGoalSelect).toBeInTheDocument();
const otherGoalsItem = [...(await getDropdownItems(automationGoalSelect))].find(
(node) => node.textContent === 'Other',
) as Element;
await userEvent.click(otherGoalsItem);
expect(getByTestId(DEVOPS_AUTOMATION_GOAL_OTHER_KEY)).toBeInTheDocument();
await userEvent.click(other);
expect(queryByTestId(DEVOPS_AUTOMATION_GOAL_KEY)).not.toBeInTheDocument();
expect(getByTestId(ROLE_OTHER_KEY)).toBeInTheDocument();
});
it('allows completion of marketing and sales related fields', async () => {
const { getByTestId } = renderModal({ pinia: createTestingPinia() });
const companyTypeSelect = getByTestId(COMPANY_TYPE_KEY);
const anyWorkOption = [...(await getDropdownItems(companyTypeSelect))].find(
(node) => node.textContent !== "I'm not using n8n for work",
) as Element;
await userEvent.click(anyWorkOption);
const roleSelect = getByTestId(ROLE_KEY);
const salesAndMarketingOption = [...(await getDropdownItems(roleSelect))].find(
(node) => node.textContent === 'Sales and Marketing',
) as Element;
await userEvent.click(salesAndMarketingOption);
const salesAndMarketingSelect = getByTestId(MARKETING_AUTOMATION_GOAL_KEY);
const otherItem = [...(await getDropdownItems(salesAndMarketingSelect))].find(
(node) => node.textContent === 'Other',
) as Element;
await userEvent.click(otherItem);
expect(getByTestId(OTHER_MARKETING_AUTOMATION_GOAL_KEY)).toBeInTheDocument();
});
});