Add dedicated mobile event add-ons page
This commit is contained in:
@@ -2,13 +2,15 @@ import React from 'react';
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
|
||||
|
||||
const navigateMock = vi.fn();
|
||||
|
||||
const fixtures = vi.hoisted(() => ({
|
||||
event: {
|
||||
id: 1,
|
||||
name: 'Demo Event',
|
||||
slug: 'demo-event',
|
||||
event_date: '2026-02-19',
|
||||
status: 'published',
|
||||
status: 'archived',
|
||||
settings: {
|
||||
guest_downloads_enabled: true,
|
||||
guest_sharing_enabled: false,
|
||||
@@ -34,7 +36,7 @@ const fixtures = vi.hoisted(() => ({
|
||||
}));
|
||||
|
||||
vi.mock('react-router-dom', () => ({
|
||||
useNavigate: () => vi.fn(),
|
||||
useNavigate: () => navigateMock,
|
||||
useParams: () => ({ slug: fixtures.event.slug }),
|
||||
}));
|
||||
|
||||
@@ -65,13 +67,7 @@ vi.mock('../../api', () => ({
|
||||
getEvent: vi.fn().mockResolvedValue(fixtures.event),
|
||||
getEventStats: vi.fn().mockResolvedValue(fixtures.stats),
|
||||
getEventQrInvites: vi.fn().mockResolvedValue(fixtures.invites),
|
||||
getAddonCatalog: vi.fn().mockResolvedValue(fixtures.addons),
|
||||
updateEvent: vi.fn().mockResolvedValue(fixtures.event),
|
||||
createEventAddonCheckout: vi.fn().mockResolvedValue({
|
||||
checkout_url: null,
|
||||
checkout_id: 'chk_123',
|
||||
expires_at: null,
|
||||
}),
|
||||
getEventEngagement: vi.fn().mockResolvedValue({
|
||||
summary: { totalPhotos: 0, uniqueGuests: 0, tasksSolved: 0, likesTotal: 0 },
|
||||
leaderboards: { uploads: [], likes: [] },
|
||||
@@ -185,10 +181,11 @@ vi.mock('../theme', () => ({
|
||||
}));
|
||||
|
||||
import MobileEventRecapPage from '../EventRecapPage';
|
||||
import { createEventAddonCheckout } from '../../api';
|
||||
|
||||
describe('MobileEventRecapPage', () => {
|
||||
beforeEach(() => {
|
||||
fixtures.event.status = 'archived';
|
||||
fixtures.event.event_date = '2026-02-19';
|
||||
fixtures.addons = [
|
||||
{
|
||||
key: 'extend_gallery_30d',
|
||||
@@ -208,25 +205,25 @@ describe('MobileEventRecapPage', () => {
|
||||
expect(screen.getByLabelText('Gäste dürfen Fotos teilen')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('requires consent and sends both legal acceptance flags for recap addon checkout', async () => {
|
||||
const checkoutMock = vi.mocked(createEventAddonCheckout);
|
||||
it('links to the dedicated add-on manager from recap', async () => {
|
||||
render(<MobileEventRecapPage />);
|
||||
|
||||
const checkoutButton = await screen.findByRole('button', { name: 'Galerie um 30 Tage verlängern' });
|
||||
fireEvent.click(checkoutButton);
|
||||
|
||||
expect(checkoutMock).not.toHaveBeenCalled();
|
||||
|
||||
fireEvent.click(await screen.findByRole('button', { name: 'Confirm legal' }));
|
||||
const openAddonsButton = await screen.findByRole('button', { name: 'Open add-on manager' });
|
||||
fireEvent.click(openAddonsButton);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(checkoutMock).toHaveBeenCalledWith(fixtures.event.slug, {
|
||||
addon_key: 'extend_gallery_30d',
|
||||
success_url: window.location.href,
|
||||
cancel_url: window.location.href,
|
||||
accepted_terms: true,
|
||||
accepted_waiver: true,
|
||||
});
|
||||
expect(navigateMock).toHaveBeenCalledWith('/event-admin/mobile/events/demo-event/addons?scope=gallery');
|
||||
});
|
||||
});
|
||||
|
||||
it('redirects to the event overview when recap is not available yet', async () => {
|
||||
fixtures.event.status = 'published';
|
||||
fixtures.event.event_date = '2099-02-19';
|
||||
|
||||
render(<MobileEventRecapPage />);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(navigateMock).toHaveBeenCalledWith('/event-admin/mobile/events/demo-event', { replace: true });
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user