@shaykec/app-agent 1.0.6 → 1.0.7

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.
Files changed (32) hide show
  1. package/dist/commands/configure.js +2 -3
  2. package/dist/commands/configure.js.map +1 -1
  3. package/package.json +1 -1
  4. package/templates/android/BookTemplate/tests/03_provider_detail.yaml +0 -6
  5. package/templates/android/BookTemplate/tests/04_booking_detail.yaml +0 -12
  6. package/templates/android/BookTemplate/tests/08_full_e2e.yaml +15 -15
  7. package/templates/ios/BookTemplate/tests/01_launch_discover.yaml +14 -7
  8. package/templates/ios/BookTemplate/tests/02_tab_navigation.yaml +7 -7
  9. package/templates/ios/BookTemplate/tests/03_provider_detail.yaml +0 -6
  10. package/templates/ios/BookTemplate/tests/04_booking_detail.yaml +0 -12
  11. package/templates/ios/BookTemplate/tests/06_search_filter.yaml +14 -31
  12. package/templates/ios/BookTemplate/tests/08_full_e2e.yaml +15 -15
  13. package/templates/shared/android/SecretsConfig/INTEGRATION.md +0 -2
  14. package/templates/shared/android/SecretsConfig/SETUP.md +3 -2
  15. package/templates/shared/android/SecretsConfig/SecretsConfig.kt +2 -2
  16. package/templates/shared/android/SecretsConfig/build.gradle.snippet.kts +1 -2
  17. package/templates/shared/android/SecretsConfig/secrets.properties.template +3 -2
  18. package/templates/shared/android/WixMemberBackend/WixAuthManager.kt +8 -1
  19. package/templates/shared/ios/SecretsConfig/INTEGRATION.md +0 -2
  20. package/templates/shared/ios/SecretsConfig/SETUP.md +3 -2
  21. package/templates/shared/ios/SecretsConfig/Secrets.xcconfig.template +3 -2
  22. package/templates/shared/ios/SecretsConfig/SecretsConfig.swift +2 -2
  23. package/templates/shared/ios/WixMemberBackend/INTEGRATION.md +9 -18
  24. package/templates/shared/ios/WixMemberBackend/SETUP.md +4 -2
  25. package/templates/shared/ios/WixMemberBackend/WixAuthService.swift +14 -3
  26. package/templates/shared/ios/WixOwnerBackend/INTEGRATION.md +2 -4
  27. package/templates/shared/ios/WixOwnerBackend/WixAdminAuthService.swift +1 -2
  28. package/templates/shared/ios/WixSiteSelector/INTEGRATION.md +2 -2
  29. package/templates/shared/keys.json.schema.json +0 -5
  30. package/templates/shared/tests/android/WixSiteSelector/WixSiteSelectorTest.kt +160 -0
  31. package/templates/shared/tests/ios/WixSiteSelector/WixSiteSelectorTests.swift +162 -0
  32. package/templates/shared/tests/maestro/wix_site_selector_flow.yaml +75 -0
@@ -5,7 +5,7 @@ import { PATHS } from "../config.js";
5
5
  /** Supported backend modules and their required keys */
