mirror of
https://github.com/pezkuwichain/pwap.git
synced 2026-05-08 06:57:55 +00:00
c01abc79df
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.
97 lines
1.9 KiB
TypeScript
97 lines
1.9 KiB
TypeScript
import React from 'react';
|
|
import { View, StyleSheet, ViewStyle, Pressable, Text } from 'react-native';
|
|
import { AppColors } from '../theme/colors';
|
|
|
|
interface CardProps {
|
|
children: React.ReactNode;
|
|
title?: string;
|
|
style?: ViewStyle;
|
|
onPress?: () => void;
|
|
variant?: 'elevated' | 'outlined' | 'filled';
|
|
testID?: string;
|
|
elevation?: number;
|
|
}
|
|
|
|
/**
|
|
* Modern Card Component
|
|
* Inspired by Material Design 3 and Kurdistan aesthetics
|
|
*/
|
|
export const Card: React.FC<CardProps> = ({
|
|
children,
|
|
title,
|
|
style,
|
|
onPress,
|
|
variant = 'elevated',
|
|
testID,
|
|
elevation,
|
|
}) => {
|
|
const cardStyle = [
|
|
styles.card,
|
|
variant === 'elevated' && styles.elevated,
|
|
variant === 'outlined' && styles.outlined,
|
|
variant === 'filled' && styles.filled,
|
|
elevation && { elevation },
|
|
style,
|
|
];
|
|
|
|
const content = (
|
|
<>
|
|
{title && <Text style={styles.title}>{title}</Text>}
|
|
{children}
|
|
</>
|
|
);
|
|
|
|
if (onPress) {
|
|
return (
|
|
<Pressable
|
|
testID={testID}
|
|
onPress={onPress}
|
|
style={({ pressed }) => [
|
|
...cardStyle,
|
|
pressed && styles.pressed,
|
|
]}
|
|
>
|
|
{content}
|
|
</Pressable>
|
|
);
|
|
}
|
|
|
|
return <View testID={testID} style={cardStyle}>{content}</View>;
|
|
};
|
|
|
|
const styles = StyleSheet.create({
|
|
card: {
|
|
borderRadius: 16,
|
|
padding: 16,
|
|
backgroundColor: AppColors.surface,
|
|
},
|
|
title: {
|
|
fontSize: 18,
|
|
fontWeight: '600',
|
|
color: AppColors.text,
|
|
marginBottom: 12,
|
|
},
|
|
elevated: {
|
|
shadowColor: '#000',
|
|
shadowOffset: { width: 0, height: 2 },
|
|
shadowOpacity: 0.1,
|
|
shadowRadius: 8,
|
|
elevation: 4,
|
|
},
|
|
outlined: {
|
|
borderWidth: 1,
|
|
borderColor: AppColors.border,
|
|
shadowOpacity: 0,
|
|
elevation: 0,
|
|
},
|
|
filled: {
|
|
backgroundColor: AppColors.background,
|
|
shadowOpacity: 0,
|
|
elevation: 0,
|
|
},
|
|
pressed: {
|
|
opacity: 0.7,
|
|
transform: [{ scale: 0.98 }],
|
|
},
|
|
});
|