Skip to content

Commit 2898a18

Browse files
authored
fix(ats): enhance or fix ODP integration (#470)
1 parent 86a328f commit 2898a18

File tree

8 files changed

+68
-33
lines changed

8 files changed

+68
-33
lines changed

.github/workflows/swift.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ jobs:
3737
- uses: actions/checkout@v3
3838
- uses: maxim-lobanov/setup-xcode@v1
3939
with:
40-
xcode-version: 12.4
40+
xcode-version: 14.1.0
4141
- env:
4242
SRCCLR_API_TOKEN: ${{ secrets.SRCCLR_API_TOKEN }}
4343
run: |
@@ -56,7 +56,7 @@ jobs:
5656
- uses: actions/checkout@v3
5757
- uses: maxim-lobanov/setup-xcode@v1
5858
with:
59-
xcode-version: 12.4
59+
xcode-version: 14.1.0
6060
- id: prepare_for_release
6161
name: Prepare for release
6262
env:
@@ -79,7 +79,7 @@ jobs:
7979
- uses: actions/checkout@v3
8080
- uses: maxim-lobanov/setup-xcode@v1
8181
with:
82-
xcode-version: 12.4
82+
xcode-version: 14.1.0
8383
- name: Push to cocoapods.org
8484
env:
8585
GITHUB_TOKEN: ${{ secrets.CI_USER_TOKEN }}

.github/workflows/unit_tests.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ jobs:
5050
- uses: actions/checkout@v3
5151
- uses: maxim-lobanov/setup-xcode@v1
5252
with:
53-
xcode-version: 12.4
53+
xcode-version: 14.1.0
5454
- name: set SDK Branch if PR
5555
if: ${{ github.event_name == 'pull_request' }}
5656
run: |

Sources/ODP/OdpEventManager.swift

+7-5
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,15 @@ class OdpEventManager {
5151
data: [:])
5252
}
5353

