54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import React from 'react';
|
|
import { describe, expect, it, vi } from 'vitest';
|
|
import { render, screen } from '@testing-library/react';
|
|
|
|
let identityState = { hydrated: true, name: '' };
|
|
|
|
vi.mock('react-router-dom', () => ({
|
|
useParams: () => ({ token: 'demo-token' }),
|
|
Navigate: ({ to }: { to: string }) => <div>navigate:{to}</div>,
|
|
Outlet: () => <div>outlet</div>,
|
|
}));
|
|
|
|
vi.mock('../context/EventDataContext', () => ({
|
|
EventDataProvider: ({ children }: { children: React.ReactNode }) => <>{children}</>,
|
|
useEventData: () => ({ event: null }),
|
|
}));
|
|
|
|
vi.mock('@/guest/context/EventBrandingContext', () => ({
|
|
EventBrandingProvider: ({ children }: { children: React.ReactNode }) => <>{children}</>,
|
|
}));
|
|
|
|
vi.mock('@/guest/i18n/LocaleContext', () => ({
|
|
LocaleProvider: ({ children }: { children: React.ReactNode }) => <>{children}</>,
|
|
DEFAULT_LOCALE: 'de',
|
|
isLocaleCode: () => true,
|
|
}));
|
|
|
|
vi.mock('@/guest/context/NotificationCenterContext', () => ({
|
|
NotificationCenterProvider: ({ children }: { children: React.ReactNode }) => <>{children}</>,
|
|
}));
|
|
|
|
vi.mock('../context/GuestIdentityContext', () => ({
|
|
GuestIdentityProvider: ({ children }: { children: React.ReactNode }) => <>{children}</>,
|
|
useOptionalGuestIdentity: () => identityState,
|
|
}));
|
|
|
|
import EventLayout from '../layouts/EventLayout';
|
|
|
|
describe('EventLayout profile gate', () => {
|
|
it('redirects to setup when profile is missing', () => {
|
|
identityState = { hydrated: true, name: '' };
|
|
render(<EventLayout requireProfile />);
|
|
|
|
expect(screen.getByText('navigate:/setup/demo-token')).toBeInTheDocument();
|
|
});
|
|
|
|
it('renders outlet when profile exists', () => {
|
|
identityState = { hydrated: true, name: 'Ava' };
|
|
render(<EventLayout requireProfile />);
|
|
|
|
expect(screen.getByText('outlet')).toBeInTheDocument();
|
|
});
|
|
});
|