feat(editor): Add universal Create Resource Menu (#11564)

Co-authored-by: Csaba Tuncsik <csaba@n8n.io>
This commit is contained in:
Raúl Gómez Morales
2024-11-19 15:47:10 +01:00
committed by GitHub
parent 1d8fd13d84
commit b38ce14ec9
23 changed files with 700 additions and 346 deletions

View File

@@ -1,15 +1,10 @@
import { createComponentRenderer } from '@/__tests__/render';
import { createTestingPinia } from '@pinia/testing';
import userEvent from '@testing-library/user-event';
import { createRouter, createMemoryHistory, useRouter } from 'vue-router';
import { createRouter, createMemoryHistory } from 'vue-router';
import { createProjectListItem } from '@/__tests__/data/projects';
import ProjectsNavigation from '@/components/Projects//ProjectNavigation.vue';
import { useProjectsStore } from '@/stores/projects.store';
import { mockedStore } from '@/__tests__/utils';
import type { Project } from '@/types/projects.types';
import { VIEWS } from '@/constants';
import { useToast } from '@/composables/useToast';
import { usePageRedirectionHelper } from '@/composables/usePageRedirectionHelper';
vi.mock('vue-router', async () => {
const actual = await vi.importActual('vue-router');
@@ -62,10 +57,7 @@ const renderComponent = createComponentRenderer(ProjectsNavigation, {
},
});
let router: ReturnType<typeof useRouter>;
let toast: ReturnType<typeof useToast>;
let projectsStore: ReturnType<typeof mockedStore<typeof useProjectsStore>>;
let pageRedirectionHelper: ReturnType<typeof usePageRedirectionHelper>;
const personalProjects = Array.from({ length: 3 }, createProjectListItem);
const teamProjects = Array.from({ length: 3 }, () => createProjectListItem('team'));
@@ -74,10 +66,6 @@ describe('ProjectsNavigation', () => {
beforeEach(() => {
createTestingPinia();
router = useRouter();
toast = useToast();
pageRedirectionHelper = usePageRedirectionHelper();
projectsStore = mockedStore(useProjectsStore);
});
@@ -92,70 +80,6 @@ describe('ProjectsNavigation', () => {
}).not.toThrow();
});
it('should not show "Add project" button when conditions are not met', async () => {
projectsStore.teamProjectsLimit = 0;
projectsStore.hasPermissionToCreateProjects = false;
const { queryByText } = renderComponent({
props: {
collapsed: false,
},
});
expect(queryByText('Add project')).not.toBeInTheDocument();
});
it('should show "Add project" button when conditions met', async () => {
projectsStore.teamProjectsLimit = -1;
projectsStore.hasPermissionToCreateProjects = true;
projectsStore.createProject.mockResolvedValue({
id: '1',
name: 'My project 1',
} as Project);
const { getByText } = renderComponent({
props: {
collapsed: false,
},
});
expect(getByText('Add project')).toBeVisible();
await userEvent.click(getByText('Add project'));
expect(projectsStore.createProject).toHaveBeenCalledWith({
name: 'My project',
});
expect(router.push).toHaveBeenCalledWith({
name: VIEWS.PROJECT_SETTINGS,
params: { projectId: '1' },
});
expect(toast.showMessage).toHaveBeenCalledWith({
title: 'Project My project 1 saved successfully',
type: 'success',
});
});
it('should show "Add project" button tooltip when project creation limit reached', async () => {
projectsStore.teamProjectsLimit = 3;
projectsStore.hasPermissionToCreateProjects = true;
projectsStore.canCreateProjects = false;
const { getByText } = renderComponent({
props: {
collapsed: false,
planName: 'Free',
},
});
expect(getByText('Add project')).toBeVisible();
await userEvent.hover(getByText('Add project'));
expect(getByText(/You have reached the Free plan limit of 3/)).toBeVisible();
await userEvent.click(getByText('View plans'));
expect(pageRedirectionHelper.goToUpgrade).toHaveBeenCalledWith('rbac', 'upgrade-rbac');
});
it('should show "Projects" title and Personal project when the feature is enabled', async () => {
projectsStore.isTeamProjectFeatureEnabled = true;
projectsStore.myProjects = [...personalProjects, ...teamProjects];