import React from 'react';
import { render, screen, waitFor, act } from '@testing-library/react';
import { useParams, useRouter } from 'next/navigation';
import BeneficiaryDetailPage from '../[id]/page';
// Mock next/navigation
jest.mock('next/navigation', () => ({
useParams: jest.fn(),
useRouter: jest.fn(),
}));
// Mock AdminLayout
jest.mock('../../../components/AdminLayout', () => {
return function MockAdminLayout({ children }: { children: React.ReactNode }) {
return
{children}
;
};
});
// Mock API calls
jest.mock('../../../lib/api', () => ({
getBeneficiary: jest.fn(),
getDevices: jest.fn(),
}));
import { getBeneficiary, getDevices } from '../../../lib/api';
const mockBeneficiary = {
id: 1,
first_name: 'John',
last_name: 'Doe',
email: 'john@example.com',
phone: '+1234567890',
address_street: '123 Main St',
address_city: 'New York',
address_country: 'USA',
created_at: '2024-01-15T10:00:00Z',
updated_at: '2024-01-20T10:00:00Z',
subscription_status: 'active',
subscription_plan: 'Premium',
};
const mockDevices = [
{
id: 1,
name: 'Living Room Sensor',
mac_address: 'AA:BB:CC:DD:EE:FF',
device_type: 'motion',
status: 'online',
last_seen: '2024-01-20T09:00:00Z',
firmware_version: '1.2.3',
},
];
describe('BeneficiaryDetailPage', () => {
const mockPush = jest.fn();
beforeEach(() => {
jest.clearAllMocks();
(useParams as jest.Mock).mockReturnValue({ id: '1' });
(useRouter as jest.Mock).mockReturnValue({ push: mockPush });
(getBeneficiary as jest.Mock).mockResolvedValue({ beneficiary: mockBeneficiary });
(getDevices as jest.Mock).mockResolvedValue({ devices: mockDevices });
});
it('renders beneficiary information after loading', async () => {
await act(async () => {
render();
});
// Wait for loading to complete - check for Overview tab which appears after load
await waitFor(
() => {
expect(screen.getByText('Overview')).toBeInTheDocument();
},
{ timeout: 3000 }
);
// Verify beneficiary data is rendered (may appear multiple times in different sections)
const nameElements = screen.getAllByText('John Doe');
expect(nameElements.length).toBeGreaterThanOrEqual(1);
const emailElements = screen.getAllByText('john@example.com');
expect(emailElements.length).toBeGreaterThanOrEqual(1);
});
it('renders tabs structure', async () => {
await act(async () => {
render();
});
await waitFor(
() => {
expect(screen.getByText('Overview')).toBeInTheDocument();
},
{ timeout: 3000 }
);
expect(screen.getByText(/Sensors/)).toBeInTheDocument();
expect(screen.getByText('Activity History')).toBeInTheDocument();
});
it('renders error state when API fails', async () => {
(getBeneficiary as jest.Mock).mockRejectedValue(new Error('API Error'));
await act(async () => {
render();
});
await waitFor(
() => {
expect(screen.getByText('API Error')).toBeInTheDocument();
},
{ timeout: 3000 }
);
});
it('renders back button navigation', async () => {
await act(async () => {
render();
});
await waitFor(
() => {
expect(screen.getByText('Back to Beneficiaries')).toBeInTheDocument();
},
{ timeout: 3000 }
);
});
});