import { createComponentRenderer } from '@/__tests__/render'; import { fireEvent } from '@testing-library/vue'; import ProjectBreadcrumb from './ProjectBreadcrumb.vue'; import { ProjectTypes } from '@/types/projects.types'; import type { Project } from '@vue-flow/core'; vi.mock('@n8n/i18n', async (importOriginal) => ({ ...(await importOriginal()), useI18n: () => ({ baseText: vi.fn((key) => { if (key === 'projects.menu.personal') return 'Personal'; return key; }), }), })); const mockComponents = { 'n8n-link': { template: '', props: ['to'], }, ProjectIcon: { template: '
', props: ['icon', 'borderLess', 'size', 'title'], }, N8nText: { template: '', props: ['size', 'color'], }, }; const renderComponent = createComponentRenderer(ProjectBreadcrumb, { global: { stubs: mockComponents, }, }); describe('ProjectBreadcrumb', () => { it('Renders personal project info correctly', () => { const { getByTestId } = renderComponent({ props: { currentProject: { id: '1', name: 'Test Project', type: ProjectTypes.Personal, } satisfies Partial, }, }); expect(getByTestId('project-icon')).toHaveAttribute('data-icon', 'user'); expect(getByTestId('project-label')).toHaveTextContent('Personal'); }); it('Renders team project info correctly', () => { const { getByTestId } = renderComponent({ props: { currentProject: { id: '1', name: 'Team Project', type: ProjectTypes.Team, icon: { type: 'icon', value: 'folder' }, } satisfies Partial, }, }); expect(getByTestId('project-icon')).toHaveAttribute('data-icon', 'folder'); expect(getByTestId('project-label')).toHaveTextContent('Team Project'); }); it('Renders team project emoji icon correctly', () => { const { getByTestId } = renderComponent({ props: { currentProject: { id: '1', name: 'Team Project', type: ProjectTypes.Team, icon: { type: 'emoji', value: '🔥' }, } satisfies Partial, }, }); expect(getByTestId('project-icon')).toHaveAttribute('data-icon', '🔥'); expect(getByTestId('project-label')).toHaveTextContent('Team Project'); }); it('emits hover event', async () => { const { emitted, getByTestId } = renderComponent({ props: { currentProject: { id: '1', name: 'Test Project', type: ProjectTypes.Personal, } satisfies Partial, }, }); await fireEvent.mouseEnter(getByTestId('home-project')); expect(emitted('projectHover')).toBeTruthy(); }); it('emits project drop event if dragging', async () => { const { emitted, getByTestId } = renderComponent({ props: { isDragging: true, currentProject: { id: '1', name: 'Test Project', type: ProjectTypes.Personal, } satisfies Partial, }, }); await fireEvent.mouseUp(getByTestId('home-project')); expect(emitted('projectDrop')).toBeTruthy(); }); it('does not emit project drop event if not dragging', async () => { const { emitted, getByTestId } = renderComponent({ props: { isDragging: false, currentProject: { id: '1', name: 'Test Project', type: ProjectTypes.Personal, } satisfies Partial, }, }); await fireEvent.mouseUp(getByTestId('home-project')); expect(emitted('projectDrop')).toBeFalsy(); }); });