Skip to content

Commit eff199b

Browse files
Add test for impression event
1 parent bd2a47c commit eff199b

File tree

3 files changed

+62
-5
lines changed

3 files changed

+62
-5
lines changed

Tests/OptimizelyTests-APIs/OptimizelyClientTests_Others.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ class OptimizelyClientTests_Others: XCTestCase {
289289
// set invalid (infinity) to attribute values, which will cause JSONEncoder.encode exception
290290
let attributes = ["testvar": Double.infinity]
291291

292-
optimizely.sendImpressionEvent(experiment: experiment, variation: variation, userId: kUserId, attributes: attributes, flagKey: "", ruleType: Constants.DecisionSource.rollout.rawValue, enabled: true)
292+
optimizely.sendImpressionEvent(experiment: experiment, variation: variation, userId: kUserId, attributes: attributes, flagKey: "", ruleType: Constants.DecisionSource.rollout.rawValue, enabled: true, cmabUUID: nil)
293293
XCTAssert(eventDispatcher.events.count == 0)
294294
}
295295

@@ -321,7 +321,7 @@ class OptimizelyClientTests_Others: XCTestCase {
321321
// force condition for sdk-not-ready
322322
optimizely.config = nil
323323

324-
optimizely.sendImpressionEvent(experiment: experiment, variation: variation, userId: kUserId, flagKey: experiment.key, ruleType: Constants.DecisionSource.rollout.rawValue, enabled: true)
324+
optimizely.sendImpressionEvent(experiment: experiment, variation: variation, userId: kUserId, flagKey: experiment.key, ruleType: Constants.DecisionSource.rollout.rawValue, enabled: true, cmabUUID: nil)
325325
XCTAssert(eventDispatcher.events.isEmpty, "event should not be sent out sdk is not configured properly")
326326

327327
optimizely.sendConversionEvent(eventKey: kEventKey, userId: kUserId)

Tests/OptimizelyTests-Common/BatchEventBuilderTests_Events.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ class BatchEventBuilderTests_Events: XCTestCase {
111111
XCTAssertEqual(metaData["rule_key"] as! String, "ab_running_exp_audience_combo_exact_foo_or_true__and__42_or_4_2")
112112
XCTAssertEqual(metaData["flag_key"] as! String, "")
113113
XCTAssertEqual(metaData["variation_key"] as! String, "all_traffic_variation")
114+
XCTAssertNil(metaData["cmab_uuid"])
114115
XCTAssertTrue(metaData["enabled"] as! Bool)
115116

116117
let de = (snapshot["events"] as! Array<Dictionary<String, Any>>)[0]
@@ -212,7 +213,7 @@ class BatchEventBuilderTests_Events: XCTestCase {
212213
let experiment = optimizely.config?.getExperiment(id: "10390977714")
213214

214215
optimizely.config?.project.sendFlagDecisions = true
215-
let event = BatchEventBuilder.createImpressionEvent(config: optimizely.config!, experiment: experiment!, variation: nil, userId: userId, attributes: attributes, flagKey: experiment!.key, ruleType: Constants.DecisionSource.featureTest.rawValue, enabled: false)
216+
let event = BatchEventBuilder.createImpressionEvent(config: optimizely.config!, experiment: experiment!, variation: nil, userId: userId, attributes: attributes, flagKey: experiment!.key, ruleType: Constants.DecisionSource.featureTest.rawValue, enabled: false, cmabUUID: "cmab_uuid_124")
216217
XCTAssertNotNil(event)
217218

218219
let visitor = (getEventJSON(data: event!)!["visitors"] as! Array<Dictionary<String, Any>>)[0]
@@ -224,14 +225,15 @@ class BatchEventBuilderTests_Events: XCTestCase {
224225
XCTAssertEqual(metaData["rule_key"] as! String, "ab_running_exp_audience_combo_exact_foo_or_true__and__42_or_4_2")
225226
XCTAssertEqual(metaData["flag_key"] as! String, "ab_running_exp_audience_combo_exact_foo_or_true__and__42_or_4_2")
226227
XCTAssertEqual(metaData["variation_key"] as! String, "")
228+
XCTAssertEqual(metaData["cmab_uuid"] as! String, "cmab_uuid_124")
227229
XCTAssertFalse(metaData["enabled"] as! Bool)
228230
optimizely.config?.project.sendFlagDecisions = nil
229231
}
230232

231233
func testCreateImpressionEventWithoutExperimentAndVariation() {
232234

233235
optimizely.config?.project.sendFlagDecisions = true
234-
let event = BatchEventBuilder.createImpressionEvent(config: optimizely.config!, experiment: nil, variation: nil, userId: userId, attributes: [String: Any](), flagKey: "feature_1", ruleType: Constants.DecisionSource.rollout.rawValue, enabled: true)
236+
let event = BatchEventBuilder.createImpressionEvent(config: optimizely.config!, experiment: nil, variation: nil, userId: userId, attributes: [String: Any](), flagKey: "feature_1", ruleType: Constants.DecisionSource.rollout.rawValue, enabled: true, cmabUUID: nil)
235237
XCTAssertNotNil(event)
236238

237239
let visitor = (getEventJSON(data: event!)!["visitors"] as! Array<Dictionary<String, Any>>)[0]
@@ -243,6 +245,7 @@ class BatchEventBuilderTests_Events: XCTestCase {
243245
XCTAssertEqual(metaData["rule_key"] as! String, "")
244246
XCTAssertEqual(metaData["flag_key"] as! String, "feature_1")
245247
XCTAssertEqual(metaData["variation_key"] as! String, "")
248+
XCTAssertEqual(metaData["cmab_uuid"] as? String, nil)
246249
XCTAssertTrue(metaData["enabled"] as! Bool)
247250
optimizely.config?.project.sendFlagDecisions = nil
248251
}

Tests/OptimizelyTests-Common/OptimizelyUserContextTests_Decide_CMAB.swift

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,33 @@ class OptimizelyUserContextTests_Decide_CMAB: XCTestCase {
7272
XCTAssertTrue(self.mockCmabService.decisionCalled, "CMAB decision service was not called")
7373
XCTAssertEqual(self.mockCmabService.lastRuleId, "10390977673", "Expected CMAB rule id '10390977673' but got \(String(describing: self.mockCmabService.lastRuleId))")
7474

75-
expectation.fulfill()
75+
// Give event dispatcher time to process
76+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
77+
// Verify impression event
78+
self.optimizely.eventLock.sync {}
79+
80+
guard let event = self.getFirstEventJSON(client: self.optimizely) else {
81+
XCTFail("No impression event found")
82+
expectation.fulfill()
83+
return
84+
}
85+
86+
let visitor = (event["visitors"] as! Array<Dictionary<String, Any>>)[0]
87+
let snapshot = (visitor["snapshots"] as! Array<Dictionary<String, Any>>)[0]
88+
let decision = (snapshot["decisions"] as! Array<Dictionary<String, Any>>)[0]
89+
let metaData = decision["metadata"] as! Dictionary<String, Any>
90+
91+
// Verify event metadata
92+
XCTAssertEqual(metaData["rule_type"] as! String, Constants.DecisionSource.featureTest.rawValue)
93+
XCTAssertEqual(metaData["rule_key"] as! String, "exp_with_audience")
94+
XCTAssertEqual(metaData["flag_key"] as! String, "feature_1")
95+
XCTAssertEqual(metaData["variation_key"] as! String, "a")
96+
XCTAssertEqual(metaData["cmab_uuid"] as? String, "test-uuid")
97+
XCTAssertTrue(metaData["enabled"] as! Bool)
98+
99+
expectation.fulfill()
100+
}
101+
76102
}
77103

78104
wait(for: [expectation], timeout: 5) // Increased timeout for reliability
@@ -285,3 +311,31 @@ fileprivate class MockCmabService: DefaultCmabService {
285311
return .failure(CmabClientError.fetchFailed("No variation set"))
286312
}
287313
}
314+
315+
extension OptimizelyUserContextTests_Decide_CMAB {
316+
317+
func getFirstEvent(dispatcher: MockEventDispatcher) -> EventForDispatch? {
318+
optimizely.eventLock.sync{}
319+
return dispatcher.events.first
320+
}
321+
322+
func getFirstEventJSON(dispatcher: MockEventDispatcher) -> [String: Any]? {
323+
guard let event = getFirstEvent(dispatcher: dispatcher) else { return nil }
324+
325+
let json = try! JSONSerialization.jsonObject(with: event.body, options: .allowFragments) as! [String: Any]
326+
return json
327+
}
328+
329+
func getFirstEventJSON(client: OptimizelyClient) -> [String: Any]? {
330+
guard let event = getFirstEvent(dispatcher: client.eventDispatcher as! MockEventDispatcher) else { return nil }
331+
332+
let json = try! JSONSerialization.jsonObject(with: event.body, options: .allowFragments) as! [String: Any]
333+
return json
334+
}
335+
336+
func getEventJSON(data: Data) -> [String: Any]? {
337+
let json = try! JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String: Any]
338+
return json
339+
}
340+
341+
}

0 commit comments

Comments
 (0)