Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RUM-7795 Anonymous RUM Identifier #2172

Merged
merged 22 commits into from
Feb 10, 2025
Merged
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
afdb2b4
RUM-7795 Add anonymous user id tracking configuration
maciejburda Jan 10, 2025
90cff07
RUM-7795 Initial implementation
maciejburda Jan 10, 2025
3419e29
RUM-7795 Set anonymous id
maciejburda Jan 10, 2025
9e6c08d
RUM-7795 Add tests
maciejburda Jan 10, 2025
28f1c00
RUM-7795 PR Fixes
maciejburda Jan 10, 2025
d048bfc
Merge branch 'develop' into maciey/RUM-7795/anonymous-id
maciejburda Jan 10, 2025
b8a6eb0
RUM-7795 Correct test names
maciejburda Jan 10, 2025
62883cc
Merge branch 'develop' into maciey/RUM-7795/anonymous-id
maciejburda Jan 14, 2025
7ca3267
Update DatadogRUM/Sources/RUMConfiguration.swift
maciejburda Jan 14, 2025
5fc115b
RUM-7795 PR Fixes
maciejburda Jan 14, 2025
62a6214
RUM-7795 PR Fixes
maciejburda Jan 14, 2025
8dee753
RUM-7795 PR Fixes
maciejburda Jan 15, 2025
ced8b82
RUM-7795 Add integration tests
maciejburda Jan 16, 2025
d79e5cb
Merge branch 'develop' into maciey/RUM-7795/anonymous-id
maciejburda Jan 16, 2025
dc364ee
RUM-7795 Align docs
maciejburda Jan 16, 2025
777da2e
RUM-7795 Merge branch 'develop' into maciey/RUM-7795/anonymous-id
maciejburda Jan 17, 2025
de5bf59
RUM-7795 PR fixes
maciejburda Jan 24, 2025
1608b58
RUM-7795 Merge branch 'develop' into maciey/RUM-7795/anonymous-id
maciejburda Jan 31, 2025
5c7e75f
RUM-7795 Merge branch 'develop' into maciey/RUM-7795/anonymous-id
maciejburda Feb 7, 2025
b6df357
RUM-7795 Improve assertion
maciejburda Feb 7, 2025
c68095c
RUM-7795 PR fixes
maciejburda Feb 10, 2025
f7da48f
RUM-7795 Merge branch 'develop' into maciey/RUM-7795/anonymous-id
maciejburda Feb 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Unreleased
- [FEATURE] Adds anonymous identifier configuration for RUM Sessions linking. See [#2172][]

# 2.23.0 / 05-02-2025

@@ -827,6 +828,7 @@ Release `2.0` introduces breaking changes. Follow the [Migration Guide](MIGRATIO
[#2148]: https://github.com/DataDog/dd-sdk-ios/pull/2148
[#2153]: https://github.com/DataDog/dd-sdk-ios/pull/2153
[#2154]: https://github.com/DataDog/dd-sdk-ios/pull/2154
[#2172]: https://github.com/DataDog/dd-sdk-ios/pull/2172
[#2169]: https://github.com/DataDog/dd-sdk-ios/pull/2169
[#2170]: https://github.com/DataDog/dd-sdk-ios/pull/2170
[#2177]: https://github.com/DataDog/dd-sdk-ios/pull/2177
18 changes: 18 additions & 0 deletions Datadog/Datadog.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
@@ -730,6 +730,8 @@
A74A72852B10CC6700771FEB /* ResourceRequestBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A74A72842B10CC6700771FEB /* ResourceRequestBuilderTests.swift */; };
A74A72872B10CE4100771FEB /* ResourceMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = A74A72862B10CE4100771FEB /* ResourceMocks.swift */; };
A74A72892B10D95D00771FEB /* MultipartBuilderSpy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A74A72882B10D95D00771FEB /* MultipartBuilderSpy.swift */; };
A757AE902D3815B500C772FA /* AnonymousIdentifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A757AE8F2D3815AC00C772FA /* AnonymousIdentifierTests.swift */; };
A757AE912D3815B500C772FA /* AnonymousIdentifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A757AE8F2D3815AC00C772FA /* AnonymousIdentifierTests.swift */; };
A795069C2B974C8200AC4814 /* SessionReplay+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = A795069B2B974C8100AC4814 /* SessionReplay+objc.swift */; };
A79B0F64292BD074008742B3 /* DDB3HTTPHeadersWriter+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F63292BD074008742B3 /* DDB3HTTPHeadersWriter+apiTests.m */; };
A79B0F65292BD074008742B3 /* DDB3HTTPHeadersWriter+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F63292BD074008742B3 /* DDB3HTTPHeadersWriter+apiTests.m */; };
@@ -749,6 +751,10 @@
A7DA18042AB0C91200F76337 /* DDUIKitRUMViewsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DA18022AB0C8A700F76337 /* DDUIKitRUMViewsPredicateTests.swift */; };
A7DA18052AB0C91300F76337 /* DDUIKitRUMViewsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DA18022AB0C8A700F76337 /* DDUIKitRUMViewsPredicateTests.swift */; };
A7DA18072AB0CA5E00F76337 /* DDUIKitRUMActionsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DA18062AB0CA4700F76337 /* DDUIKitRUMActionsPredicateTests.swift */; };
A7E6EA812D3146AD00997201 /* AnonymousIdentifierManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7E6EA802D3146AD00997201 /* AnonymousIdentifierManager.swift */; };
A7E6EA822D3146AD00997201 /* AnonymousIdentifierManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7E6EA802D3146AD00997201 /* AnonymousIdentifierManager.swift */; };
A7E6EA842D314A9B00997201 /* AnonymousIdentifierManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7E6EA832D314A9900997201 /* AnonymousIdentifierManagerTests.swift */; };
A7E6EA852D314A9B00997201 /* AnonymousIdentifierManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7E6EA832D314A9900997201 /* AnonymousIdentifierManagerTests.swift */; };
A7EA11622AB0CE6C00C73970 /* DDUIKitRUMActionsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DA18062AB0CA4700F76337 /* DDUIKitRUMActionsPredicateTests.swift */; };
A7EA88562B17639A00FE2580 /* ResourcesWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7EA88552B17639A00FE2580 /* ResourcesWriter.swift */; };
A7F651302B7655DE004B0EDB /* UIImageResourceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7F6512F2B7655DE004B0EDB /* UIImageResourceTests.swift */; };
@@ -2756,6 +2762,7 @@
A74A72842B10CC6700771FEB /* ResourceRequestBuilderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourceRequestBuilderTests.swift; sourceTree = "<group>"; };
A74A72862B10CE4100771FEB /* ResourceMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourceMocks.swift; sourceTree = "<group>"; };
A74A72882B10D95D00771FEB /* MultipartBuilderSpy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipartBuilderSpy.swift; sourceTree = "<group>"; };
A757AE8F2D3815AC00C772FA /* AnonymousIdentifierTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnonymousIdentifierTests.swift; sourceTree = "<group>"; };
A795069B2B974C8100AC4814 /* SessionReplay+objc.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SessionReplay+objc.swift"; sourceTree = "<group>"; };
A795069D2B974CAA00AC4814 /* DDSessionReplay+apiTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "DDSessionReplay+apiTests.m"; sourceTree = "<group>"; };
A79B0F5A292B7C06008742B3 /* B3HTTPHeadersWriterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = B3HTTPHeadersWriterTests.swift; sourceTree = "<group>"; };
@@ -2773,6 +2780,8 @@
A7D9528B2B28C18D004C79B1 /* ResourceProcessorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourceProcessorTests.swift; sourceTree = "<group>"; };
A7DA18022AB0C8A700F76337 /* DDUIKitRUMViewsPredicateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DDUIKitRUMViewsPredicateTests.swift; sourceTree = "<group>"; };
A7DA18062AB0CA4700F76337 /* DDUIKitRUMActionsPredicateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DDUIKitRUMActionsPredicateTests.swift; sourceTree = "<group>"; };
A7E6EA802D3146AD00997201 /* AnonymousIdentifierManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnonymousIdentifierManager.swift; sourceTree = "<group>"; };
A7E6EA832D314A9900997201 /* AnonymousIdentifierManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnonymousIdentifierManagerTests.swift; sourceTree = "<group>"; };
A7EA88552B17639A00FE2580 /* ResourcesWriter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourcesWriter.swift; sourceTree = "<group>"; };
A7F6512F2B7655DE004B0EDB /* UIImageResourceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIImageResourceTests.swift; sourceTree = "<group>"; };
A7F773D32924EA2D00AC1A62 /* B3HTTPHeaders.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = B3HTTPHeaders.swift; sourceTree = "<group>"; };
@@ -4766,6 +4775,7 @@
615950EC291C057D00470E0C /* Integrations */ = {
isa = PBXGroup;
children = (
A7E6EA802D3146AD00997201 /* AnonymousIdentifierManager.swift */,
D2CBC26D294395A300134409 /* RUMContextAttributes.swift */,
615950ED291C058F00470E0C /* SessionReplayDependency.swift */,
D2CBC26A294383F200134409 /* WebViewEventReceiver.swift */,
@@ -5379,6 +5389,7 @@
61E8C5062B28896100E709B4 /* RUM */ = {
isa = PBXGroup;
children = (
A757AE8F2D3815AC00C772FA /* AnonymousIdentifierTests.swift */,
6167E6DC2B811A8300C3CA2D /* AppHangsMonitoringTests.swift */,
1117AA052D09A39400F86B29 /* RUMAttributesIntegrationTests.swift */,
61E8C5072B28898800E709B4 /* StartingRUMSessionTests.swift */,
@@ -5917,6 +5928,7 @@
D236BE2A29521A7700676E67 /* Integrations */ = {
isa = PBXGroup;
children = (
A7E6EA832D314A9900997201 /* AnonymousIdentifierManagerTests.swift */,
615950EA291C029700470E0C /* SessionReplayDependencyTests.swift */,
D21C26ED28AFB65B005DD405 /* ErrorMessageReceiverTests.swift */,
9E53889B2773C4B300A7DC42 /* WebViewEventReceiverTests.swift */,
@@ -8063,6 +8075,7 @@
61B5E42B26DFC433000B0A5F /* DDNSURLSessionDelegate+apiTests.m in Sources */,
6167E7062B82A9FD00C3CA2D /* GeneratingBacktraceTests.swift in Sources */,
A7CA21802BEBB1E800732571 /* AppBackgroundTaskCoordinatorTests.swift in Sources */,
A757AE912D3815B500C772FA /* AnonymousIdentifierTests.swift in Sources */,
D20605C52875895E0047275C /* KronosClockMock.swift in Sources */,
61133C642423990D00786299 /* LoggerTests.swift in Sources */,
6134CDB12A691E850061CCD9 /* BatchMetricsTests.swift in Sources */,
@@ -8650,6 +8663,7 @@
D23F8E8029DDCD28001CFAE8 /* VitalInfoSampler.swift in Sources */,
D23F8E8129DDCD28001CFAE8 /* RUMViewScope.swift in Sources */,
D23F8E8229DDCD28001CFAE8 /* RUMSessionScope.swift in Sources */,
A7E6EA812D3146AD00997201 /* AnonymousIdentifierManager.swift in Sources */,
D23F8E8329DDCD28001CFAE8 /* RUMUser.swift in Sources */,
D23F8E8429DDCD28001CFAE8 /* UIKitRUMUserActionsPredicate.swift in Sources */,
3C5CD8CE2C3ECB9400B12303 /* MemoryWarningReporter.swift in Sources */,
@@ -8698,6 +8712,7 @@
3CEC57782C16FDD80042B5F2 /* WatchdogTerminationAppStateManagerTests.swift in Sources */,
D23F8EAE29DDCD38001CFAE8 /* DDTAssertValidRUMUUID.swift in Sources */,
D23F8EAF29DDCD38001CFAE8 /* RUMScopeTests.swift in Sources */,
A7E6EA842D314A9B00997201 /* AnonymousIdentifierManagerTests.swift in Sources */,
D23F8EB029DDCD38001CFAE8 /* SessionReplayDependencyTests.swift in Sources */,
61C713B72A3C600400FA735A /* RUMMonitorProtocol+ConvenienceTests.swift in Sources */,
D23F8EB129DDCD38001CFAE8 /* RUMViewScopeTests.swift in Sources */,
@@ -8996,6 +9011,7 @@
D29A9F6B29DD85BB005C54A4 /* VitalInfoSampler.swift in Sources */,
D29A9F7529DD85BB005C54A4 /* RUMViewScope.swift in Sources */,
D29A9F5C29DD85BB005C54A4 /* RUMSessionScope.swift in Sources */,
A7E6EA822D3146AD00997201 /* AnonymousIdentifierManager.swift in Sources */,
D29A9F6629DD85BB005C54A4 /* RUMUser.swift in Sources */,
D29A9F8229DD85BB005C54A4 /* UIKitRUMUserActionsPredicate.swift in Sources */,
3C5CD8CD2C3ECB9400B12303 /* MemoryWarningReporter.swift in Sources */,
@@ -9044,6 +9060,7 @@
3CEC57772C16FDD70042B5F2 /* WatchdogTerminationAppStateManagerTests.swift in Sources */,
D29A9FCC29DDBCC5005C54A4 /* DDTAssertValidRUMUUID.swift in Sources */,
D29A9FB329DDB483005C54A4 /* RUMScopeTests.swift in Sources */,
A7E6EA852D314A9B00997201 /* AnonymousIdentifierManagerTests.swift in Sources */,
D29A9FAE29DDB483005C54A4 /* SessionReplayDependencyTests.swift in Sources */,
61C713B62A3C600400FA735A /* RUMMonitorProtocol+ConvenienceTests.swift in Sources */,
D29A9FB829DDB483005C54A4 /* RUMViewScopeTests.swift in Sources */,
@@ -9265,6 +9282,7 @@
D2CB6EE627C520D400A62B57 /* DateFormattingTests.swift in Sources */,
61DCC84B2C05D4D600CB59E5 /* RUMSessionEndedMetricIntegrationTests.swift in Sources */,
D2CB6EE727C520D400A62B57 /* FileTests.swift in Sources */,
A757AE902D3815B500C772FA /* AnonymousIdentifierTests.swift in Sources */,
610ABD4D2A6930CA00AFEA34 /* CoreTelemetryIntegrationTests.swift in Sources */,
D2CB6EEA27C520D400A62B57 /* LogMatcher.swift in Sources */,
D2CB6EEC27C520D400A62B57 /* CustomObjcViewController.m in Sources */,
110 changes: 110 additions & 0 deletions Datadog/IntegrationUnitTests/RUM/AnonymousIdentifierTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
/*
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
* This product includes software developed at Datadog (https://www.datadoghq.com/).
* Copyright 2019-Present Datadog, Inc.
*/

import XCTest
import TestUtilities
import DatadogInternal

@testable import DatadogRUM

/// Test case covering scenarios of anonymous identifier generation.
class AnonymousIdentifierTests: XCTestCase {
var core: DatadogCoreProxy! // swiftlint:disable:this implicitly_unwrapped_optional

override func setUp() {
core = DatadogCoreProxy()
}

override func tearDown() {
core.flushAndTearDown()
core = nil
}

func test_itGeneratesAnonymousIdentifier() throws {
enableRUM(trackAnonymousUser: true)

let session = try RUMSessionMatcher
.groupMatchersBySessions(try core.waitAndReturnRUMEventMatchers())
.takeSingle()

assertAnonymousIdentifier(isSet: true, in: session)
}

func test_itDoesNotGenerateAnonymousIdentifierWhenDisabled() throws {
enableRUM(trackAnonymousUser: false)

let session = try RUMSessionMatcher
.groupMatchersBySessions(try core.waitAndReturnRUMEventMatchers())
.takeSingle()

assertAnonymousIdentifier(isSet: false, in: session)
}

func test_itReusesAnonymousIdentifierOnSubsequentSessions() throws {
enableRUM(trackAnonymousUser: true)

let session1 = try RUMSessionMatcher
.groupMatchersBySessions(try core.waitAndReturnRUMEventMatchers())
.takeSingle()

assertAnonymousIdentifier(isSet: true, in: session1)
let anonymousId1 = session1.views.last?.viewEvents.first?.usr?.anonymousId

simulateNewSession()

enableRUM(trackAnonymousUser: true)

let session2 = try RUMSessionMatcher
.groupMatchersBySessions(try core.waitAndReturnRUMEventMatchers())
.takeSingle()

assertAnonymousIdentifier(isSet: true, in: session2)
let anonymousId2 = session2.views.last?.viewEvents.first?.usr?.anonymousId
XCTAssertEqual(anonymousId1, anonymousId2)
}

func test_itClearsAnonymousIdentifierWhenDisabled() throws {
enableRUM(trackAnonymousUser: true)

let session1 = try RUMSessionMatcher
.groupMatchersBySessions(try core.waitAndReturnRUMEventMatchers())
.takeSingle()

assertAnonymousIdentifier(isSet: true, in: session1)

simulateNewSession()

enableRUM(trackAnonymousUser: false)

let session2 = try RUMSessionMatcher
.groupMatchersBySessions(try core.waitAndReturnRUMEventMatchers())
.takeSingle()

assertAnonymousIdentifier(isSet: false, in: session2)
}

private func simulateNewSession() {
core = DatadogCoreProxy()
}

private func enableRUM(trackAnonymousUser: Bool) {
let rumConfig = RUM.Configuration(applicationID: .mockAny(), trackAnonymousUser: trackAnonymousUser)
RUM.enable(with: rumConfig, in: core)
// Needs to flush datastore on the caller thread to ensure anonymousId was read from the file.
core.scope(for: RUMFeature.self).dataStore.flush()
// Create new view that should consist of anonymousId is present.
RUMMonitor.shared(in: core).startView(key: .mockRandom(), name: .mockRandom())
}

private func assertAnonymousIdentifier(isSet: Bool, in session: RUMSessionMatcher) {
// Checks if view added after flush contains anonymousId.
if isSet {
XCTAssertNotNil(session.views.last?.viewEvents.first?.usr?.anonymousId)
} else {
XCTAssertNil(session.views.last?.viewEvents.first?.usr?.anonymousId)
}
}
}
10 changes: 9 additions & 1 deletion DatadogCore/Sources/Core/DatadogCore.swift
Original file line number Diff line number Diff line change
@@ -136,12 +136,12 @@ internal final class DatadogCore {
extraInfo: [AttributeKey: AttributeValue] = [:]
) {
let userInfo = UserInfo(
anonymousId: userInfoPublisher.current.anonymousId,
id: id,
name: name,
email: email,
extraInfo: extraInfo
)

userInfoPublisher.current = userInfo
}

@@ -317,6 +317,10 @@ extension DatadogCore: DatadogCoreProtocol {
func send(message: FeatureMessage, else fallback: @escaping () -> Void) {
bus.send(message: message, else: fallback)
}

func set(anonymousId: String?) {
userInfoPublisher.current.anonymousId = anonymousId
}
}

internal class CoreFeatureScope<Feature>: @unchecked Sendable, FeatureScope where Feature: DatadogFeature {
@@ -379,6 +383,10 @@ internal class CoreFeatureScope<Feature>: @unchecked Sendable, FeatureScope wher
core?.set(baggage: baggage, forKey: key)
}

func set(anonymousId: String?) {
core?.set(anonymousId: anonymousId)
}

var telemetry: Telemetry {
return core?.telemetry ?? NOPTelemetry()
}
83 changes: 83 additions & 0 deletions DatadogCore/Tests/Datadog/DatadogCore/DatadogCoreTests.swift
Original file line number Diff line number Diff line change
@@ -330,4 +330,87 @@ class DatadogCoreTests: XCTestCase {
core.flush()
XCTAssertEqual(requestBuilderSpy.requestParameters.count, 0, "It should not send any request")
}

func testItAppendsUserDataIfAnonymousIdentifierExists() {
let core = DatadogCore(
directory: temporaryCoreDirectory,
dateProvider: SystemDateProvider(),
initialConsent: .granted,
performance: .mockRandom(),
httpClient: HTTPClientMock(),
encryption: nil,
contextProvider: .mockAny(),
applicationVersion: .mockAny(),
maxBatchesPerUpload: .mockAny(),
backgroundTasksEnabled: .mockAny()
)
core.set(anonymousId: "anonymous-id")
let userBefore = core.userInfoPublisher.current
XCTAssertEqual(userBefore.anonymousId, "anonymous-id")
XCTAssertNil(userBefore.id)
XCTAssertNil(userBefore.name)
XCTAssertNil(userBefore.email)

core.setUserInfo(id: "user-id", name: "user-name", email: "user-email")

let userAfter = core.userInfoPublisher.current
XCTAssertEqual(userAfter.anonymousId, "anonymous-id")
XCTAssertEqual(userAfter.id, "user-id")
XCTAssertEqual(userAfter.name, "user-name")
XCTAssertEqual(userAfter.email, "user-email")
}

func testItAppendsAnonymousIdentifierIfUserExists() {
let core = DatadogCore(
directory: temporaryCoreDirectory,
dateProvider: SystemDateProvider(),
initialConsent: .granted,
performance: .mockRandom(),
httpClient: HTTPClientMock(),
encryption: nil,
contextProvider: .mockAny(),
applicationVersion: .mockAny(),
maxBatchesPerUpload: .mockAny(),
backgroundTasksEnabled: .mockAny()
)
core.setUserInfo(id: "user-id", name: "user-name", email: "user-email")

let userBefore = core.userInfoPublisher.current
XCTAssertNil(userBefore.anonymousId)
XCTAssertEqual(userBefore.id, "user-id")
XCTAssertEqual(userBefore.name, "user-name")
XCTAssertEqual(userBefore.email, "user-email")

core.set(anonymousId: "anonymous-id")

let userAfter = core.userInfoPublisher.current
XCTAssertEqual(userAfter.anonymousId, "anonymous-id")
XCTAssertEqual(userAfter.id, "user-id")
XCTAssertEqual(userAfter.name, "user-name")
XCTAssertEqual(userAfter.email, "user-email")
}

func testItClearsAnonymousIdentifier() {
let core = DatadogCore(
directory: temporaryCoreDirectory,
dateProvider: SystemDateProvider(),
initialConsent: .granted,
performance: .mockRandom(),
httpClient: HTTPClientMock(),
encryption: nil,
contextProvider: .mockAny(),
applicationVersion: .mockAny(),
maxBatchesPerUpload: .mockAny(),
backgroundTasksEnabled: .mockAny()
)
core.set(anonymousId: "anonymous-id")
core.setUserInfo(id: "user-id", name: "user-name", email: "user-email")
core.set(anonymousId: nil)

let userAfter = core.userInfoPublisher.current
XCTAssertNil(userAfter.anonymousId)
XCTAssertEqual(userAfter.id, "user-id")
XCTAssertEqual(userAfter.name, "user-name")
XCTAssertEqual(userAfter.email, "user-email")
}
}
Loading