Skip to content

Commit 05344af

Browse files
Merge pull request #664 from mixpanel/jared-check-opt-out-in-queue
Check opt out status inside tracking queue to avoid race condition
2 parents a81bf89 + d076b5d commit 05344af

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

MixpanelDemo/MixpanelDemoTests/MixpanelOptOutTests.swift

+12-4
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,14 @@ class MixpanelOptOutTests: MixpanelBaseTests {
6666
waitForTrackingQueue(testMixpanel)
6767
waitForTrackingQueue(testMixpanel)
6868
let eventQueueValue = eventQueue(token: testMixpanel.apiToken)
69-
let props = eventQueueValue[1]["properties"] as? InternalProperties
69+
let props = eventQueueValue[0]["properties"] as? InternalProperties
7070
XCTAssertEqual(props!["string"] as? String, "yello")
7171
XCTAssertEqual(props!["number"] as? NSNumber, 3)
7272
compareDate(dateString: props!["date"] as! String, dateDate: now)
7373
XCTAssertEqual(props!["$app_version"] as? String, "override", "reserved property override failed")
7474

7575
if eventQueueValue.count > 0 {
76-
let event = eventQueueValue[1]
76+
let event = eventQueueValue[0]
7777
XCTAssertEqual((event["event"] as? String), "$opt_in", "When opted in, a track '$opt_in' should have been queued")
7878
}
7979
else {
@@ -238,6 +238,14 @@ class MixpanelOptOutTests: MixpanelBaseTests {
238238
XCTAssertTrue(peopleQueue(token: testMixpanel.apiToken).count == 1, "When opted out, people queue should not be flushed")
239239
removeDBfile(testMixpanel.apiToken)
240240
}
241+
242+
func testOptOutByDefaultTrueSkipsFirstAppOpen()
243+
{
244+
let testMixpanel = Mixpanel.initialize(token: randomId(), trackAutomaticEvents: true, optOutTrackingByDefault: true)
245+
waitForTrackingQueue(testMixpanel)
246+
XCTAssertTrue(eventQueue(token: testMixpanel.apiToken).count == 0, "When opted out, first app open should not be tracked")
247+
removeDBfile(testMixpanel.apiToken)
248+
}
241249

242250
func testOptOutWillSkipFlushEvent()
243251
{
@@ -250,15 +258,15 @@ class MixpanelOptOutTests: MixpanelBaseTests {
250258
testMixpanel.track(event: "event \(i)")
251259
}
252260
waitForTrackingQueue(testMixpanel)
253-
XCTAssertTrue(eventQueue(token: testMixpanel.apiToken).count == 3, "When opted in, events should have been queued")
261+
XCTAssertTrue(eventQueue(token: testMixpanel.apiToken).count == 2, "When opted in, events should have been queued")
254262

255263
testMixpanel.optOutTracking()
256264
waitForTrackingQueue(testMixpanel)
257265

258266
testMixpanel.flush()
259267
waitForTrackingQueue(testMixpanel)
260268

261-
XCTAssertTrue(eventQueue(token: testMixpanel.apiToken).count == 3, "When opted out, events should not be flushed")
269+
XCTAssertTrue(eventQueue(token: testMixpanel.apiToken).count == 2, "When opted out, events should not be flushed")
262270
removeDBfile(testMixpanel.apiToken)
263271
}
264272
}

Sources/MixpanelInstance.swift

+4-5
Original file line numberDiff line numberDiff line change
@@ -1068,14 +1068,13 @@ extension MixpanelInstance {
10681068
- parameter properties: properties dictionary
10691069
*/
10701070
public func track(event: String?, properties: Properties? = nil) {
1071-
if hasOptedOutTracking() {
1072-
return
1073-
}
1074-
10751071
let epochInterval = Date().timeIntervalSince1970
10761072

10771073
trackingQueue.async { [weak self, event, properties, epochInterval] in
1078-
guard let self = self else {
1074+
guard let self else {
1075+
return
1076+
}
1077+
if self.hasOptedOutTracking() {
10791078
return
10801079
}
10811080
var shadowTimedEvents = InternalProperties()

0 commit comments

Comments
 (0)