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();
expect(root).toBeDefined();
});
it('renders with default variant', () => {
const { root } = render();
expect(root).toBeDefined();
});
it('renders with compact variant', () => {
const { root } = render(
);
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();
expect(root).toBeDefined();
});
it('shows "Step 1 of 4" for name step', () => {
const { getByText } = render();
expect(getByText(/Step 1 of 4/)).toBeDefined();
});
it('shows "Step 2 of 4" for beneficiary step', () => {
const { getByText } = render(
);
expect(getByText(/Step 2 of 4/)).toBeDefined();
});
it('shows "Step 3 of 4" for purchase step', () => {
const { getByText } = render(
);
expect(getByText(/Step 3 of 4/)).toBeDefined();
});
it('shows "Step 4 of 4" for activate step', () => {
const { getByText } = render(
);
expect(getByText(/Step 4 of 4/)).toBeDefined();
});
});
describe('Step labels', () => {
it('shows step label for name step', () => {
const { getByText } = render();
expect(getByText(/Your Name/)).toBeDefined();
});
it('shows step label for beneficiary step', () => {
const { getByText } = render(
);
expect(getByText(/Add Loved One/)).toBeDefined();
});
it('shows step label for purchase step', () => {
const { getByText } = render(
);
expect(getByText(/Get Equipment/)).toBeDefined();
});
it('shows step label for activate step', () => {
const { getAllByText } = render(
);
// "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(
);
// Should have 4 step wrappers rendered
expect(root).toBeDefined();
});
it('displays short labels in default variant', () => {
const { getByText } = render(
);
// 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();
expect(getByText('Name')).toBeDefined();
});
it('compact variant does not show step labels', () => {
const { queryByText } = render(
);
// 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();
expect(getByText(/Step 1 of 4/)).toBeDefined();
});
it('handles last step correctly', () => {
const { getByText } = render(
);
expect(getByText(/Step 4 of 4/)).toBeDefined();
});
it('handles middle steps correctly', () => {
const { getByText: getByText1 } = render(
);
expect(getByText1(/Step 2 of 4/)).toBeDefined();
const { getByText: getByText2 } = render(
);
expect(getByText2(/Step 3 of 4/)).toBeDefined();
});
});
describe('Accessibility', () => {
it('renders with accessible text content', () => {
const { getByText } = render();
// Should have readable step information
expect(getByText(/Step 1 of 4: Your Name/)).toBeDefined();
});
it('shows meaningful progress information', () => {
const { getByText } = render(
);
expect(getByText(/Step 3 of 4: Get Equipment/)).toBeDefined();
});
});
});