WellNuo/__tests__/components/SetupProgressIndicator.test.tsx
Sergei dad084c775 Add setup progress indicator to onboarding flow
Add SetupProgressIndicator component that shows users their current
position in the 4-step onboarding journey: Name → Beneficiary →
Equipment → Connect. The indicator displays:
- Visual progress bar with percentage fill
- Step circles with icons showing completed/current/pending status
- Current step label with "Step X of 4" text

Integrate the indicator into all four auth screens:
- enter-name.tsx (Step 1)
- add-loved-one.tsx (Step 2)
- purchase.tsx (Step 3)
- activate.tsx (Step 4)

Also add @expo/vector-icons mock to jest.setup.js for testing.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-31 17:14:44 -08:00

171 lines
5.6 KiB
TypeScript

import React from 'react';
import { render } from '@testing-library/react-native';
import {
SetupProgressIndicator,
SetupStep,
} from '@/components/SetupProgressIndicator';
describe('SetupProgressIndicator', () => {
describe('Component rendering', () => {
it('renders without crashing', () => {
const { root } = render(<SetupProgressIndicator currentStep="name" />);
expect(root).toBeDefined();
});
it('renders with default variant', () => {
const { root } = render(<SetupProgressIndicator currentStep="name" />);
expect(root).toBeDefined();
});
it('renders with compact variant', () => {
const { root } = render(
<SetupProgressIndicator currentStep="name" variant="compact" />
);
expect(root).toBeDefined();
});
});
describe('Step progression', () => {
const steps: SetupStep[] = ['name', 'beneficiary', 'purchase', 'activate'];
it.each(steps)('renders correctly for step "%s"', (step) => {
const { root } = render(<SetupProgressIndicator currentStep={step} />);
expect(root).toBeDefined();
});
it('shows "Step 1 of 4" for name step', () => {
const { getByText } = render(<SetupProgressIndicator currentStep="name" />);
expect(getByText(/Step 1 of 4/)).toBeDefined();
});
it('shows "Step 2 of 4" for beneficiary step', () => {
const { getByText } = render(
<SetupProgressIndicator currentStep="beneficiary" />
);
expect(getByText(/Step 2 of 4/)).toBeDefined();
});
it('shows "Step 3 of 4" for purchase step', () => {
const { getByText } = render(
<SetupProgressIndicator currentStep="purchase" />
);
expect(getByText(/Step 3 of 4/)).toBeDefined();
});
it('shows "Step 4 of 4" for activate step', () => {
const { getByText } = render(
<SetupProgressIndicator currentStep="activate" />
);
expect(getByText(/Step 4 of 4/)).toBeDefined();
});
});
describe('Step labels', () => {
it('shows step label for name step', () => {
const { getByText } = render(<SetupProgressIndicator currentStep="name" />);
expect(getByText(/Your Name/)).toBeDefined();
});
it('shows step label for beneficiary step', () => {
const { getByText } = render(
<SetupProgressIndicator currentStep="beneficiary" />
);
expect(getByText(/Add Loved One/)).toBeDefined();
});
it('shows step label for purchase step', () => {
const { getByText } = render(
<SetupProgressIndicator currentStep="purchase" />
);
expect(getByText(/Get Equipment/)).toBeDefined();
});
it('shows step label for activate step', () => {
const { getAllByText } = render(
<SetupProgressIndicator currentStep="activate" />
);
// "Connect" appears as both the short label and in "Step 4 of 4: Connect"
expect(getAllByText(/Connect/).length).toBeGreaterThan(0);
});
});
describe('Progress visualization', () => {
it('renders all 4 step circles', () => {
const { getAllByTestId, root } = render(
<SetupProgressIndicator currentStep="name" />
);
// Should have 4 step wrappers rendered
expect(root).toBeDefined();
});
it('displays short labels in default variant', () => {
const { getByText } = render(
<SetupProgressIndicator currentStep="beneficiary" />
);
// Short labels: Name, Person, Equipment, Connect
expect(getByText('Name')).toBeDefined();
expect(getByText('Person')).toBeDefined();
expect(getByText('Equipment')).toBeDefined();
expect(getByText('Connect')).toBeDefined();
});
});
describe('Variant differences', () => {
it('default variant shows step labels', () => {
const { getByText } = render(<SetupProgressIndicator currentStep="name" />);
expect(getByText('Name')).toBeDefined();
});
it('compact variant does not show step labels', () => {
const { queryByText } = render(
<SetupProgressIndicator currentStep="name" variant="compact" />
);
// In compact mode, short labels should not be rendered
// The component conditionally renders labels based on !isCompact
// So we expect to NOT find the short labels
expect(queryByText('Name')).toBeNull();
});
});
describe('Edge cases', () => {
it('handles first step correctly', () => {
const { getByText } = render(<SetupProgressIndicator currentStep="name" />);
expect(getByText(/Step 1 of 4/)).toBeDefined();
});
it('handles last step correctly', () => {
const { getByText } = render(
<SetupProgressIndicator currentStep="activate" />
);
expect(getByText(/Step 4 of 4/)).toBeDefined();
});
it('handles middle steps correctly', () => {
const { getByText: getByText1 } = render(
<SetupProgressIndicator currentStep="beneficiary" />
);
expect(getByText1(/Step 2 of 4/)).toBeDefined();
const { getByText: getByText2 } = render(
<SetupProgressIndicator currentStep="purchase" />
);
expect(getByText2(/Step 3 of 4/)).toBeDefined();
});
});
describe('Accessibility', () => {
it('renders with accessible text content', () => {
const { getByText } = render(<SetupProgressIndicator currentStep="name" />);
// Should have readable step information
expect(getByText(/Step 1 of 4: Your Name/)).toBeDefined();
});
it('shows meaningful progress information', () => {
const { getByText } = render(
<SetupProgressIndicator currentStep="purchase" />
);
expect(getByText(/Step 3 of 4: Get Equipment/)).toBeDefined();
});
});
});