54-
func identifyUser(vuid: String, userId: String) {
54+
func identifyUser(vuid: String, userId: String?) {
55+
var identifiers = [Constants.ODP.keyForVuid: vuid]
56+
if let userId = userId {
57+
identifiers[Constants.ODP.keyForUserId] = userId
58+
}
59+
5560
sendEvent(type: Constants.ODP.eventType,
5661
action: "identified",
57-
identifiers: [
58-
Constants.ODP.keyForVuid: vuid,
59-
Constants.ODP.keyForUserId: userId
60-
],
62+
identifiers: identifiers,
6163
data: [:])
6264
}
6365

Sources/ODP/OdpManager.swift

+10-2
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class OdpManager {
7474
return
7575
}
7676

77-
let userKey = vuidManager.isVuid(visitorId: userId) ? Constants.ODP.keyForVuid : Constants.ODP.keyForUserId
77+
let userKey = OdpVuidManager.isVuid(userId) ? Constants.ODP.keyForVuid : Constants.ODP.keyForUserId
7878
let userValue = userId
7979

8080
segmentManager.fetchQualifiedSegments(userKey: userKey,
@@ -94,7 +94,15 @@ class OdpManager {
9494
return
9595
}
9696

97-
eventManager.identifyUser(vuid: vuidManager.vuid, userId: userId)
97+
var vuid = vuidManager.vuid
98+
var fsUserId: String? = userId
99+
if OdpVuidManager.isVuid(userId) {
100+
// overwrite if userId is vuid (when userContext is created with vuid)
101+
vuid = userId
102+
fsUserId = nil
103+
}
104+
105+
eventManager.identifyUser(vuid: vuid, userId: fsUserId)
98106
}
99107

100108
/// Send an event to the ODP server.

Sources/ODP/OdpVuidManager.swift

+4-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class OdpVuidManager {
2727
self.vuid = load()
2828
}
2929

30-
func makeVuid() -> String {
30+
static var newVuid: String {
3131
let maxLength = 32 // required by ODP server
3232

3333
// make sure UUIDv4 is used (not UUIDv1 or UUIDv6) since the trailing 5 chars will be truncated. See TDD for details.
@@ -36,9 +36,10 @@ class OdpVuidManager {
3636
return vuid
3737
}
3838

39-
func isVuid(visitorId: String) -> Bool {
39+
static func isVuid(_ visitorId: String) -> Bool {
4040
return visitorId.starts(with: "vuid_")
4141
}
42+
4243
}
4344

4445
// MARK: - VUID Store
@@ -54,7 +55,7 @@ extension OdpVuidManager {
5455
return oldVuid
5556
}
5657

57-
let vuid = makeVuid()
58+
let vuid = OdpVuidManager.newVuid
5859
save(vuid: vuid)
5960
return vuid
6061
}

Tests/OptimizelyTests-Common/OdpEventManagerTests.swift

+11
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,17 @@ class OdpEventManagerTests: XCTestCase {
110110
validateData(evt.data, customData: [:])
111111
}
112112

113+
func testIdentifyUser_noApiKey_nilUserId() {
114+
manager.identifyUser(vuid: "v1", userId: nil)
115+
116+
XCTAssertEqual(1, manager.eventQueue.count)
117+
let evt = manager.eventQueue.getFirstItem()!
118+
XCTAssertEqual("fullstack", evt.type)
119+
XCTAssertEqual("identified", evt.action)
120+
XCTAssertEqual(["vuid": "v1"], evt.identifiers)
121+
validateData(evt.data, customData: [:])
122+
}
123+
113124
func testSendEvent_apiKey() {
114125
odpConfig = OdpConfig()
115126
_ = odpConfig.update(apiKey: "valid", apiHost: "host", segmentsToCheck: [])

Tests/OptimizelyTests-Common/OdpManagerTests.swift

+25-12
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class OdpManagerTests: XCTestCase {
103103
// MARK: - registerVuid
104104

105105
func testRegisterVUIDCalledAutomatically() {
106-
XCTAssertEqual(eventManager.receivedVuid, manager.vuid, "registerVUID is implicitly called on OdpManager init")
106+
XCTAssertEqual(eventManager.receivedRegisterVuid, manager.vuid, "registerVUID is implicitly called on OdpManager init")
107107
}
108108

109109
func testRegisterVUIDCalledAutomatically_odpDisabled() {
@@ -116,36 +116,47 @@ class OdpManagerTests: XCTestCase {
116116
segmentManager: segmentManager,
117117
eventManager: newEventManager)
118118

119-
XCTAssertNil(newEventManager.receivedVuid, "registerVUID should not implicitly called when ODP disabled")
119+
XCTAssertNil(newEventManager.receivedRegisterVuid, "registerVUID should not implicitly called when ODP disabled")
120120
}
121121

122122
// MARK: - identifyUser
123123

124124
func testIdentifyUser_datafileNotReady() {
125125
manager.identifyUser(userId: "user-1")
126126

127-
XCTAssertEqual(eventManager.receivedUserId, "user-1")
127+
XCTAssertEqual(eventManager.receivedIdentifyUserId, "user-1")
128128
}
129129

130130
func testIdentifyUser_odpIntegrated() {
131131
manager.updateOdpConfig(apiKey: "key-1", apiHost: "host-1", segmentsToCheck: [])
132132
manager.identifyUser(userId: "user-1")
133133

134-
XCTAssertEqual(eventManager.receivedUserId, "user-1")
134+
XCTAssert(OdpVuidManager.isVuid(eventManager.receivedIdentifyVuid))
135+
XCTAssertEqual(eventManager.receivedIdentifyUserId, "user-1")
136+
}
137+
138+
func testIdentifyUser_odpIntegrated_vuidAsUserId() {
139+
manager.updateOdpConfig(apiKey: "key-1", apiHost: "host-1", segmentsToCheck: [])
140+
141+
let vuidAsUserId = OdpVuidManager.newVuid
142+
manager.identifyUser(userId: vuidAsUserId)
143+
144+
XCTAssertEqual(eventManager.receivedIdentifyVuid, vuidAsUserId)
145+
XCTAssertNil(eventManager.receivedIdentifyUserId)
135146
}
136147

137148
func testIdentifyUser_odpNotIntegrated() {
138149
manager.updateOdpConfig(apiKey: nil, apiHost: nil, segmentsToCheck: [])
139150
manager.identifyUser(userId: "user-1")
140151

141-
XCTAssertNil(eventManager.receivedUserId, "identifyUser event requeut should be discarded if ODP not integrated.")
152+
XCTAssertNil(eventManager.receivedIdentifyUserId, "identifyUser event requeut should be discarded if ODP not integrated.")
142153
}
143154

144155
func testIdentifyUser_odpDisabled() {
145156
manager.enabled = false
146157
manager.identifyUser(userId: "user-1")
147158

148-
XCTAssertNil(eventManager.receivedUserId, "identifyUser event requeut should be discarded if ODP disabled.")
159+
XCTAssertNil(eventManager.receivedIdentifyUserId, "identifyUser event requeut should be discarded if ODP disabled.")
149160
}
150161

151162
// MARK: - sendEvent
@@ -315,9 +326,11 @@ class OdpManagerTests: XCTestCase {
315326
// MARK: - Helpers
316327

317328
class MockOdpEventManager: OdpEventManager {
318-
var receivedVuid: String!
319-
var receivedUserId: String!
329+
var receivedRegisterVuid: String!
320330

331+
var receivedIdentifyVuid: String!
332+
var receivedIdentifyUserId: String?
333+
321334
var receivedType: String!
322335
var receivedAction: String!
323336
var receivedIdentifiers: [String: String]!
@@ -328,12 +341,12 @@ class OdpManagerTests: XCTestCase {
328341
var resetCalled = false
329342

330343
override func registerVUID(vuid: String) {
331-
self.receivedVuid = vuid
344+
self.receivedRegisterVuid = vuid
332345
}
333346

334-
override func identifyUser(vuid: String, userId: String) {
335-
self.receivedVuid = vuid
336-
self.receivedUserId = userId
347+
override func identifyUser(vuid: String, userId: String?) {
348+
self.receivedIdentifyVuid = vuid
349+
self.receivedIdentifyUserId = userId
337350
}
338351

339352
override func sendEvent(type: String, action: String, identifiers: [String: String], data: [String: Any?]) {

Tests/OptimizelyTests-Common/OdpVuidManagerTests.swift

+7-7
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ import XCTest
1919
class OdpVuidManagerTests: XCTestCase {
2020
var manager = OdpVuidManager()
2121

22-
func testMakeVuid() {
23-
let vuid = manager.makeVuid()
22+
func testNewVuid() {
23+
let vuid = OdpVuidManager.newVuid
2424

2525
XCTAssertTrue(vuid.starts(with: "vuid_"))
2626
XCTAssertEqual(vuid.count, 32)
2727
}
2828

2929
func testIsVuid() {
30-
XCTAssertTrue(manager.isVuid(visitorId: "vuid_123"))
31-
XCTAssertFalse(manager.isVuid(visitorId: "vuid-123"))
32-
XCTAssertFalse(manager.isVuid(visitorId: "123"))
30+
XCTAssertTrue(OdpVuidManager.isVuid("vuid_123"))
31+
XCTAssertFalse(OdpVuidManager.isVuid("vuid-123"))
32+
XCTAssertFalse(OdpVuidManager.isVuid("123"))
3333
}
3434

3535
func testAutoSaveAndLoad() {
@@ -42,8 +42,8 @@ class OdpVuidManagerTests: XCTestCase {
4242
let vuid2 = manager.vuid
4343

4444
XCTAssertTrue(vuid1 == vuid2)
45-
XCTAssert(manager.isVuid(visitorId: vuid1))
46-
XCTAssert(manager.isVuid(visitorId: vuid2))
45+
XCTAssert(OdpVuidManager.isVuid(vuid1))
46+
XCTAssert(OdpVuidManager.isVuid(vuid2))
4747

4848
UserDefaults.standard.removeObject(forKey: "optimizely-vuid")
4949

0 commit comments

Comments
 (0)