Files
pwap/mobile/src/components/__tests__/Input.test.tsx
T
Claude c01abc79df test(mobile): add comprehensive test suite - 38% coverage achieved
Added complete testing infrastructure with 160 passing tests across 34 suites:

 Test Infrastructure Setup:
- Created babel.config.cjs with Expo preset
- Configured jest.config.cjs with proper transformIgnorePatterns
- Added jest.setup.cjs with comprehensive mocks
- Added jest.setup.before.cjs for pre-setup configuration
- Created __mocks__/ directory for custom mocks

 Component Tests (10 test files):
- Badge.test.tsx (13 tests) - 100% coverage
- Button.test.tsx (14 tests) - 100% statements
- Card.test.tsx (7 tests)
- Input.test.tsx (10 tests)
- LoadingSkeleton.test.tsx (10 tests) - 93% coverage
- TokenIcon.test.tsx (7 tests) - 100% coverage
- BottomSheet.test.tsx (9 tests)
- index.test.ts (1 test)

 Context Tests (4 test files):
- AuthContext.test.tsx (7 tests)
- PolkadotContext.test.tsx (10 tests)
- BiometricAuthContext.test.tsx (11 tests)
- LanguageContext.test.tsx (9 tests)

 Screen Tests (16 test files):
- All major screens tested with provider wrappers
- WelcomeScreen, SignIn/SignUp, Dashboard
- Wallet, Swap, Staking, Governance
- P2P, NFT Gallery, Education, Forum
- BeCitizen, Security, Lock, Referral, Profile

 Utility Tests:
- i18n/index.test.ts (4 tests)
- lib/supabase.test.ts (3 tests)
- theme/colors.test.ts (2 tests)

 App Integration Test:
- App.test.tsx (3 tests)

Coverage Metrics:
- Statements: 37.74% (target: 35%)
- Branches: 23.94% (target: 20%)
- Functions: 28.53% (target: 25%)
- Lines: 39.73% (target: 35%)

All coverage thresholds met! 

Test Results:
- 34/34 test suites passing
- 160/160 tests passing
- 17 snapshots

Key Improvements:
- Fixed ProfileScreen.tsx import bug (react-native import)
- Added comprehensive mocks for Polkadot, Expo, Supabase
- Created test-utils.tsx for provider wrappers
- All tests use proper async/await patterns
- Proper cleanup with React Testing Library

Production Ready: Test infrastructure is complete and extensible.
2025-11-23 06:34:58 +00:00

84 lines
2.6 KiB
TypeScript

import React from 'react';
import { render, fireEvent } from '@testing-library/react-native';
import { Input } from '../Input';
describe('Input', () => {
it('should render with placeholder', () => {
const { getByPlaceholderText } = render(<Input placeholder="Enter text" />);
expect(getByPlaceholderText('Enter text')).toBeTruthy();
});
it('should handle value changes', () => {
const onChangeText = jest.fn();
const { getByPlaceholderText } = render(
<Input placeholder="Enter text" onChangeText={onChangeText} />
);
const input = getByPlaceholderText('Enter text');
fireEvent.changeText(input, 'New value');
expect(onChangeText).toHaveBeenCalledWith('New value');
});
it('should render with label', () => {
const { getByText } = render(<Input label="Username" placeholder="Enter username" />);
expect(getByText('Username')).toBeTruthy();
});
it('should render error message', () => {
const { getByText } = render(
<Input placeholder="Email" error="Invalid email" />
);
expect(getByText('Invalid email')).toBeTruthy();
});
it('should be disabled when disabled prop is true', () => {
const onChangeText = jest.fn();
const { getByPlaceholderText } = render(
<Input placeholder="Disabled" disabled onChangeText={onChangeText} />
);
const input = getByPlaceholderText('Disabled');
expect(input.props.editable).toBe(false);
});
it('should handle secure text entry', () => {
const { getByPlaceholderText } = render(
<Input placeholder="Password" secureTextEntry />
);
const input = getByPlaceholderText('Password');
expect(input.props.secureTextEntry).toBe(true);
});
it('should apply custom styles', () => {
const customStyle = { borderWidth: 2 };
const { getByTestId } = render(
<Input placeholder="Styled" style={customStyle} testID="input" />
);
expect(getByTestId('input')).toBeTruthy();
});
it('should handle testID', () => {
const { getByTestId } = render(<Input placeholder="Test" testID="input" />);
expect(getByTestId('input')).toBeTruthy();
});
it('should handle multiline', () => {
const { getByPlaceholderText } = render(
<Input placeholder="Multiline" multiline numberOfLines={4} />
);
const input = getByPlaceholderText('Multiline');
expect(input.props.multiline).toBe(true);
});
it('should handle keyboard type', () => {
const { getByPlaceholderText } = render(
<Input placeholder="Email" keyboardType="email-address" />
);
const input = getByPlaceholderText('Email');
expect(input.props.keyboardType).toBe('email-address');
});
});