Update admin PWA events, branding, and packages
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import React from 'react';
|
||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import { render, screen, waitFor } from '@testing-library/react';
|
||||
import { ADMIN_EVENTS_PATH } from '../../constants';
|
||||
|
||||
const fixtures = vi.hoisted(() => ({
|
||||
event: {
|
||||
@@ -41,6 +42,9 @@ const authState = {
|
||||
status: 'authenticated',
|
||||
user: { role: 'tenant_admin' },
|
||||
};
|
||||
const paramsState = {
|
||||
slug: fixtures.event.slug as string | undefined,
|
||||
};
|
||||
const eventContext = {
|
||||
events: [fixtures.event],
|
||||
activeEvent: fixtures.event,
|
||||
@@ -52,7 +56,7 @@ const eventContext = {
|
||||
vi.mock('react-router-dom', () => ({
|
||||
useNavigate: () => navigateMock,
|
||||
useLocation: () => ({ search: '', pathname: '/event-admin/mobile/dashboard' }),
|
||||
useParams: () => ({ slug: fixtures.event.slug }),
|
||||
useParams: () => paramsState,
|
||||
}));
|
||||
|
||||
vi.mock('react-i18next', () => ({
|
||||
@@ -143,6 +147,13 @@ vi.mock('../components/Sheet', () => ({
|
||||
vi.mock('../components/Primitives', () => ({
|
||||
MobileCard: ({ children }: { children: React.ReactNode }) => <div>{children}</div>,
|
||||
CTAButton: ({ label }: { label: string }) => <button type="button">{label}</button>,
|
||||
KpiStrip: ({ items }: { items: Array<{ label: string; value: string | number }> }) => (
|
||||
<div>
|
||||
{items.map((item) => (
|
||||
<span key={item.label}>{item.label}</span>
|
||||
))}
|
||||
</div>
|
||||
),
|
||||
KpiTile: ({ label, value }: { label: string; value: string | number }) => (
|
||||
<div>
|
||||
<span>{label}</span>
|
||||
@@ -244,6 +255,7 @@ describe('MobileDashboardPage', () => {
|
||||
eventContext.activeEvent = fixtures.event;
|
||||
eventContext.hasEvents = true;
|
||||
eventContext.hasMultipleEvents = false;
|
||||
paramsState.slug = fixtures.event.slug;
|
||||
|
||||
fixtures.activePackage.package_type = 'reseller';
|
||||
fixtures.activePackage.remaining_events = 3;
|
||||
@@ -253,19 +265,27 @@ describe('MobileDashboardPage', () => {
|
||||
window.sessionStorage.clear();
|
||||
});
|
||||
|
||||
it('shows a tasks setup nudge and prompt when no tasks are assigned', () => {
|
||||
it('redirects to the event selector when no event is active', async () => {
|
||||
eventContext.activeEvent = null as unknown as typeof fixtures.event;
|
||||
eventContext.events = [fixtures.event];
|
||||
eventContext.hasEvents = true;
|
||||
paramsState.slug = undefined;
|
||||
|
||||
render(<MobileDashboardPage />);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(navigateMock).toHaveBeenCalledWith(ADMIN_EVENTS_PATH, { replace: true });
|
||||
});
|
||||
});
|
||||
|
||||
it('shows the next-step CTA when tasks are missing', () => {
|
||||
fixtures.event.tasks_count = 0;
|
||||
fixtures.event.engagement_mode = 'tasks';
|
||||
window.sessionStorage.setItem(`tasksDecisionPrompt:${fixtures.event.id}`, 'pending');
|
||||
|
||||
render(<MobileDashboardPage />);
|
||||
|
||||
expect(screen.getByText('Setup needed')).toBeInTheDocument();
|
||||
expect(
|
||||
screen.getByText(
|
||||
'Your event is live with tasks enabled, but no tasks are assigned yet. Choose to add tasks now or disable tasks for this event.'
|
||||
)
|
||||
).toBeInTheDocument();
|
||||
expect(screen.getByText('Aufgaben hinzufügen')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('does not redirect endcustomer packages without remaining event quota', () => {
|
||||
@@ -282,21 +302,21 @@ describe('MobileDashboardPage', () => {
|
||||
expect(navigateMock).not.toHaveBeenCalledWith('/event-admin/mobile/billing#packages', { replace: true });
|
||||
});
|
||||
|
||||
it('shows package usage progress when a limit is available', () => {
|
||||
it('shows the activity pulse strip', () => {
|
||||
render(<MobileDashboardPage />);
|
||||
|
||||
expect(screen.getByText('2 of 5 events used')).toBeInTheDocument();
|
||||
expect(screen.getByText('3 remaining')).toBeInTheDocument();
|
||||
expect(screen.getAllByText('Photos').length).toBeGreaterThan(0);
|
||||
expect(screen.getAllByText('Guests').length).toBeGreaterThan(0);
|
||||
expect(screen.getAllByText('Pending').length).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it('hides admin-only shortcuts for members', () => {
|
||||
it('shows shortcut sections for members', () => {
|
||||
authState.user = { role: 'member' };
|
||||
|
||||
render(<MobileDashboardPage />);
|
||||
|
||||
expect(screen.getByText('Moderation & Live Show')).toBeInTheDocument();
|
||||
expect(screen.queryByText('Event settings')).not.toBeInTheDocument();
|
||||
expect(screen.queryByText('Live Show settings')).not.toBeInTheDocument();
|
||||
expect(screen.getByText('Experience')).toBeInTheDocument();
|
||||
expect(screen.getByText('Settings')).toBeInTheDocument();
|
||||
|
||||
authState.user = { role: 'tenant_admin' };
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user