@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.
- package/dist/commands/configure.js +2 -3
- package/dist/commands/configure.js.map +1 -1
- package/package.json +1 -1
- package/templates/android/BookTemplate/tests/03_provider_detail.yaml +0 -6
- package/templates/android/BookTemplate/tests/04_booking_detail.yaml +0 -12
- package/templates/android/BookTemplate/tests/08_full_e2e.yaml +15 -15
- package/templates/ios/BookTemplate/tests/01_launch_discover.yaml +14 -7
- package/templates/ios/BookTemplate/tests/02_tab_navigation.yaml +7 -7
- package/templates/ios/BookTemplate/tests/03_provider_detail.yaml +0 -6
- package/templates/ios/BookTemplate/tests/04_booking_detail.yaml +0 -12
- package/templates/ios/BookTemplate/tests/06_search_filter.yaml +14 -31
- package/templates/ios/BookTemplate/tests/08_full_e2e.yaml +15 -15
- package/templates/shared/android/SecretsConfig/INTEGRATION.md +0 -2
- package/templates/shared/android/SecretsConfig/SETUP.md +3 -2
- package/templates/shared/android/SecretsConfig/SecretsConfig.kt +2 -2
- package/templates/shared/android/SecretsConfig/build.gradle.snippet.kts +1 -2
- package/templates/shared/android/SecretsConfig/secrets.properties.template +3 -2
- package/templates/shared/android/WixMemberBackend/WixAuthManager.kt +8 -1
- package/templates/shared/ios/SecretsConfig/INTEGRATION.md +0 -2
- package/templates/shared/ios/SecretsConfig/SETUP.md +3 -2
- package/templates/shared/ios/SecretsConfig/Secrets.xcconfig.template +3 -2
- package/templates/shared/ios/SecretsConfig/SecretsConfig.swift +2 -2
- package/templates/shared/ios/WixMemberBackend/INTEGRATION.md +9 -18
- package/templates/shared/ios/WixMemberBackend/SETUP.md +4 -2
- package/templates/shared/ios/WixMemberBackend/WixAuthService.swift +14 -3
- package/templates/shared/ios/WixOwnerBackend/INTEGRATION.md +2 -4
- package/templates/shared/ios/WixOwnerBackend/WixAdminAuthService.swift +1 -2
- package/templates/shared/ios/WixSiteSelector/INTEGRATION.md +2 -2
- package/templates/shared/keys.json.schema.json +0 -5
- package/templates/shared/tests/android/WixSiteSelector/WixSiteSelectorTest.kt +160 -0
- package/templates/shared/tests/ios/WixSiteSelector/WixSiteSelectorTests.swift +162 -0
- 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"
|
|
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
|
-
|
|
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
|
@@ -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
|
-
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
60
|
+
# Step 5: Bookings tab
|
|
61
61
|
- tapOn: "Bookings"
|
|
62
62
|
- waitForAnimationToEnd
|
|
63
63
|
- assertVisible:
|
|
64
64
|
id: "bookings_upcoming_tab"
|
|
65
|
-
# Step
|
|
65
|
+
# Step 6: Favorites tab
|
|
66
66
|
- tapOn: "Favorites"
|
|
67
67
|
- waitForAnimationToEnd
|
|
68
|
-
# Step
|
|
68
|
+
# Step 7: Profile tab
|
|
69
69
|
- tapOn: "Profile"
|
|
70
70
|
- waitForAnimationToEnd
|
|
71
71
|
- assertVisible:
|
|
72
72
|
id: "profile_settings_button"
|
|
73
|
-
# Step
|
|
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
|
|
19
|
+
# Verify we're on the discover screen
|
|
20
|
+
- assertVisible: "Discover"
|
|
21
|
+
# Content assertions
|
|
16
22
|
- assertVisible:
|
|
17
|
-
|
|
23
|
+
text: "Categories"
|
|
24
|
+
optional: true
|
|
18
25
|
- assertVisible:
|
|
19
|
-
|
|
26
|
+
text: "Featured"
|
|
20
27
|
optional: true
|
|
21
28
|
- assertVisible:
|
|
22
|
-
id: "
|
|
29
|
+
id: "discovery_category_0_button"
|
|
23
30
|
optional: true
|
|
24
31
|
- assertVisible:
|
|
25
|
-
id: "
|
|
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
|
|
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"
|
|
@@ -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
|
-
|
|
12
|
+
text: "Continue"
|
|
39
13
|
optional: true
|
|
40
|
-
# Test category filtering
|
|
41
14
|
- extendedWaitUntil:
|
|
42
|
-
visible:
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
60
|
+
# Step 5: Bookings tab
|
|
61
61
|
- tapOn: "Bookings"
|
|
62
62
|
- waitForAnimationToEnd
|
|
63
63
|
- assertVisible:
|
|
64
64
|
id: "bookings_upcoming_tab"
|
|
65
|
-
# Step
|
|
65
|
+
# Step 6: Favorites tab
|
|
66
66
|
- tapOn: "Favorites"
|
|
67
67
|
- waitForAnimationToEnd
|
|
68
|
-
# Step
|
|
68
|
+
# Step 7: Profile tab
|
|
69
69
|
- tapOn: "Profile"
|
|
70
70
|
- waitForAnimationToEnd
|
|
71
71
|
- assertVisible:
|
|
72
72
|
id: "profile_settings_button"
|
|
73
|
-
# Step
|
|
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.
|
|
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
|
-
|
|
33
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: `
|
|
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
|
|
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
|