Files
pwap/mobile/src/components/Badge.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

119 lines
2.2 KiB
TypeScript

import React from 'react';
import { View, Text, StyleSheet, ViewStyle } from 'react-native';
import { KurdistanColors } from '../theme/colors';
interface BadgeProps {
label?: string;
children?: React.ReactNode;
variant?: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'error';
size?: 'small' | 'medium' | 'large';
style?: ViewStyle;
icon?: React.ReactNode;
testID?: string;
}
/**
* Badge Component
* For tiki roles, status indicators, labels
*/
export const Badge: React.FC<BadgeProps> = ({
label,
children,
variant = 'primary',
size = 'medium',
style,
icon,
testID,
}) => {
const content = label || children;
return (
<View testID={testID} style={[styles.badge, styles[variant], styles[`${size}Size`], style]}>
{icon}
<Text style={[styles.text, styles[`${variant}Text`], styles[`${size}Text`]]}>
{content}
</Text>
</View>
);
};
const styles = StyleSheet.create({
badge: {
flexDirection: 'row',
alignItems: 'center',
borderRadius: 20,
paddingHorizontal: 12,
paddingVertical: 6,
gap: 4,
},
// Variants
primary: {
backgroundColor: `${KurdistanColors.kesk}15`,
},
secondary: {
backgroundColor: `${KurdistanColors.zer}15`,
},
success: {
backgroundColor: '#10B98115',
},
warning: {
backgroundColor: `${KurdistanColors.zer}20`,
},
danger: {
backgroundColor: `${KurdistanColors.sor}15`,
},
error: {
backgroundColor: `${KurdistanColors.sor}15`,
},
info: {
backgroundColor: '#3B82F615',
},
// Sizes
smallSize: {
paddingHorizontal: 8,
paddingVertical: 4,
},
mediumSize: {
paddingHorizontal: 12,
paddingVertical: 6,
},
largeSize: {
paddingHorizontal: 16,
paddingVertical: 8,
},
// Text styles
text: {
fontWeight: '600',
},
primaryText: {
color: KurdistanColors.kesk,
},
secondaryText: {
color: '#855D00',
},
successText: {
color: '#10B981',
},
warningText: {
color: '#D97706',
},
dangerText: {
color: KurdistanColors.sor,
},
errorText: {
color: KurdistanColors.sor,
},
infoText: {
color: '#3B82F6',
},
smallText: {
fontSize: 11,
},
mediumText: {
fontSize: 13,
},
largeText: {
fontSize: 15,
},
});