import React from 'react'; import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import '@testing-library/jest-dom'; import { PlanPage } from './plan.page'; jest.mock('../env', () => ({ get: jest.fn(), getStr: jest.fn(() => ''), })); jest.mock('../components/summary', () => ({ Summary: () => null, })); import { get as getEnv } from '../env'; const mockGetEnv = getEnv as jest.Mock; const mockOnCompleted = jest.fn(); const MOCK_PLANS = [ { value: 'higher', label: 'Higher income', description: '', amount: '20', currency: 'GBP', frequency: 'monthly', allowCustomAmount: false }, { value: 'lower', label: 'Lower income', description: '', amount: '5', currency: 'GBP', frequency: 'monthly', allowCustomAmount: false }, { value: 'other', label: 'Other', description: '', amount: '1', currency: 'GBP', frequency: 'monthly', allowCustomAmount: true }, ]; beforeEach(() => { mockGetEnv.mockImplementation((key: string) => { if (key === 'MEMBERSHIP_PLANS') return MOCK_PLANS; return false; }); mockOnCompleted.mockClear(); }); describe('PlanPage — custom amount', () => { test('typing a custom amount selects that tier instead of the default', async () => { render(); const customInput = document.getElementById('other-amount') as HTMLInputElement; expect(customInput).toBeInTheDocument(); fireEvent.change(customInput, { target: { value: '7' } }); fireEvent.submit(screen.getByRole('button', { name: /continue/i }).closest('form')!); await waitFor(() => expect(mockOnCompleted).toHaveBeenCalled()); const submitted = mockOnCompleted.mock.calls[0][0]; expect(submitted.membership).toBe('other'); expect(Number(submitted.customMembershipAmount)).toBe(7); }); test('the continue button spells out the amount about to be paid', async () => { render(); expect(screen.getByRole('button', { name: 'Continue and pay £20 monthly' })).toBeInTheDocument(); const customInput = document.getElementById('other-amount') as HTMLInputElement; fireEvent.change(customInput, { target: { value: '7' } }); await waitFor(() => expect(screen.getByRole('button', { name: 'Continue and pay £7 monthly' })).toBeInTheDocument() ); }); test('submitting without touching the custom amount keeps the default tier', async () => { render(); fireEvent.submit(screen.getByRole('button', { name: /continue/i }).closest('form')!); await waitFor(() => expect(mockOnCompleted).toHaveBeenCalled()); expect(mockOnCompleted.mock.calls[0][0].membership).toBe('higher'); }); });