From 943074c98a120c9f16ff666319389883ef1c4503 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Tue, 26 May 2026 11:44:44 -0700 Subject: [PATCH 1/5] [AI-FSSDK] [FSSDK-12670] Block ODP identify event for single identifier --- Sources/ODP/OdpEventManager.swift | 13 +++++++++---- .../OdpEventManagerTests.swift | 12 ++++-------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Sources/ODP/OdpEventManager.swift b/Sources/ODP/OdpEventManager.swift index d136c6ea..37dd195e 100644 --- a/Sources/ODP/OdpEventManager.swift +++ b/Sources/ODP/OdpEventManager.swift @@ -65,13 +65,18 @@ open class OdpEventManager { func identifyUser(vuid: String?, userId: String?) { var identifiers = [String: String]() - if let _vuid = vuid { - identifiers[Constants.ODP.keyForVuid] = _vuid + if let vuid = vuid, !vuid.isEmpty { + identifiers[Constants.ODP.keyForVuid] = vuid } - if let userId = userId { + if let userId = userId, !userId.isEmpty { identifiers[Constants.ODP.keyForUserId] = userId } - + + guard identifiers.count >= 2 else { + logger.d("ODP identify event is not dispatched (only one identifier provided).") + return + } + sendEvent(type: Constants.ODP.eventType, action: "identified", identifiers: identifiers, diff --git a/Tests/OptimizelyTests-Common/OdpEventManagerTests.swift b/Tests/OptimizelyTests-Common/OdpEventManagerTests.swift index 2f989378..14b85873 100644 --- a/Tests/OptimizelyTests-Common/OdpEventManagerTests.swift +++ b/Tests/OptimizelyTests-Common/OdpEventManagerTests.swift @@ -119,15 +119,11 @@ class OdpEventManagerTests: XCTestCase { validateData(evt.data, customData: [:]) } - func testIdentifyUser_noApiKey_nilUserId() { + func testIdentifyUser_noApiKey_nilUserId_singleIdentifier() { manager.identifyUser(vuid: "v1", userId: nil) - - XCTAssertEqual(1, manager.eventQueue.count) - let evt = manager.eventQueue.getFirstItem()! - XCTAssertEqual("fullstack", evt.type) - XCTAssertEqual("identified", evt.action) - XCTAssertEqual(["vuid": "v1"], evt.identifiers) - validateData(evt.data, customData: [:]) + + // single identifier should be skipped (not queued) + XCTAssertEqual(0, manager.eventQueue.count) } func testSendEvent_apiKey() { From 987e9302c958e2164a14bdf992738c5f5c9c1529 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 27 May 2026 09:38:58 -0700 Subject: [PATCH 2/5] [FSSDK-12670] Address review feedback: fix log message --- Sources/ODP/OdpEventManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/ODP/OdpEventManager.swift b/Sources/ODP/OdpEventManager.swift index 37dd195e..d0fc59c8 100644 --- a/Sources/ODP/OdpEventManager.swift +++ b/Sources/ODP/OdpEventManager.swift @@ -73,7 +73,7 @@ open class OdpEventManager { } guard identifiers.count >= 2 else { - logger.d("ODP identify event is not dispatched (only one identifier provided).") + logger.d("ODP identify event is not dispatched (fewer than 2 valid identifiers).") return } From fa22776e59b0b320202cbdb7d12bc3dd2e8d5ba8 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 27 May 2026 10:00:26 -0700 Subject: [PATCH 3/5] [FSSDK-12670] Retrigger CI From 46fb071b89273a35184e0da6eeebb716b0ca4dd7 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 27 May 2026 13:49:10 -0700 Subject: [PATCH 4/5] [FSSDK-12670] Add comment explaining the < 2 identifiers guard Co-Authored-By: Claude Opus 4.6 --- Sources/ODP/OdpEventManager.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/ODP/OdpEventManager.swift b/Sources/ODP/OdpEventManager.swift index d0fc59c8..e0df2289 100644 --- a/Sources/ODP/OdpEventManager.swift +++ b/Sources/ODP/OdpEventManager.swift @@ -72,6 +72,8 @@ open class OdpEventManager { identifiers[Constants.ODP.keyForUserId] = userId } + // Identify requires 2+ identifiers to link (e.g., vuid + fs_user_id). + // A single identifier has no cross-reference value and generates unnecessary traffic. guard identifiers.count >= 2 else { logger.d("ODP identify event is not dispatched (fewer than 2 valid identifiers).") return From fa1346bbd9b9e90451b290aca60384829ea56051 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 27 May 2026 16:40:48 -0700 Subject: [PATCH 5/5] [FSSDK-12670] retrigger CI