@croacroa/react-native-template 2.0.1 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +5 -0
- package/.eslintrc.js +8 -0
- package/.github/workflows/ci.yml +187 -187
- package/.github/workflows/eas-build.yml +55 -55
- package/.github/workflows/eas-update.yml +50 -50
- package/.github/workflows/npm-publish.yml +57 -0
- package/CHANGELOG.md +195 -106
- package/CONTRIBUTING.md +377 -377
- package/LICENSE +21 -0
- package/README.md +446 -399
- package/__tests__/accessibility/components.test.tsx +285 -0
- package/__tests__/components/Button.test.tsx +2 -4
- package/__tests__/components/__snapshots__/snapshots.test.tsx.snap +512 -0
- package/__tests__/components/snapshots.test.tsx +131 -131
- package/__tests__/helpers/a11y.ts +54 -0
- package/__tests__/hooks/useAnalytics.test.ts +100 -0
- package/__tests__/hooks/useAnimations.test.ts +70 -0
- package/__tests__/hooks/useAuth.test.tsx +71 -28
- package/__tests__/hooks/useMedia.test.ts +318 -0
- package/__tests__/hooks/usePayments.test.tsx +307 -0
- package/__tests__/hooks/usePermission.test.ts +230 -0
- package/__tests__/hooks/useWebSocket.test.ts +329 -0
- package/__tests__/integration/auth-api.test.tsx +224 -227
- package/__tests__/performance/VirtualizedList.perf.test.tsx +385 -362
- package/__tests__/services/api.test.ts +24 -6
- package/app/(auth)/home.tsx +11 -9
- package/app/(auth)/profile.tsx +8 -6
- package/app/(auth)/settings.tsx +11 -9
- package/app/(public)/forgot-password.tsx +25 -15
- package/app/(public)/login.tsx +48 -12
- package/app/(public)/onboarding.tsx +5 -5
- package/app/(public)/register.tsx +24 -15
- package/app/_layout.tsx +6 -3
- package/app.config.ts +27 -2
- package/assets/images/.gitkeep +7 -7
- package/assets/images/adaptive-icon.png +0 -0
- package/assets/images/favicon.png +0 -0
- package/assets/images/icon.png +0 -0
- package/assets/images/notification-icon.png +0 -0
- package/assets/images/splash.png +0 -0
- package/components/ErrorBoundary.tsx +73 -28
- package/components/auth/SocialLoginButtons.tsx +168 -0
- package/components/forms/FormInput.tsx +5 -3
- package/components/onboarding/OnboardingScreen.tsx +370 -370
- package/components/onboarding/index.ts +2 -2
- package/components/providers/AnalyticsProvider.tsx +67 -0
- package/components/providers/SuspenseBoundary.tsx +359 -357
- package/components/providers/index.ts +24 -21
- package/components/ui/AnimatedButton.tsx +1 -9
- package/components/ui/AnimatedList.tsx +98 -0
- package/components/ui/AnimatedScreen.tsx +89 -0
- package/components/ui/Avatar.tsx +319 -316
- package/components/ui/Badge.tsx +416 -416
- package/components/ui/BottomSheet.tsx +307 -307
- package/components/ui/Button.tsx +11 -3
- package/components/ui/Checkbox.tsx +261 -261
- package/components/ui/FeatureGate.tsx +57 -0
- package/components/ui/ForceUpdateScreen.tsx +108 -0
- package/components/ui/ImagePickerButton.tsx +180 -0
- package/components/ui/Input.stories.tsx +2 -10
- package/components/ui/Input.tsx +2 -10
- package/components/ui/OptimizedImage.tsx +369 -369
- package/components/ui/Paywall.tsx +253 -0
- package/components/ui/PermissionGate.tsx +155 -0
- package/components/ui/PurchaseButton.tsx +84 -0
- package/components/ui/Select.tsx +240 -240
- package/components/ui/Skeleton.tsx +3 -1
- package/components/ui/Toast.tsx +427 -0
- package/components/ui/UploadProgress.tsx +189 -0
- package/components/ui/VirtualizedList.tsx +288 -285
- package/components/ui/index.ts +28 -23
- package/constants/config.ts +135 -97
- package/docs/adr/001-state-management.md +79 -79
- package/docs/adr/002-styling-approach.md +130 -130
- package/docs/adr/003-data-fetching.md +155 -155
- package/docs/adr/004-auth-adapter-pattern.md +144 -144
- package/docs/adr/README.md +78 -78
- package/docs/guides/analytics-posthog.md +121 -0
- package/docs/guides/auth-supabase.md +162 -0
- package/docs/guides/feature-flags-launchdarkly.md +150 -0
- package/docs/guides/payments-revenuecat.md +169 -0
- package/docs/plans/2026-02-22-phase6-implementation.md +3222 -0
- package/docs/plans/2026-02-22-phase6-template-completion-design.md +196 -0
- package/docs/plans/2026-02-23-npm-publish-design.md +31 -0
- package/docs/plans/2026-02-23-phase7-polish-documentation-design.md +79 -0
- package/docs/plans/2026-02-23-phase8-additional-features-design.md +136 -0
- package/eas.json +2 -1
- package/hooks/index.ts +70 -27
- package/hooks/useAnimatedEntry.ts +204 -0
- package/hooks/useApi.ts +64 -4
- package/hooks/useAuth.tsx +7 -3
- package/hooks/useBiometrics.ts +295 -295
- package/hooks/useChannel.ts +111 -0
- package/hooks/useDeepLinking.ts +256 -256
- package/hooks/useExperiment.ts +36 -0
- package/hooks/useFeatureFlag.ts +59 -0
- package/hooks/useForceUpdate.ts +91 -0
- package/hooks/useImagePicker.ts +281 -0
- package/hooks/useInAppReview.ts +64 -0
- package/hooks/useMFA.ts +509 -499
- package/hooks/useParallax.ts +142 -0
- package/hooks/usePerformance.ts +434 -434
- package/hooks/usePermission.ts +190 -0
- package/hooks/usePresence.ts +129 -0
- package/hooks/useProducts.ts +36 -0
- package/hooks/usePurchase.ts +103 -0
- package/hooks/useRateLimit.ts +70 -0
- package/hooks/useSubscription.ts +49 -0
- package/hooks/useTrackEvent.ts +52 -0
- package/hooks/useTrackScreen.ts +40 -0
- package/hooks/useUpdates.ts +358 -358
- package/hooks/useUpload.ts +165 -0
- package/hooks/useWebSocket.ts +111 -0
- package/i18n/index.ts +197 -194
- package/i18n/locales/ar.json +170 -101
- package/i18n/locales/de.json +170 -101
- package/i18n/locales/en.json +170 -101
- package/i18n/locales/es.json +170 -101
- package/i18n/locales/fr.json +170 -101
- package/jest.config.js +1 -1
- package/maestro/README.md +113 -113
- package/maestro/config.yaml +35 -35
- package/maestro/flows/login.yaml +62 -62
- package/maestro/flows/mfa-login.yaml +92 -92
- package/maestro/flows/mfa-setup.yaml +86 -86
- package/maestro/flows/navigation.yaml +68 -68
- package/maestro/flows/offline-conflict.yaml +101 -101
- package/maestro/flows/offline-sync.yaml +128 -128
- package/maestro/flows/offline.yaml +60 -60
- package/maestro/flows/register.yaml +94 -94
- package/package.json +188 -175
- package/scripts/generate-placeholders.js +38 -0
- package/services/analytics/adapters/console.ts +50 -0
- package/services/analytics/analytics-adapter.ts +94 -0
- package/services/analytics/types.ts +73 -0
- package/services/analytics.ts +428 -428
- package/services/api.ts +419 -340
- package/services/auth/social/apple.ts +110 -0
- package/services/auth/social/google.ts +159 -0
- package/services/auth/social/social-auth.ts +100 -0
- package/services/auth/social/types.ts +80 -0
- package/services/authAdapter.ts +333 -333
- package/services/backgroundSync.ts +652 -626
- package/services/feature-flags/adapters/mock.ts +108 -0
- package/services/feature-flags/feature-flag-adapter.ts +174 -0
- package/services/feature-flags/types.ts +79 -0
- package/services/force-update.ts +140 -0
- package/services/index.ts +116 -54
- package/services/media/compression.ts +91 -0
- package/services/media/media-picker.ts +151 -0
- package/services/media/media-upload.ts +160 -0
- package/services/payments/adapters/mock.ts +159 -0
- package/services/payments/payment-adapter.ts +118 -0
- package/services/payments/types.ts +131 -0
- package/services/permissions/permission-manager.ts +284 -0
- package/services/permissions/types.ts +104 -0
- package/services/realtime/types.ts +100 -0
- package/services/realtime/websocket-manager.ts +441 -0
- package/services/security.ts +289 -286
- package/services/sentry.ts +4 -4
- package/stores/appStore.ts +9 -0
- package/stores/notificationStore.ts +3 -1
- package/tailwind.config.js +47 -47
- package/tsconfig.json +37 -13
- package/types/user.ts +1 -1
- package/utils/accessibility.ts +446 -446
- package/utils/animations/presets.ts +182 -0
- package/utils/animations/transitions.ts +62 -0
- package/utils/index.ts +63 -52
- package/utils/toast.ts +9 -2
- package/utils/validation.ts +4 -1
- package/utils/withAccessibility.tsx +272 -272
package/maestro/flows/login.yaml
CHANGED
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
appId: ${APP_ID}
|
|
2
|
-
name: Login Flow
|
|
3
|
-
tags:
|
|
4
|
-
- auth
|
|
5
|
-
- smoke
|
|
6
|
-
---
|
|
7
|
-
# Login Flow Test
|
|
8
|
-
# Tests the complete login experience
|
|
9
|
-
|
|
10
|
-
- launchApp:
|
|
11
|
-
clearState: true
|
|
12
|
-
|
|
13
|
-
# Wait for app to load
|
|
14
|
-
- waitForAnimationToEnd
|
|
15
|
-
|
|
16
|
-
# Verify we're on the login screen
|
|
17
|
-
- assertVisible: "Sign In"
|
|
18
|
-
- assertVisible: "Sign in to continue"
|
|
19
|
-
|
|
20
|
-
# Test empty form submission
|
|
21
|
-
- tapOn: "Sign In"
|
|
22
|
-
- assertVisible: "required"
|
|
23
|
-
|
|
24
|
-
# Enter invalid email
|
|
25
|
-
- tapOn:
|
|
26
|
-
text: "Email"
|
|
27
|
-
- inputText: "invalid-email"
|
|
28
|
-
- tapOn: "Sign In"
|
|
29
|
-
- assertVisible: "valid email"
|
|
30
|
-
|
|
31
|
-
# Clear and enter valid credentials
|
|
32
|
-
- clearText
|
|
33
|
-
- inputText: "test@example.com"
|
|
34
|
-
|
|
35
|
-
# Enter password
|
|
36
|
-
- tapOn:
|
|
37
|
-
text: "Password"
|
|
38
|
-
- inputText: "password123"
|
|
39
|
-
|
|
40
|
-
# Toggle password visibility
|
|
41
|
-
- tapOn:
|
|
42
|
-
id: "password-toggle"
|
|
43
|
-
- assertVisible: "password123"
|
|
44
|
-
- tapOn:
|
|
45
|
-
id: "password-toggle"
|
|
46
|
-
|
|
47
|
-
# Submit the form
|
|
48
|
-
- tapOn:
|
|
49
|
-
text: "Sign In"
|
|
50
|
-
index: 1
|
|
51
|
-
|
|
52
|
-
# Wait for loading
|
|
53
|
-
- waitForAnimationToEnd:
|
|
54
|
-
timeout: 5000
|
|
55
|
-
|
|
56
|
-
# Verify successful login (should see home screen)
|
|
57
|
-
- assertVisible: "Welcome back"
|
|
58
|
-
|
|
59
|
-
# Verify we're on the authenticated section
|
|
60
|
-
- assertVisible:
|
|
61
|
-
text: "Home"
|
|
62
|
-
optional: true
|
|
1
|
+
appId: ${APP_ID}
|
|
2
|
+
name: Login Flow
|
|
3
|
+
tags:
|
|
4
|
+
- auth
|
|
5
|
+
- smoke
|
|
6
|
+
---
|
|
7
|
+
# Login Flow Test
|
|
8
|
+
# Tests the complete login experience
|
|
9
|
+
|
|
10
|
+
- launchApp:
|
|
11
|
+
clearState: true
|
|
12
|
+
|
|
13
|
+
# Wait for app to load
|
|
14
|
+
- waitForAnimationToEnd
|
|
15
|
+
|
|
16
|
+
# Verify we're on the login screen
|
|
17
|
+
- assertVisible: "Sign In"
|
|
18
|
+
- assertVisible: "Sign in to continue"
|
|
19
|
+
|
|
20
|
+
# Test empty form submission
|
|
21
|
+
- tapOn: "Sign In"
|
|
22
|
+
- assertVisible: "required"
|
|
23
|
+
|
|
24
|
+
# Enter invalid email
|
|
25
|
+
- tapOn:
|
|
26
|
+
text: "Email"
|
|
27
|
+
- inputText: "invalid-email"
|
|
28
|
+
- tapOn: "Sign In"
|
|
29
|
+
- assertVisible: "valid email"
|
|
30
|
+
|
|
31
|
+
# Clear and enter valid credentials
|
|
32
|
+
- clearText
|
|
33
|
+
- inputText: "test@example.com"
|
|
34
|
+
|
|
35
|
+
# Enter password
|
|
36
|
+
- tapOn:
|
|
37
|
+
text: "Password"
|
|
38
|
+
- inputText: "password123"
|
|
39
|
+
|
|
40
|
+
# Toggle password visibility
|
|
41
|
+
- tapOn:
|
|
42
|
+
id: "password-toggle"
|
|
43
|
+
- assertVisible: "password123"
|
|
44
|
+
- tapOn:
|
|
45
|
+
id: "password-toggle"
|
|
46
|
+
|
|
47
|
+
# Submit the form
|
|
48
|
+
- tapOn:
|
|
49
|
+
text: "Sign In"
|
|
50
|
+
index: 1
|
|
51
|
+
|
|
52
|
+
# Wait for loading
|
|
53
|
+
- waitForAnimationToEnd:
|
|
54
|
+
timeout: 5000
|
|
55
|
+
|
|
56
|
+
# Verify successful login (should see home screen)
|
|
57
|
+
- assertVisible: "Welcome back"
|
|
58
|
+
|
|
59
|
+
# Verify we're on the authenticated section
|
|
60
|
+
- assertVisible:
|
|
61
|
+
text: "Home"
|
|
62
|
+
optional: true
|
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
appId: ${APP_ID}
|
|
2
|
-
name: MFA Login Flow
|
|
3
|
-
tags:
|
|
4
|
-
- auth
|
|
5
|
-
- mfa
|
|
6
|
-
- security
|
|
7
|
-
---
|
|
8
|
-
# MFA Login Test
|
|
9
|
-
# Tests login with MFA verification required
|
|
10
|
-
|
|
11
|
-
- launchApp:
|
|
12
|
-
clearState: true
|
|
13
|
-
|
|
14
|
-
# Wait for app to load
|
|
15
|
-
- waitForAnimationToEnd
|
|
16
|
-
|
|
17
|
-
# Enter credentials
|
|
18
|
-
- tapOn:
|
|
19
|
-
text: "Email"
|
|
20
|
-
- inputText: "mfa-user@example.com"
|
|
21
|
-
- tapOn:
|
|
22
|
-
text: "Password"
|
|
23
|
-
- inputText: "password123"
|
|
24
|
-
|
|
25
|
-
# Submit login
|
|
26
|
-
- tapOn:
|
|
27
|
-
text: "Sign In"
|
|
28
|
-
index: 1
|
|
29
|
-
- waitForAnimationToEnd:
|
|
30
|
-
timeout: 5000
|
|
31
|
-
|
|
32
|
-
# Verify MFA screen appears
|
|
33
|
-
- assertVisible:
|
|
34
|
-
text:
|
|
35
|
-
- "verification"
|
|
36
|
-
- "code"
|
|
37
|
-
- "2FA"
|
|
38
|
-
- "authenticator"
|
|
39
|
-
optional: true
|
|
40
|
-
|
|
41
|
-
# Enter MFA code
|
|
42
|
-
- tapOn:
|
|
43
|
-
id: "mfa-input"
|
|
44
|
-
optional: true
|
|
45
|
-
- inputText: "123456"
|
|
46
|
-
|
|
47
|
-
# Or enter in OTP input fields
|
|
48
|
-
- tapOn:
|
|
49
|
-
id: "otp-input-0"
|
|
50
|
-
optional: true
|
|
51
|
-
- inputText: "1"
|
|
52
|
-
- tapOn:
|
|
53
|
-
id: "otp-input-1"
|
|
54
|
-
optional: true
|
|
55
|
-
- inputText: "2"
|
|
56
|
-
- tapOn:
|
|
57
|
-
id: "otp-input-2"
|
|
58
|
-
optional: true
|
|
59
|
-
- inputText: "3"
|
|
60
|
-
- tapOn:
|
|
61
|
-
id: "otp-input-3"
|
|
62
|
-
optional: true
|
|
63
|
-
- inputText: "4"
|
|
64
|
-
- tapOn:
|
|
65
|
-
id: "otp-input-4"
|
|
66
|
-
optional: true
|
|
67
|
-
- inputText: "5"
|
|
68
|
-
- tapOn:
|
|
69
|
-
id: "otp-input-5"
|
|
70
|
-
optional: true
|
|
71
|
-
- inputText: "6"
|
|
72
|
-
|
|
73
|
-
# Submit MFA code
|
|
74
|
-
- tapOn:
|
|
75
|
-
text: "Verify"
|
|
76
|
-
optional: true
|
|
77
|
-
- waitForAnimationToEnd:
|
|
78
|
-
timeout: 5000
|
|
79
|
-
|
|
80
|
-
# Verify successful login
|
|
81
|
-
- assertVisible:
|
|
82
|
-
text:
|
|
83
|
-
- "Home"
|
|
84
|
-
- "Welcome"
|
|
85
|
-
- "Dashboard"
|
|
86
|
-
optional: true
|
|
87
|
-
|
|
88
|
-
# Test backup code flow
|
|
89
|
-
- runFlow:
|
|
90
|
-
when:
|
|
91
|
-
visible: "Use backup code"
|
|
92
|
-
file: mfa-backup-code.yaml
|
|
1
|
+
appId: ${APP_ID}
|
|
2
|
+
name: MFA Login Flow
|
|
3
|
+
tags:
|
|
4
|
+
- auth
|
|
5
|
+
- mfa
|
|
6
|
+
- security
|
|
7
|
+
---
|
|
8
|
+
# MFA Login Test
|
|
9
|
+
# Tests login with MFA verification required
|
|
10
|
+
|
|
11
|
+
- launchApp:
|
|
12
|
+
clearState: true
|
|
13
|
+
|
|
14
|
+
# Wait for app to load
|
|
15
|
+
- waitForAnimationToEnd
|
|
16
|
+
|
|
17
|
+
# Enter credentials
|
|
18
|
+
- tapOn:
|
|
19
|
+
text: "Email"
|
|
20
|
+
- inputText: "mfa-user@example.com"
|
|
21
|
+
- tapOn:
|
|
22
|
+
text: "Password"
|
|
23
|
+
- inputText: "password123"
|
|
24
|
+
|
|
25
|
+
# Submit login
|
|
26
|
+
- tapOn:
|
|
27
|
+
text: "Sign In"
|
|
28
|
+
index: 1
|
|
29
|
+
- waitForAnimationToEnd:
|
|
30
|
+
timeout: 5000
|
|
31
|
+
|
|
32
|
+
# Verify MFA screen appears
|
|
33
|
+
- assertVisible:
|
|
34
|
+
text:
|
|
35
|
+
- "verification"
|
|
36
|
+
- "code"
|
|
37
|
+
- "2FA"
|
|
38
|
+
- "authenticator"
|
|
39
|
+
optional: true
|
|
40
|
+
|
|
41
|
+
# Enter MFA code
|
|
42
|
+
- tapOn:
|
|
43
|
+
id: "mfa-input"
|
|
44
|
+
optional: true
|
|
45
|
+
- inputText: "123456"
|
|
46
|
+
|
|
47
|
+
# Or enter in OTP input fields
|
|
48
|
+
- tapOn:
|
|
49
|
+
id: "otp-input-0"
|
|
50
|
+
optional: true
|
|
51
|
+
- inputText: "1"
|
|
52
|
+
- tapOn:
|
|
53
|
+
id: "otp-input-1"
|
|
54
|
+
optional: true
|
|
55
|
+
- inputText: "2"
|
|
56
|
+
- tapOn:
|
|
57
|
+
id: "otp-input-2"
|
|
58
|
+
optional: true
|
|
59
|
+
- inputText: "3"
|
|
60
|
+
- tapOn:
|
|
61
|
+
id: "otp-input-3"
|
|
62
|
+
optional: true
|
|
63
|
+
- inputText: "4"
|
|
64
|
+
- tapOn:
|
|
65
|
+
id: "otp-input-4"
|
|
66
|
+
optional: true
|
|
67
|
+
- inputText: "5"
|
|
68
|
+
- tapOn:
|
|
69
|
+
id: "otp-input-5"
|
|
70
|
+
optional: true
|
|
71
|
+
- inputText: "6"
|
|
72
|
+
|
|
73
|
+
# Submit MFA code
|
|
74
|
+
- tapOn:
|
|
75
|
+
text: "Verify"
|
|
76
|
+
optional: true
|
|
77
|
+
- waitForAnimationToEnd:
|
|
78
|
+
timeout: 5000
|
|
79
|
+
|
|
80
|
+
# Verify successful login
|
|
81
|
+
- assertVisible:
|
|
82
|
+
text:
|
|
83
|
+
- "Home"
|
|
84
|
+
- "Welcome"
|
|
85
|
+
- "Dashboard"
|
|
86
|
+
optional: true
|
|
87
|
+
|
|
88
|
+
# Test backup code flow
|
|
89
|
+
- runFlow:
|
|
90
|
+
when:
|
|
91
|
+
visible: "Use backup code"
|
|
92
|
+
file: mfa-backup-code.yaml
|
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
appId: ${APP_ID}
|
|
2
|
-
name: MFA Setup Flow
|
|
3
|
-
tags:
|
|
4
|
-
- auth
|
|
5
|
-
- mfa
|
|
6
|
-
- security
|
|
7
|
-
---
|
|
8
|
-
# MFA Setup Test
|
|
9
|
-
# Tests the complete MFA (2FA) setup experience
|
|
10
|
-
|
|
11
|
-
- launchApp:
|
|
12
|
-
clearState: true
|
|
13
|
-
|
|
14
|
-
# Login first
|
|
15
|
-
- tapOn:
|
|
16
|
-
text: "Email"
|
|
17
|
-
- inputText: "test@example.com"
|
|
18
|
-
- tapOn:
|
|
19
|
-
text: "Password"
|
|
20
|
-
- inputText: "password123"
|
|
21
|
-
- tapOn:
|
|
22
|
-
text: "Sign In"
|
|
23
|
-
index: 1
|
|
24
|
-
- waitForAnimationToEnd:
|
|
25
|
-
timeout: 5000
|
|
26
|
-
|
|
27
|
-
# Navigate to settings
|
|
28
|
-
- tapOn: "Settings"
|
|
29
|
-
- waitForAnimationToEnd
|
|
30
|
-
|
|
31
|
-
# Find and tap on security section
|
|
32
|
-
- scrollUntilVisible:
|
|
33
|
-
element: "Security"
|
|
34
|
-
direction: DOWN
|
|
35
|
-
- tapOn: "Security"
|
|
36
|
-
- waitForAnimationToEnd
|
|
37
|
-
|
|
38
|
-
# Tap on enable MFA
|
|
39
|
-
- tapOn: "Biometric Authentication"
|
|
40
|
-
- waitForAnimationToEnd
|
|
41
|
-
|
|
42
|
-
# OR tap on 2FA if available
|
|
43
|
-
- tapOn:
|
|
44
|
-
text: "Two-Factor Authentication"
|
|
45
|
-
optional: true
|
|
46
|
-
- waitForAnimationToEnd
|
|
47
|
-
|
|
48
|
-
# Verify MFA setup screen appears
|
|
49
|
-
- assertVisible:
|
|
50
|
-
text: "Enable"
|
|
51
|
-
optional: true
|
|
52
|
-
|
|
53
|
-
# If there's an enable button, tap it
|
|
54
|
-
- tapOn:
|
|
55
|
-
text: "Enable 2FA"
|
|
56
|
-
optional: true
|
|
57
|
-
- waitForAnimationToEnd
|
|
58
|
-
|
|
59
|
-
# Verify QR code or setup instructions appear
|
|
60
|
-
- assertVisible:
|
|
61
|
-
text:
|
|
62
|
-
- "Authenticator"
|
|
63
|
-
- "QR"
|
|
64
|
-
- "code"
|
|
65
|
-
optional: true
|
|
66
|
-
|
|
67
|
-
# Enter verification code (mock: 123456)
|
|
68
|
-
- tapOn:
|
|
69
|
-
text: "Verification"
|
|
70
|
-
optional: true
|
|
71
|
-
- inputText: "123456"
|
|
72
|
-
|
|
73
|
-
# Confirm setup
|
|
74
|
-
- tapOn:
|
|
75
|
-
text: "Verify"
|
|
76
|
-
optional: true
|
|
77
|
-
- waitForAnimationToEnd:
|
|
78
|
-
timeout: 3000
|
|
79
|
-
|
|
80
|
-
# Verify success message or enabled state
|
|
81
|
-
- assertVisible:
|
|
82
|
-
text:
|
|
83
|
-
- "enabled"
|
|
84
|
-
- "success"
|
|
85
|
-
- "active"
|
|
86
|
-
optional: true
|
|
1
|
+
appId: ${APP_ID}
|
|
2
|
+
name: MFA Setup Flow
|
|
3
|
+
tags:
|
|
4
|
+
- auth
|
|
5
|
+
- mfa
|
|
6
|
+
- security
|
|
7
|
+
---
|
|
8
|
+
# MFA Setup Test
|
|
9
|
+
# Tests the complete MFA (2FA) setup experience
|
|
10
|
+
|
|
11
|
+
- launchApp:
|
|
12
|
+
clearState: true
|
|
13
|
+
|
|
14
|
+
# Login first
|
|
15
|
+
- tapOn:
|
|
16
|
+
text: "Email"
|
|
17
|
+
- inputText: "test@example.com"
|
|
18
|
+
- tapOn:
|
|
19
|
+
text: "Password"
|
|
20
|
+
- inputText: "password123"
|
|
21
|
+
- tapOn:
|
|
22
|
+
text: "Sign In"
|
|
23
|
+
index: 1
|
|
24
|
+
- waitForAnimationToEnd:
|
|
25
|
+
timeout: 5000
|
|
26
|
+
|
|
27
|
+
# Navigate to settings
|
|
28
|
+
- tapOn: "Settings"
|
|
29
|
+
- waitForAnimationToEnd
|
|
30
|
+
|
|
31
|
+
# Find and tap on security section
|
|
32
|
+
- scrollUntilVisible:
|
|
33
|
+
element: "Security"
|
|
34
|
+
direction: DOWN
|
|
35
|
+
- tapOn: "Security"
|
|
36
|
+
- waitForAnimationToEnd
|
|
37
|
+
|
|
38
|
+
# Tap on enable MFA
|
|
39
|
+
- tapOn: "Biometric Authentication"
|
|
40
|
+
- waitForAnimationToEnd
|
|
41
|
+
|
|
42
|
+
# OR tap on 2FA if available
|
|
43
|
+
- tapOn:
|
|
44
|
+
text: "Two-Factor Authentication"
|
|
45
|
+
optional: true
|
|
46
|
+
- waitForAnimationToEnd
|
|
47
|
+
|
|
48
|
+
# Verify MFA setup screen appears
|
|
49
|
+
- assertVisible:
|
|
50
|
+
text: "Enable"
|
|
51
|
+
optional: true
|
|
52
|
+
|
|
53
|
+
# If there's an enable button, tap it
|
|
54
|
+
- tapOn:
|
|
55
|
+
text: "Enable 2FA"
|
|
56
|
+
optional: true
|
|
57
|
+
- waitForAnimationToEnd
|
|
58
|
+
|
|
59
|
+
# Verify QR code or setup instructions appear
|
|
60
|
+
- assertVisible:
|
|
61
|
+
text:
|
|
62
|
+
- "Authenticator"
|
|
63
|
+
- "QR"
|
|
64
|
+
- "code"
|
|
65
|
+
optional: true
|
|
66
|
+
|
|
67
|
+
# Enter verification code (mock: 123456)
|
|
68
|
+
- tapOn:
|
|
69
|
+
text: "Verification"
|
|
70
|
+
optional: true
|
|
71
|
+
- inputText: "123456"
|
|
72
|
+
|
|
73
|
+
# Confirm setup
|
|
74
|
+
- tapOn:
|
|
75
|
+
text: "Verify"
|
|
76
|
+
optional: true
|
|
77
|
+
- waitForAnimationToEnd:
|
|
78
|
+
timeout: 3000
|
|
79
|
+
|
|
80
|
+
# Verify success message or enabled state
|
|
81
|
+
- assertVisible:
|
|
82
|
+
text:
|
|
83
|
+
- "enabled"
|
|
84
|
+
- "success"
|
|
85
|
+
- "active"
|
|
86
|
+
optional: true
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
appId: ${APP_ID}
|
|
2
|
-
name: Navigation Flow
|
|
3
|
-
tags:
|
|
4
|
-
- navigation
|
|
5
|
-
- smoke
|
|
6
|
-
---
|
|
7
|
-
# Navigation Flow Test
|
|
8
|
-
# Tests navigation between main screens
|
|
9
|
-
|
|
10
|
-
- launchApp:
|
|
11
|
-
clearState: true
|
|
12
|
-
|
|
13
|
-
# Login first
|
|
14
|
-
- tapOn:
|
|
15
|
-
text: "Email"
|
|
16
|
-
- inputText: "test@example.com"
|
|
17
|
-
- tapOn:
|
|
18
|
-
text: "Password"
|
|
19
|
-
- inputText: "password123"
|
|
20
|
-
- tapOn:
|
|
21
|
-
text: "Sign In"
|
|
22
|
-
index: 1
|
|
23
|
-
- waitForAnimationToEnd:
|
|
24
|
-
timeout: 5000
|
|
25
|
-
|
|
26
|
-
# Verify we're on home
|
|
27
|
-
- assertVisible: "Home"
|
|
28
|
-
|
|
29
|
-
# Navigate to Profile
|
|
30
|
-
- tapOn: "Profile"
|
|
31
|
-
- waitForAnimationToEnd
|
|
32
|
-
- assertVisible: "Profile"
|
|
33
|
-
- assertVisible: "test@example.com"
|
|
34
|
-
|
|
35
|
-
# Navigate to Settings
|
|
36
|
-
- tapOn: "Settings"
|
|
37
|
-
- waitForAnimationToEnd
|
|
38
|
-
- assertVisible: "Settings"
|
|
39
|
-
- assertVisible: "Appearance"
|
|
40
|
-
- assertVisible: "Theme"
|
|
41
|
-
|
|
42
|
-
# Test theme toggle
|
|
43
|
-
- tapOn: "Theme"
|
|
44
|
-
- waitForAnimationToEnd
|
|
45
|
-
- assertVisible: "Dark"
|
|
46
|
-
- tapOn: "Dark"
|
|
47
|
-
- waitForAnimationToEnd
|
|
48
|
-
|
|
49
|
-
# Go back
|
|
50
|
-
- back
|
|
51
|
-
- assertVisible: "Settings"
|
|
52
|
-
|
|
53
|
-
# Navigate back to Home
|
|
54
|
-
- tapOn: "Home"
|
|
55
|
-
- waitForAnimationToEnd
|
|
56
|
-
- assertVisible: "Home"
|
|
57
|
-
|
|
58
|
-
# Test sign out
|
|
59
|
-
- tapOn: "Profile"
|
|
60
|
-
- waitForAnimationToEnd
|
|
61
|
-
- scrollUntilVisible:
|
|
62
|
-
element: "Sign Out"
|
|
63
|
-
direction: DOWN
|
|
64
|
-
- tapOn: "Sign Out"
|
|
65
|
-
- waitForAnimationToEnd
|
|
66
|
-
|
|
67
|
-
# Verify we're back on login
|
|
68
|
-
- assertVisible: "Sign In"
|
|
1
|
+
appId: ${APP_ID}
|
|
2
|
+
name: Navigation Flow
|
|
3
|
+
tags:
|
|
4
|
+
- navigation
|
|
5
|
+
- smoke
|
|
6
|
+
---
|
|
7
|
+
# Navigation Flow Test
|
|
8
|
+
# Tests navigation between main screens
|
|
9
|
+
|
|
10
|
+
- launchApp:
|
|
11
|
+
clearState: true
|
|
12
|
+
|
|
13
|
+
# Login first
|
|
14
|
+
- tapOn:
|
|
15
|
+
text: "Email"
|
|
16
|
+
- inputText: "test@example.com"
|
|
17
|
+
- tapOn:
|
|
18
|
+
text: "Password"
|
|
19
|
+
- inputText: "password123"
|
|
20
|
+
- tapOn:
|
|
21
|
+
text: "Sign In"
|
|
22
|
+
index: 1
|
|
23
|
+
- waitForAnimationToEnd:
|
|
24
|
+
timeout: 5000
|
|
25
|
+
|
|
26
|
+
# Verify we're on home
|
|
27
|
+
- assertVisible: "Home"
|
|
28
|
+
|
|
29
|
+
# Navigate to Profile
|
|
30
|
+
- tapOn: "Profile"
|
|
31
|
+
- waitForAnimationToEnd
|
|
32
|
+
- assertVisible: "Profile"
|
|
33
|
+
- assertVisible: "test@example.com"
|
|
34
|
+
|
|
35
|
+
# Navigate to Settings
|
|
36
|
+
- tapOn: "Settings"
|
|
37
|
+
- waitForAnimationToEnd
|
|
38
|
+
- assertVisible: "Settings"
|
|
39
|
+
- assertVisible: "Appearance"
|
|
40
|
+
- assertVisible: "Theme"
|
|
41
|
+
|
|
42
|
+
# Test theme toggle
|
|
43
|
+
- tapOn: "Theme"
|
|
44
|
+
- waitForAnimationToEnd
|
|
45
|
+
- assertVisible: "Dark"
|
|
46
|
+
- tapOn: "Dark"
|
|
47
|
+
- waitForAnimationToEnd
|
|
48
|
+
|
|
49
|
+
# Go back
|
|
50
|
+
- back
|
|
51
|
+
- assertVisible: "Settings"
|
|
52
|
+
|
|
53
|
+
# Navigate back to Home
|
|
54
|
+
- tapOn: "Home"
|
|
55
|
+
- waitForAnimationToEnd
|
|
56
|
+
- assertVisible: "Home"
|
|
57
|
+
|
|
58
|
+
# Test sign out
|
|
59
|
+
- tapOn: "Profile"
|
|
60
|
+
- waitForAnimationToEnd
|
|
61
|
+
- scrollUntilVisible:
|
|
62
|
+
element: "Sign Out"
|
|
63
|
+
direction: DOWN
|
|
64
|
+
- tapOn: "Sign Out"
|
|
65
|
+
- waitForAnimationToEnd
|
|
66
|
+
|
|
67
|
+
# Verify we're back on login
|
|
68
|
+
- assertVisible: "Sign In"
|