6
6
  const MODULE_KEYS = {
7
7
  WixMemberBackend: {
8
- keys: ["WIX_CLIENT_ID", "WIX_SITE_ID", "WIX_REDIRECT_URL"],
8
+ keys: ["WIX_CLIENT_ID", "WIX_SITE_ID"],
9
9
  detect: ["WixAPIClient", "WixAuthService", "WixAuthManager", "WixApiClient"],
10
10
  },
11
11
  WixOwnerBackend: {
@@ -84,8 +84,7 @@ function mapKeysToConfig(keys) {
84
84
  config["WIX_SITE_ID"] = keys.wix.siteId;
85
85
  if (keys.wix?.apiKey)
86
86
  config["WIX_API_KEY"] = keys.wix.apiKey;
87
- if (keys.wix?.redirectUrl)
88
- config["WIX_REDIRECT_URL"] = keys.wix.redirectUrl;
87
+ // Note: WIX_REDIRECT_URL is auto-derived from bundle ID / package name
89
88
  if (keys.supabase?.url)
90
89
  config["SUPABASE_URL"] = keys.supabase.url;
91
90
  if (keys.supabase?.anonKey)
@@ -1 +1 @@
1
- {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shaykec/app-agent",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "description": "AI-powered mobile app generator using Cursor CLI and templates",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -38,9 +38,3 @@ appId: ${APP_PACKAGE_NAME}
38
38
  id: "provider_detail_favorite_button"
39
39
  # Navigate back
40
40
  - back
41
- - extendedWaitUntil:
42
- visible:
43
- id: "discovery_search_field"
44
- timeout: 5000
45
- - assertVisible:
46
- id: "discovery_search_field"
@@ -24,18 +24,6 @@ appId: ${APP_PACKAGE_NAME}
24
24
  - assertVisible:
25
25
  id: "bookings_empty_state"
26
26
  optional: true
27
- # Open booking detail if available
28
- - tapOn:
29
- id: "bookings_booking_0_card"
30
- optional: true
31
- - assertVisible:
32
- id: "booking_detail_reschedule_button"
33
- optional: true
34
- - assertVisible:
35
- id: "booking_detail_cancel_button"
36
- optional: true
37
- # Go back
38
- - back
39
27
  # Navigate to Favorites tab
40
28
  - tapOn: "Favorites"
41
29
  - waitForAnimationToEnd
@@ -15,61 +15,61 @@ appId: ${APP_PACKAGE_NAME}
15
15
  # Step 1: Verify Discover content
16
16
  - assertVisible:
17
17
  id: "discovery_search_field"
18
- - assertVisible:
19
- id: "discovery_provider_0_card"
20
- optional: true
21
- # Step 2: Open provider detail
18
+ # Step 2: Open provider detail and favorite it
22
19
  - tapOn:
23
20
  id: "discovery_provider_0_card"
24
21
  optional: true
25
22
  - extendedWaitUntil:
26
23
  visible:
27
- id: "provider_detail_book_now_button"
24
+ id: "provider_detail_favorite_button"
28
25
  timeout: 5000
29
26
  optional: true
30
- # Step 3: Verify detail and favorite
31
- - assertVisible:
32
- id: "provider_detail_favorite_button"
33
- optional: true
34
27
  - tapOn:
35
28
  id: "provider_detail_favorite_button"
36
29
  optional: true
30
+ - assertVisible:
31
+ id: "provider_detail_book_now_button"
32
+ optional: true
37
33
  - back
38
- # Step 4: Search
34
+ # Step 3: Search
39
35
  - extendedWaitUntil:
40
36
  visible:
41
37
  id: "discovery_search_field"
42
38
  timeout: 5000
39
+ optional: true
43
40
  - tapOn:
44
41
  id: "discovery_search_field"
42
+ optional: true
45
43
  - extendedWaitUntil:
46
44
  visible:
47
45
  id: "search_input_field"
48
46
  timeout: 3000
47
+ optional: true
49
48
  - tapOn:
50
49
  id: "search_input_field"
50
+ optional: true
51
51
  - inputText: "Wellness"
52
52
  - tapOn:
53
53
  id: "search_cancel_button"
54
54
  optional: true
55
- # Step 5: Near Me tab
55
+ # Step 4: Near Me tab
56
56
  - tapOn: "Near Me"
57
57
  - waitForAnimationToEnd
58
58
  - assertVisible:
59
59
  id: "map_list_toggle_button"
60
- # Step 6: Bookings tab
60
+ # Step 5: Bookings tab
61
61
  - tapOn: "Bookings"
62
62
  - waitForAnimationToEnd
63
63
  - assertVisible:
64
64
  id: "bookings_upcoming_tab"
65
- # Step 7: Favorites tab
65
+ # Step 6: Favorites tab
66
66
  - tapOn: "Favorites"
67
67
  - waitForAnimationToEnd
68
- # Step 8: Profile tab
68
+ # Step 7: Profile tab
69
69
  - tapOn: "Profile"
70
70
  - waitForAnimationToEnd
71
71
  - assertVisible:
72
72
  id: "profile_settings_button"
73
- # Step 9: Back to Discover
73
+ # Step 8: Back to Discover
74
74
  - tapOn: "Discover"
75
75
  - waitForAnimationToEnd
@@ -2,25 +2,32 @@ appId: ${APP_BUNDLE_ID}
2
2
  ---
3
3
  - clearState
4
4
  - launchApp
5
+ # Handle onboarding
5
6
  - tapOn:
6
7
  text: "Skip"
7
8
  optional: true
8
9
  - tapOn:
9
10
  text: "Get Started"
10
11
  optional: true
12
+ - tapOn:
13
+ text: "Continue"
14
+ optional: true
15
+ # Wait for home screen to load
11
16
  - extendedWaitUntil:
12
- visible:
13
- id: "discovery_search_field"
17
+ visible: "Discover"
14
18
  timeout: 10000
15
- # Verify home screen content
19
+ # Verify we're on the discover screen
20
+ - assertVisible: "Discover"
21
+ # Content assertions
16
22
  - assertVisible:
17
- id: "discovery_search_field"
23
+ text: "Categories"
24
+ optional: true
18
25
  - assertVisible:
19
- id: "discovery_category_0_button"
26
+ text: "Featured"
20
27
  optional: true
21
28
  - assertVisible:
22
- id: "discovery_provider_0_card"
29
+ id: "discovery_category_0_button"
23
30
  optional: true
24
31
  - assertVisible:
25
- id: "discovery_featured_0_card"
32
+ id: "discovery_provider_0_card"
26
33
  optional: true
@@ -8,13 +8,14 @@ appId: ${APP_BUNDLE_ID}
8
8
  - tapOn:
9
9
  text: "Get Started"
10
10
  optional: true
11
+ - tapOn:
12
+ text: "Continue"
13
+ optional: true
11
14
  - extendedWaitUntil:
12
- visible:
13
- id: "discovery_search_field"
15
+ visible: "Discover"
14
16
  timeout: 10000
15
- # Verify Discover tab content
16
- - assertVisible:
17
- id: "discovery_search_field"
17
+ # Verify Discover tab
18
+ - assertVisible: "Discover"
18
19
  # Navigate to Near Me tab
19
20
  - tapOn: "Near Me"
20
21
  - waitForAnimationToEnd
@@ -36,5 +37,4 @@ appId: ${APP_BUNDLE_ID}
36
37
  # Return to Discover
37
38
  - tapOn: "Discover"
38
39
  - waitForAnimationToEnd
39
- - assertVisible:
40
- id: "discovery_search_field"
40
+ - assertVisible: "Discover"
@@ -38,9 +38,3 @@ appId: ${APP_BUNDLE_ID}
38
38
  id: "provider_detail_favorite_button"
39
39
  # Navigate back
40
40
  - back
41
- - extendedWaitUntil:
42
- visible:
43
- id: "discovery_search_field"
44
- timeout: 5000
45
- - assertVisible:
46
- id: "discovery_search_field"
@@ -24,18 +24,6 @@ appId: ${APP_BUNDLE_ID}
24
24
  - assertVisible:
25
25
  id: "bookings_empty_state"
26
26
  optional: true
27
- # Open booking detail if available
28
- - tapOn:
29
- id: "bookings_booking_0_card"
30
- optional: true
31
- - assertVisible:
32
- id: "booking_detail_reschedule_button"
33
- optional: true
34
- - assertVisible:
35
- id: "booking_detail_cancel_button"
36
- optional: true
37
- # Go back
38
- - back
39
27
  # Navigate to Favorites tab
40
28
  - tapOn: "Favorites"
41
29
  - waitForAnimationToEnd
@@ -8,41 +8,24 @@ appId: ${APP_BUNDLE_ID}
8
8
  - tapOn:
9
9
  text: "Get Started"
10
10
  optional: true
11
- - extendedWaitUntil:
12
- visible:
13
- id: "discovery_search_field"
14
- timeout: 10000
15
- # Tap search field
16
- - tapOn:
17
- id: "discovery_search_field"
18
- - extendedWaitUntil:
19
- visible:
20
- id: "search_input_field"
21
- timeout: 5000
22
- # Type search query
23
- - tapOn:
24
- id: "search_input_field"
25
- - inputText: "Spa"
26
- # Wait for results
27
- - extendedWaitUntil:
28
- visible:
29
- id: "search_result_0_card"
30
- timeout: 5000
31
- optional: true
32
- # Check for results or empty state
33
- - assertVisible:
34
- id: "search_result_0_card"
35
- optional: true
36
- # Cancel search
37
11
  - tapOn:
38
- id: "search_cancel_button"
12
+ text: "Continue"
39
13
  optional: true
40
- # Test category filtering
41
14
  - extendedWaitUntil:
42
- visible:
43
- id: "discovery_category_0_button"
44
- timeout: 5000
15
+ visible: "Discover"
16
+ timeout: 10000
17
+ # Test category filtering
45
18
  - tapOn:
46
19
  id: "discovery_category_0_button"
47
20
  optional: true
48
21
  - waitForAnimationToEnd
22
+ # Tap the "All" category to reset
23
+ - tapOn:
24
+ id: "discovery_category_all_button"
25
+ optional: true
26
+ - waitForAnimationToEnd
27
+ # Scroll down to see providers
28
+ - scroll
29
+ - assertVisible:
30
+ id: "discovery_provider_0_card"
31
+ optional: true
@@ -15,61 +15,61 @@ appId: ${APP_BUNDLE_ID}
15
15
  # Step 1: Verify Discover content
16
16
  - assertVisible:
17
17
  id: "discovery_search_field"
18
- - assertVisible:
19
- id: "discovery_provider_0_card"
20
- optional: true
21
- # Step 2: Open provider detail
18
+ # Step 2: Open provider detail and favorite it
22
19
  - tapOn:
23
20
  id: "discovery_provider_0_card"
24
21
  optional: true
25
22
  - extendedWaitUntil:
26
23
  visible:
27
- id: "provider_detail_book_now_button"
24
+ id: "provider_detail_favorite_button"
28
25
  timeout: 5000
29
26
  optional: true
30
- # Step 3: Verify detail and favorite
31
- - assertVisible:
32
- id: "provider_detail_favorite_button"
33
- optional: true
34
27
  - tapOn:
35
28
  id: "provider_detail_favorite_button"
36
29
  optional: true
30
+ - assertVisible:
31
+ id: "provider_detail_book_now_button"
32
+ optional: true
37
33
  - back
38
- # Step 4: Search
34
+ # Step 3: Search
39
35
  - extendedWaitUntil:
40
36
  visible:
41
37
  id: "discovery_search_field"
42
38
  timeout: 5000
39
+ optional: true
43
40
  - tapOn:
44
41
  id: "discovery_search_field"
42
+ optional: true
45
43
  - extendedWaitUntil:
46
44
  visible:
47
45
  id: "search_input_field"
48
46
  timeout: 3000
47
+ optional: true
49
48
  - tapOn:
50
49
  id: "search_input_field"
50
+ optional: true
51
51
  - inputText: "Wellness"
52
52
  - tapOn:
53
53
  id: "search_cancel_button"
54
54
  optional: true
55
- # Step 5: Near Me tab
55
+ # Step 4: Near Me tab
56
56
  - tapOn: "Near Me"
57
57
  - waitForAnimationToEnd
58
58
  - assertVisible:
59
59
  id: "map_list_toggle_button"
60
- # Step 6: Bookings tab
60
+ # Step 5: Bookings tab
61
61
  - tapOn: "Bookings"
62
62
  - waitForAnimationToEnd
63
63
  - assertVisible:
64
64
  id: "bookings_upcoming_tab"
65
- # Step 7: Favorites tab
65
+ # Step 6: Favorites tab
66
66
  - tapOn: "Favorites"
67
67
  - waitForAnimationToEnd
68
- # Step 8: Profile tab
68
+ # Step 7: Profile tab
69
69
  - tapOn: "Profile"
70
70
  - waitForAnimationToEnd
71
71
  - assertVisible:
72
72
  id: "profile_settings_button"
73
- # Step 9: Back to Discover
73
+ # Step 8: Back to Discover
74
74
  - tapOn: "Discover"
75
75
  - waitForAnimationToEnd
@@ -22,14 +22,12 @@ if (secretsFile.exists()) {
22
22
  buildConfigField("String", "WIX_CLIENT_ID", "\"${secrets.getProperty("WIX_CLIENT_ID", "")}\"")
23
23
  buildConfigField("String", "WIX_SITE_ID", "\"${secrets.getProperty("WIX_SITE_ID", "")}\"")
24
24
  buildConfigField("String", "WIX_API_KEY", "\"${secrets.getProperty("WIX_API_KEY", "")}\"")
25
- buildConfigField("String", "WIX_REDIRECT_URL", "\"${secrets.getProperty("WIX_REDIRECT_URL", "")}\"")
26
25
  buildConfigField("String", "SUPABASE_URL", "\"${secrets.getProperty("SUPABASE_URL", "")}\"")
27
26
  buildConfigField("String", "SUPABASE_ANON_KEY", "\"${secrets.getProperty("SUPABASE_ANON_KEY", "")}\"")
28
27
  } else {
29
28
  buildConfigField("String", "WIX_CLIENT_ID", "\"\"")
30
29
  buildConfigField("String", "WIX_SITE_ID", "\"\"")
31
30
  buildConfigField("String", "WIX_API_KEY", "\"\"")
32
- buildConfigField("String", "WIX_REDIRECT_URL", "\"\"")
33
31
  buildConfigField("String", "SUPABASE_URL", "\"\"")
34
32
  buildConfigField("String", "SUPABASE_ANON_KEY", "\"\"")
35
33
  }
@@ -19,8 +19,9 @@ cp secrets.properties.template secrets.properties
19
19
  2. Create a new Headless project (or open your existing Wix site)
20
20
  3. Navigate to **OAuth Apps** and create a new OAuth app
21
21
  4. Copy the **Client ID** → paste as `WIX_CLIENT_ID`
22
- 5. Copy your **Site ID** from the site dashboard URL → paste as `WIX_SITE_ID`
23
- 6. Set the redirect URL to `yourapp://oauth/callback` paste as `WIX_REDIRECT_URL`
22
+ 5. Copy your **Site ID** from the site dashboard URL → paste as `WIX_SITE_ID` (optional if using WixSiteSelector)
23
+ 6. Add the redirect URL `{your.package.name}://oauth/callback` to the OAuth app's allowed redirects
24
+ - The app auto-derives this from its package name — just register it in Wix
24
25
  7. Enable the APIs you need (Stores, Bookings, Events, Blog) in the OAuth app permissions
25
26
 
26
27
  ### Wix (Owner / Admin apps)
@@ -29,8 +29,8 @@ object SecretsConfig {
29
29
  /** Wix API key (for WixOwnerBackend — site owner/admin access) */
30
30
  val wixApiKey: String get() = getField("WIX_API_KEY")
31
31
 
32
- /** Wix OAuth redirect URL */
33
- val wixRedirectUrl: String get() = getField("WIX_REDIRECT_URL")
32
+ // Note: WIX_REDIRECT_URL is auto-derived from the app's package name.
33
+ // See WixAuthManager for details.
34
34
 
35
35
  // MARK: - Firebase
36
36
 
@@ -14,7 +14,7 @@ if (secretsFile.exists()) {
14
14
  buildConfigField("String", "WIX_CLIENT_ID", "\"${secrets.getProperty("WIX_CLIENT_ID", "")}\"")
15
15
  buildConfigField("String", "WIX_SITE_ID", "\"${secrets.getProperty("WIX_SITE_ID", "")}\"")
16
16
  buildConfigField("String", "WIX_API_KEY", "\"${secrets.getProperty("WIX_API_KEY", "")}\"")
17
- buildConfigField("String", "WIX_REDIRECT_URL", "\"${secrets.getProperty("WIX_REDIRECT_URL", "")}\"")
17
+ // Note: WIX_REDIRECT_URL is auto-derived from the package name — no config needed
18
18
 
19
19
  // Supabase
20
20
  buildConfigField("String", "SUPABASE_URL", "\"${secrets.getProperty("SUPABASE_URL", "")}\"")
@@ -24,7 +24,6 @@ if (secretsFile.exists()) {
24
24
  buildConfigField("String", "WIX_CLIENT_ID", "\"\"")
25
25
  buildConfigField("String", "WIX_SITE_ID", "\"\"")
26
26
  buildConfigField("String", "WIX_API_KEY", "\"\"")
27
- buildConfigField("String", "WIX_REDIRECT_URL", "\"\"")
28
27
  buildConfigField("String", "SUPABASE_URL", "\"\"")
29
28
  buildConfigField("String", "SUPABASE_ANON_KEY", "\"\"")
30
29
  }
@@ -10,10 +10,11 @@
10
10
  # ─────────────────────────────────────────────────────────────
11
11
 
12
12
  # ── Wix (Member / Customer apps) ──
13
- # Get these from https://dev.wix.com > OAuth Apps
13
+ # Get your Client ID from https://dev.wix.com > OAuth Apps
14
+ # Site ID is optional — the app can use WixSiteSelector for runtime selection.
15
+ # Redirect URL is auto-derived from the package name ({packageName}://oauth/callback).
14
16
  WIX_CLIENT_ID=YOUR_WIX_CLIENT_ID
15
17
  WIX_SITE_ID=YOUR_WIX_SITE_ID
16
- WIX_REDIRECT_URL=yourapp://oauth/callback
17
18
 
18
19
  # ── Wix (Owner / Admin apps) ──
19
20
  # Get this from Wix Dashboard > Settings > API Keys
@@ -32,7 +32,14 @@ class WixAuthManager(private val context: Context) {
32
32
  private val prefs: SharedPreferences = getEncryptedPrefs()
33
33
  private val siteId = SecretsConfig.wixSiteId
34
34
  private val clientId = SecretsConfig.wixClientId
35
- private val redirectUrl = SecretsConfig.wixRedirectUrl
35
+
36
+ /**
37
+ * OAuth redirect URL, auto-derived from the app's package name.
38
+ * Format: {packageName}://oauth/callback
39
+ * The developer must register this URL in their Wix OAuth app's allowed redirect URIs.
40
+ */
41
+ private val redirectUrl: String
42
+ get() = "${context.packageName}://oauth/callback"
36
43
 
37
44
  private val json = Json {
38
45
  ignoreUnknownKeys = true
@@ -25,8 +25,6 @@ For each key you use, add a matching entry to `Info.plist`:
25
25
  <string>$(WIX_CLIENT_ID)</string>
26
26
  <key>WIX_SITE_ID</key>
27
27
  <string>$(WIX_SITE_ID)</string>
28
- <key>WIX_REDIRECT_URL</key>
29
- <string>$(WIX_REDIRECT_URL)</string>
30
28
  <key>WIX_API_KEY</key>
31
29
  <string>$(WIX_API_KEY)</string>
32
30
  <key>SUPABASE_URL</key>
@@ -20,8 +20,9 @@ open Secrets.xcconfig
20
20
  2. Create a new Headless project (or open your existing Wix site)
21
21
  3. Navigate to **OAuth Apps** and create a new OAuth app
22
22
  4. Copy the **Client ID** → paste as `WIX_CLIENT_ID`
23
- 5. Copy your **Site ID** from the site dashboard URL → paste as `WIX_SITE_ID`
24
- 6. Set the redirect URL to `yourapp://oauth/callback` paste as `WIX_REDIRECT_URL`
23
+ 5. Copy your **Site ID** from the site dashboard URL → paste as `WIX_SITE_ID` (optional if using WixSiteSelector)
24
+ 6. Add the redirect URL `{your.bundle.id}://oauth/callback` to the OAuth app's allowed redirects
25
+ - The app auto-derives this from its bundle ID — just register it in Wix
25
26
  7. Enable the APIs you need (Stores, Bookings, Events, Blog) in the OAuth app permissions
26
27
 
27
28
  ### Wix (Owner / Admin apps)
@@ -10,10 +10,11 @@
10
10
  // ─────────────────────────────────────────────────────────────
11
11
 
12
12
  // ── Wix (Member / Customer apps) ──
13
- // Get these from https://dev.wix.com > OAuth Apps
13
+ // Get your Client ID from https://dev.wix.com > OAuth Apps
14
+ // Site ID is optional — the app can use WixSiteSelector for runtime selection.
15
+ // Redirect URL is auto-derived from the bundle ID ({bundleId}://oauth/callback).
14
16
  WIX_CLIENT_ID = YOUR_WIX_CLIENT_ID
15
17
  WIX_SITE_ID = YOUR_WIX_SITE_ID
16
- WIX_REDIRECT_URL = yourapp://oauth/callback
17
18
 
18
19
  // ── Wix (Owner / Admin apps) ──
19
20
  // Get this from Wix Dashboard > Settings > API Keys
@@ -24,8 +24,8 @@ enum SecretsConfig {
24
24
  /// Wix API key (for WixOwnerBackend — site owner/admin access)
25
25
  static let wixApiKey: String = value(for: "WIX_API_KEY")
26
26
 
27
- /// Wix OAuth redirect URL
28
- static let wixRedirectUrl: String = value(for: "WIX_REDIRECT_URL")
27
+ // Note: WIX_REDIRECT_URL is auto-derived from the app's bundle ID.
28
+ // See WixAuthService for details.
29
29
 
30
30
  // MARK: - Firebase
31
31
 
@@ -9,31 +9,21 @@ This module requires the `SecretsConfig` module. Ensure `Secrets.xcconfig` is co
9
9
  ```ini
10
10
  WIX_CLIENT_ID = your-oauth-app-client-id
11
11
  WIX_SITE_ID = your-wix-site-id # Optional if using WixSiteSelector
12
- WIX_REDIRECT_URL = yourapp://oauth/callback
13
12
  ```
14
13
 
15
14
  **Note:** `WIX_SITE_ID` is optional when the **WixSiteSelector** module is integrated. If omitted, users select their site at runtime. If provided, it serves as the default site on first launch.
16
15
 
16
+ **Note:** `WIX_REDIRECT_URL` is no longer configured manually. It is auto-derived from the app's bundle identifier as `{bundleId}://oauth/callback`. You must register this URL in your Wix OAuth app's allowed redirect URIs.
17
+
17
18
  ### WixSiteSelector (recommended)
18
19
 
19
20
  The `WixSiteSelector` module enables runtime site switching. When integrated, pass a shared `WixSiteManager` to the API client instead of a static site ID. See `WixSiteSelector/INTEGRATION.md` for details.
20
21
 
21
22
  ### URL Scheme for OAuth
22
23
 
23
- Add to `Info.plist` for OAuth redirect handling:
24
- ```xml
25
- <key>CFBundleURLTypes</key>
26
- <array>
27
- <dict>
28
- <key>CFBundleURLSchemes</key>
29
- <array>
30
- <string>yourapp</string>
31
- </array>
32
- </dict>
33
- </array>
34
- ```
24
+ The OAuth redirect URL is auto-derived from the app's bundle ID (e.g., `com.mycompany.myapp://oauth/callback`).
35
25
 
36
- Replace `yourapp` with your actual app's URL scheme.
26
+ **iOS Note:** On iOS, `WixAuthService` uses `ASWebAuthenticationSession` which handles the callback internally — no `Info.plist` URL scheme or `AppDelegate` handling is needed. The session captures the redirect automatically.
37
27
 
38
28
  ## AppConfig Additions
39
29
 
@@ -51,7 +41,6 @@ Add to `AppConfig.API`:
51
41
  // CUSTOMIZE:API — Wix credentials loaded from SecretsConfig
52
42
  static let wixClientId = SecretsConfig.wixClientId
53
43
  static let wixSiteId = SecretsConfig.wixSiteId
54
- static let wixRedirectUrl = SecretsConfig.wixRedirectUrl
55
44
  ```
56
45
 
57
46
  ## Navigation Wiring
@@ -84,13 +73,15 @@ TabView {
84
73
  let siteManager = WixSiteManager() // shared instance
85
74
  let authService = WixAuthService(
86
75
  siteId: siteManager.currentSiteId,
87
- clientId: AppConfig.API.wixClientId,
88
- redirectURL: AppConfig.API.wixRedirectUrl
76
+ clientId: AppConfig.API.wixClientId
89
77
  )
90
78
  let apiClient = WixAPIClient(siteManager: siteManager, authService: authService)
91
79
 
92
80
  // Option 2: With static site ID (legacy, single-site apps)
93
- let authService = WixAuthService()
81
+ let authService = WixAuthService(
82
+ siteId: AppConfig.API.wixSiteId,
83
+ clientId: AppConfig.API.wixClientId
84
+ )
94
85
  let apiClient = WixAPIClient(siteId: AppConfig.API.wixSiteId, authService: authService)
95
86
 
96
87
  // Domain services (same for both options)
@@ -23,7 +23,8 @@ This module connects your app to a Wix site, letting users browse products, book
23
23
  1. In your Wix project, go to **OAuth Apps**
24
24
  2. Click **Create New**
25
25
  3. Set the app name (e.g., "iOS App")
26
- 4. Add the redirect URL: `yourapp://oauth/callback` (replace `yourapp` with your app's URL scheme)
26
+ 4. Add the redirect URL: `{your-bundle-id}://oauth/callback` (e.g., `com.mycompany.myapp://oauth/callback`)
27
+ - The app auto-derives this from its bundle ID — just make sure to register it in Wix
27
28
  5. Copy the **Client ID** — you'll need it below
28
29
 
29
30
  ### 3. Enable Required APIs
@@ -47,9 +48,10 @@ Open `Secrets.xcconfig` and fill in:
47
48
  ```ini
48
49
  WIX_CLIENT_ID = paste-your-client-id-here
49
50
  WIX_SITE_ID = paste-your-site-id-here
50
- WIX_REDIRECT_URL = yourapp://oauth/callback
51
51
  ```
52
52
 
53
+ **Note:** The redirect URL is auto-derived from the app's bundle ID (`{bundleId}://oauth/callback`). No manual configuration needed — just register this URL in your Wix OAuth app's allowed redirect URIs.
54
+
53
55
  ## What Works Without Login
54
56
 
55
57
  Users can immediately:
@@ -35,15 +35,21 @@ class WixAuthService: ObservableObject {
35
35
 
36
36
  private let siteId: String
37
37
  private let clientId: String
38
- private let redirectURL: String
39
38
  private var cancellables = Set<AnyCancellable>()
40
39
 
40
+ /// OAuth redirect URL, auto-derived from the app's bundle identifier.
41
+ /// Format: {bundleId}://oauth/callback
42
+ /// The developer must register this URL in their Wix OAuth app's allowed redirect URIs.
43
+ private var redirectURL: String {
44
+ let bundleId = Bundle.main.bundleIdentifier ?? "com.app.default"
45
+ return "\(bundleId)://oauth/callback"
46
+ }
47
+
41
48
  // MARK: - Initialization
42
49
 
43
- init(siteId: String, clientId: String, redirectURL: String) {
50
+ init(siteId: String, clientId: String) {
44
51
  self.siteId = siteId
45
52
  self.clientId = clientId
46
- self.redirectURL = redirectURL
47
53
 
48
54
  // Auto-fetch visitor token on init
49
55
  Task {
@@ -51,6 +57,11 @@ class WixAuthService: ObservableObject {
51
57
  }
52
58
  }
53
59
 
60
+ /// Legacy convenience initializer that accepts a redirectURL parameter (ignored -- URL is auto-derived).
61
+ convenience init(siteId: String, clientId: String, redirectURL: String) {
62
+ self.init(siteId: siteId, clientId: clientId)
63
+ }
64
+
54
65
  // MARK: - Token Management
55
66
 
56
67
  func getCurrentToken() throws -> String {
@@ -49,8 +49,7 @@ let siteManager = WixSiteManager() // shared instance
49
49
  let authService = WixAdminAuthService(siteManager: siteManager)
50
50
  let apiClient = WixAPIClient(siteManager: siteManager, authService: WixAuthService(
51
51
  siteId: siteManager.currentSiteId,
52
- clientId: "",
53
- redirectURL: ""
52
+ clientId: ""
54
53
  ))
55
54
 
56
55
  // Option 2: With static site ID (legacy, single-site apps)
@@ -59,8 +58,7 @@ let apiClient = WixAPIClient(
59
58
  siteId: AppConfig.API.wixSiteId,
60
59
  authService: WixAuthService(
61
60
  siteId: AppConfig.API.wixSiteId,
62
- clientId: "",
63
- redirectURL: ""
61
+ clientId: ""
64
62
  )
65
63
  )
66
64
 
@@ -49,8 +49,7 @@ class WixAdminAuthService: ObservableObject {
49
49
  do {
50
50
  let apiClient = WixAPIClient(siteId: siteId, authService: WixAuthService(
51
51
  siteId: siteId,
52
- clientId: SecretsConfig.wixClientId,
53
- redirectURL: ""
52
+ clientId: SecretsConfig.wixClientId
54
53
  ))
55
54
  let _: Data = try await apiClient.get(
56
55
  path: "/sites/v1/sites"
@@ -73,10 +73,10 @@ Button(siteManager.hasSiteSelected ? Strings.WixSiteSelector.changeSite : String
73
73
 
74
74
  ```swift
75
75
  // Member API client reads siteId from siteManager
76
+ // Redirect URL is auto-derived from the bundle ID — no config needed
76
77
  let authService = WixAuthService(
77
78
  siteId: siteManager.currentSiteId,
78
- clientId: AppConfig.API.wixClientId,
79
- redirectURL: AppConfig.API.wixRedirectUrl
79
+ clientId: AppConfig.API.wixClientId
80
80
  )
81
81
  let apiClient = WixAPIClient(siteManager: siteManager, authService: authService)
82
82
  ```
@@ -19,11 +19,6 @@
19
19
  "apiKey": {
20
20
  "type": "string",
21
21
  "description": "API key for owner/admin access from Wix Dashboard > Settings > API Keys"
22
- },
23
- "redirectUrl": {
24
- "type": "string",
25
- "description": "OAuth redirect URL (e.g., yourapp://oauth/callback)",
26
- "default": "yourapp://oauth/callback"
27
22
  }
28
23
  }
29
24
  },
@@ -0,0 +1,160 @@
1
+ package com.appship.shared.wix.siteselector
2
+
3
+ import kotlinx.serialization.json.Json
4
+ import org.junit.Assert.*
5
+ import org.junit.Test
6
+
7
+ class WixSiteSelectorTest {
8
+
9
+ private val json = Json { ignoreUnknownKeys = true }
10
+
11
+ // MARK: - WixSiteInfo Model Tests
12
+
13
+ @Test
14
+ fun `create WixSiteInfo with all fields`() {
15
+ val site = WixSiteInfo(
16
+ id = "site-001",
17
+ name = "My Test Site",
18
+ url = "https://mysite.wixsite.com",
19
+ description = "A test site",
20
+ logoUrl = "https://example.com/logo.png",
21
+ published = true
22
+ )
23
+
24
+ assertEquals("site-001", site.id)
25
+ assertEquals("My Test Site", site.name)
26
+ assertEquals("https://mysite.wixsite.com", site.url)
27
+ assertEquals("A test site", site.description)
28
+ assertEquals("https://example.com/logo.png", site.logoUrl)
29
+ assertTrue(site.published == true)
30
+ }
31
+
32
+ @Test
33
+ fun `create WixSiteInfo with minimal fields`() {
34
+ val site = WixSiteInfo(id = "site-002", name = "Minimal Site")
35
+
36
+ assertEquals("site-002", site.id)
37
+ assertEquals("Minimal Site", site.name)
38
+ assertNull(site.url)
39
+ assertNull(site.description)
40
+ assertNull(site.logoUrl)
41
+ assertNull(site.published)
42
+ }
43
+
44
+ @Test
45
+ fun `WixSiteInfo equality`() {
46
+ val site1 = WixSiteInfo(id = "site-001", name = "Site A")
47
+ val site2 = WixSiteInfo(id = "site-001", name = "Site A")
48
+ val site3 = WixSiteInfo(id = "site-002", name = "Site B")
49
+
50
+ assertEquals(site1, site2)
51
+ assertNotEquals(site1, site3)
52
+ }
53
+
54
+ @Test
55
+ fun `decode WixSiteInfo from JSON`() {
56
+ val jsonString = """
57
+ {
58
+ "id": "site-001",
59
+ "name": "Test Site",
60
+ "url": "https://test.wixsite.com",
61
+ "published": true
62
+ }
63
+ """.trimIndent()
64
+
65
+ val site = json.decodeFromString<WixSiteInfo>(jsonString)
66
+ assertEquals("site-001", site.id)
67
+ assertEquals("Test Site", site.name)
68
+ assertEquals("https://test.wixsite.com", site.url)
69
+ assertTrue(site.published == true)
70
+ assertNull(site.description)
71
+ assertNull(site.logoUrl)
72
+ }
73
+
74
+ @Test
75
+ fun `encode and decode WixSiteInfo round trip`() {
76
+ val site = WixSiteInfo(
77
+ id = "site-001",
78
+ name = "Round Trip",
79
+ url = "https://example.com",
80
+ description = "Testing",
81
+ published = false
82
+ )
83
+
84
+ val encoded = json.encodeToString(WixSiteInfo.serializer(), site)
85
+ val decoded = json.decodeFromString<WixSiteInfo>(encoded)
86
+ assertEquals(site, decoded)
87
+ }
88
+
89
+ @Test
90
+ fun `decode WixSiteInfo with unknown fields`() {
91
+ val jsonString = """
92
+ {
93
+ "id": "site-001",
94
+ "name": "Test",
95
+ "unknownField": "should be ignored",
96
+ "anotherUnknown": 42
97
+ }
98
+ """.trimIndent()
99
+
100
+ val site = json.decodeFromString<WixSiteInfo>(jsonString)
101
+ assertEquals("site-001", site.id)
102
+ assertEquals("Test", site.name)
103
+ }
104
+
105
+ // MARK: - Selection Mode Tests
106
+
107
+ @Test
108
+ fun `WixSiteSelectionMode OWNER mode`() {
109
+ val mode = WixSiteSelectionMode.OWNER
110
+ assertEquals(WixSiteSelectionMode.OWNER, mode)
111
+ assertNotEquals(WixSiteSelectionMode.MEMBER, mode)
112
+ }
113
+
114
+ @Test
115
+ fun `WixSiteSelectionMode MEMBER mode`() {
116
+ val mode = WixSiteSelectionMode.MEMBER
117
+ assertEquals(WixSiteSelectionMode.MEMBER, mode)
118
+ assertNotEquals(WixSiteSelectionMode.OWNER, mode)
119
+ }
120
+
121
+ @Test
122
+ fun `WixSiteSelectionMode has exactly two values`() {
123
+ val values = WixSiteSelectionMode.values()
124
+ assertEquals(2, values.size)
125
+ assertTrue(values.contains(WixSiteSelectionMode.OWNER))
126
+ assertTrue(values.contains(WixSiteSelectionMode.MEMBER))
127
+ }
128
+
129
+ // MARK: - WixSiteManager Tests (requires Android context, basic validation)
130
+
131
+ @Test
132
+ fun `WixSiteInfo list filtering`() {
133
+ val sites = listOf(
134
+ WixSiteInfo(id = "1", name = "Downtown Store"),
135
+ WixSiteInfo(id = "2", name = "Airport Shop"),
136
+ WixSiteInfo(id = "3", name = "Mall Store"),
137
+ )
138
+
139
+ val filtered = sites.filter { it.name.contains("Store", ignoreCase = true) }
140
+ assertEquals(2, filtered.size)
141
+ assertEquals("Downtown Store", filtered[0].name)
142
+ assertEquals("Mall Store", filtered[1].name)
143
+ }
144
+
145
+ @Test
146
+ fun `WixSiteInfo find by id`() {
147
+ val sites = listOf(
148
+ WixSiteInfo(id = "site-1", name = "Site One"),
149
+ WixSiteInfo(id = "site-2", name = "Site Two"),
150
+ WixSiteInfo(id = "site-3", name = "Site Three"),
151
+ )
152
+
153
+ val found = sites.find { it.id == "site-2" }
154
+ assertNotNull(found)
155
+ assertEquals("Site Two", found?.name)
156
+
157
+ val notFound = sites.find { it.id == "site-999" }
158
+ assertNull(notFound)
159
+ }
160
+ }
@@ -0,0 +1,162 @@
1
+ import XCTest
2
+ @testable import App
3
+
4
+ final class WixSiteSelectorTests: XCTestCase {
5
+
6
+ // MARK: - WixSiteInfo Model Tests
7
+
8
+ func testWixSiteInfoCreation() {
9
+ let site = WixSiteInfo(
10
+ id: "site-001",
11
+ name: "My Test Site",
12
+ url: "https://mysite.wixsite.com",
13
+ description: "A test site",
14
+ logoUrl: "https://example.com/logo.png",
15
+ published: true
16
+ )
17
+
18
+ XCTAssertEqual(site.id, "site-001")
19
+ XCTAssertEqual(site.name, "My Test Site")
20
+ XCTAssertEqual(site.url, "https://mysite.wixsite.com")
21
+ XCTAssertEqual(site.description, "A test site")
22
+ XCTAssertEqual(site.logoUrl, "https://example.com/logo.png")
23
+ XCTAssertEqual(site.published, true)
24
+ }
25
+
26
+ func testWixSiteInfoMinimalCreation() {
27
+ let site = WixSiteInfo(id: "site-002", name: "Minimal Site")
28
+
29
+ XCTAssertEqual(site.id, "site-002")
30
+ XCTAssertEqual(site.name, "Minimal Site")
31
+ XCTAssertNil(site.url)
32
+ XCTAssertNil(site.description)
33
+ XCTAssertNil(site.logoUrl)
34
+ XCTAssertNil(site.published)
35
+ }
36
+
37
+ func testWixSiteInfoEquatable() {
38
+ let site1 = WixSiteInfo(id: "site-001", name: "Site A")
39
+ let site2 = WixSiteInfo(id: "site-001", name: "Site A")
40
+ let site3 = WixSiteInfo(id: "site-002", name: "Site B")
41
+
42
+ XCTAssertEqual(site1, site2)
43
+ XCTAssertNotEqual(site1, site3)
44
+ }
45
+
46
+ func testWixSiteInfoCodable() throws {
47
+ let json = """
48
+ {
49
+ "id": "site-001",
50
+ "name": "Test Site",
51
+ "url": "https://test.wixsite.com",
52
+ "published": true
53
+ }
54
+ """.data(using: .utf8)!
55
+
56
+ let site = try JSONDecoder().decode(WixSiteInfo.self, from: json)
57
+ XCTAssertEqual(site.id, "site-001")
58
+ XCTAssertEqual(site.name, "Test Site")
59
+ XCTAssertEqual(site.url, "https://test.wixsite.com")
60
+ XCTAssertEqual(site.published, true)
61
+ XCTAssertNil(site.description)
62
+ XCTAssertNil(site.logoUrl)
63
+ }
64
+
65
+ func testWixSiteInfoEncodeDecode() throws {
66
+ let site = WixSiteInfo(
67
+ id: "site-001",
68
+ name: "Round Trip",
69
+ url: "https://example.com",
70
+ description: "Testing",
71
+ logoUrl: nil,
72
+ published: false
73
+ )
74
+
75
+ let data = try JSONEncoder().encode(site)
76
+ let decoded = try JSONDecoder().decode(WixSiteInfo.self, from: data)
77
+ XCTAssertEqual(site, decoded)
78
+ }
79
+
80
+ // MARK: - WixSiteManager State Tests
81
+
82
+ @MainActor
83
+ func testSiteManagerInitialState() {
84
+ let manager = WixSiteManager()
85
+
86
+ // Without any persisted or configured site, state should be empty
87
+ // (unless SecretsConfig has a fallback, which varies by env)
88
+ XCTAssertTrue(manager.availableSites.isEmpty)
89
+ XCTAssertTrue(manager.currentSiteName.isEmpty || !manager.currentSiteName.isEmpty) // valid either way
90
+ }
91
+
92
+ @MainActor
93
+ func testSiteManagerSelectSite() {
94
+ let manager = WixSiteManager()
95
+ let site = WixSiteInfo(id: "site-abc", name: "ABC Site")
96
+
97
+ manager.selectSite(site)
98
+
99
+ XCTAssertEqual(manager.currentSiteId, "site-abc")
100
+ XCTAssertEqual(manager.currentSiteName, "ABC Site")
101
+ XCTAssertTrue(manager.hasSiteSelected)
102
+ }
103
+
104
+ @MainActor
105
+ func testSiteManagerSetConfiguredSites() {
106
+ let manager = WixSiteManager()
107
+ let sites = [
108
+ WixSiteInfo(id: "site-1", name: "Downtown"),
109
+ WixSiteInfo(id: "site-2", name: "Airport"),
110
+ WixSiteInfo(id: "site-3", name: "Mall"),
111
+ ]
112
+
113
+ manager.setConfiguredSites(sites)
114
+
115
+ XCTAssertEqual(manager.availableSites.count, 3)
116
+ XCTAssertEqual(manager.availableSites[0].name, "Downtown")
117
+ XCTAssertEqual(manager.availableSites[2].id, "site-3")
118
+ }
119
+
120
+ @MainActor
121
+ func testSiteManagerCurrentSiteAfterSelection() {
122
+ let manager = WixSiteManager()
123
+ let sites = [
124
+ WixSiteInfo(id: "site-1", name: "Site One"),
125
+ WixSiteInfo(id: "site-2", name: "Site Two"),
126
+ ]
127
+
128
+ manager.setConfiguredSites(sites)
129
+ manager.selectSite(sites[1])
130
+
131
+ XCTAssertEqual(manager.currentSite?.id, "site-2")
132
+ XCTAssertEqual(manager.currentSite?.name, "Site Two")
133
+ }
134
+
135
+ @MainActor
136
+ func testSiteManagerResolveSiteUrl() {
137
+ let manager = WixSiteManager()
138
+
139
+ // Direct site ID
140
+ let directId = manager.resolveSiteUrl("my-site-id-123")
141
+ XCTAssertEqual(directId, "my-site-id-123")
142
+
143
+ // URL input should be returned as-is (simplified resolution)
144
+ let urlInput = manager.resolveSiteUrl("https://mysite.wixsite.com/main")
145
+ XCTAssertFalse(urlInput.isEmpty)
146
+ }
147
+
148
+ // MARK: - Selection Mode Tests
149
+
150
+ func testSiteSelectionModeOwner() {
151
+ let mode = WixSiteSelectionMode.owner
152
+ // Owner mode should exist and be distinguishable
153
+ XCTAssertTrue(mode == .owner)
154
+ XCTAssertFalse(mode == .member)
155
+ }
156
+
157
+ func testSiteSelectionModeMember() {
158
+ let mode = WixSiteSelectionMode.member
159
+ XCTAssertTrue(mode == .member)
160
+ XCTAssertFalse(mode == .owner)
161
+ }
162
+ }
@@ -0,0 +1,75 @@
1
+ appId: ${APP_BUNDLE_ID}
2
+ ---
3
+ # Wix Site Selector Module - Integration Test
4
+ # Verifies site selection flow for both owner and member modes
5
+
6
+ # Step 1: Launch the app
7
+ - launchApp
8
+
9
+ # Step 2: Verify site selector screen appears (if no site pre-configured)
10
+ - assertVisible:
11
+ text: "Select a Site"
12
+ optional: true
13
+
14
+ # Step 3: Verify search bar is present
15
+ - assertVisible:
16
+ id: "wix_site_selector_search"
17
+ optional: true
18
+
19
+ # Step 4: Verify URL/Site ID input (owner mode)
20
+ - assertVisible:
21
+ id: "wix_site_selector_url_input"
22
+ optional: true
23
+
24
+ # Step 5: Verify Add button exists
25
+ - assertVisible:
26
+ id: "wix_site_selector_add_button"
27
+ optional: true
28
+
29
+ # Step 6: Enter a test site ID
30
+ - tapOn:
31
+ id: "wix_site_selector_url_input"
32
+ optional: true
33
+ - inputText: "test-site-id-001"
34
+ optional: true
35
+
36
+ # Step 7: Tap Add button
37
+ - tapOn:
38
+ id: "wix_site_selector_add_button"
39
+ optional: true
40
+
41
+ # Step 8: Verify site appears in the list after adding
42
+ - assertVisible:
43
+ id: "wix_site_selector_site_test-site-id-001"
44
+ optional: true
45
+
46
+ # Step 9: Verify checkmark appears for selected site
47
+ - assertVisible:
48
+ id: "wix_site_selector_checkmark"
49
+ optional: true
50
+
51
+ # Step 10: Tap Done button (if visible)
52
+ - tapOn:
53
+ id: "wix_site_selector_done"
54
+ optional: true
55
+
56
+ # Step 11: Verify site selector dismissed
57
+ - assertNotVisible:
58
+ text: "Select a Site"
59
+ optional: true
60
+
61
+ # Step 12: Navigate to settings/profile to change site
62
+ - tapOn:
63
+ id: "tab_bar_profile"
64
+ optional: true
65
+ - tapOn:
66
+ id: "tab_bar_settings"
67
+ optional: true
68
+
69
+ # Step 13: Look for Change Site option
70
+ - assertVisible:
71
+ text: "Change Site"
72
+ optional: true
73
+ - assertVisible:
74
+ text: "Current Site"
75
+ optional: true