element-ios/RiotTests/PostHogAnalyticsClientTests...

105 lines
4.6 KiB
Swift

//
// Copyright 2024 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only
// Please see LICENSE in the repository root for full details.
//
import XCTest
@testable import Element
import AnalyticsEvents
class PostHogAnalyticsClientTests: XCTestCase {
private var posthogMock: MockPostHog!
override func setUp() {
posthogMock = MockPostHog()
}
func testSuperPropertiesAddedToAllCaptured() {
let analyticsClient = PostHogAnalyticsClient(posthogFactory: MockPostHogFactory(mock: posthogMock))
analyticsClient.start()
let superProperties = AnalyticsEvent.SuperProperties(appPlatform: .EI, cryptoSDK: .Rust, cryptoSDKVersion: "0.0")
analyticsClient.updateSuperProperties(superProperties)
// It should be the same for any event
let someEvent = AnalyticsEvent.CallEnded(durationMs: 0, isVideo: false, numParticipants: 1, placed: true)
analyticsClient.capture(someEvent)
let capturedEvent = posthogMock.capturePropertiesUserPropertiesReceivedArguments
// All the super properties should have been added
XCTAssertEqual(capturedEvent?.properties?["cryptoSDK"] as? String, AnalyticsEvent.SuperProperties.CryptoSDK.Rust.rawValue)
XCTAssertEqual(capturedEvent?.properties?["appPlatform"] as? String, AnalyticsEvent.SuperProperties.AppPlatform.EI.rawValue)
XCTAssertEqual(capturedEvent?.properties?["cryptoSDKVersion"] as? String, "0.0")
// Other properties should be there
XCTAssertEqual(capturedEvent?.properties?["isVideo"] as? Bool, false)
// Should also work for screens
analyticsClient.screen(AnalyticsEvent.MobileScreen.init(durationMs: 0, screenName: .Home))
let capturedScreen = posthogMock.screenPropertiesReceivedArguments
XCTAssertEqual(capturedScreen?.properties?["cryptoSDK"] as? String, AnalyticsEvent.SuperProperties.CryptoSDK.Rust.rawValue)
XCTAssertEqual(capturedScreen?.properties?["appPlatform"] as? String, AnalyticsEvent.SuperProperties.AppPlatform.EI.rawValue)
XCTAssertEqual(capturedScreen?.properties?["cryptoSDKVersion"] as? String, "0.0")
XCTAssertEqual(capturedScreen?.screenTitle, AnalyticsEvent.MobileScreen.ScreenName.Home.rawValue)
}
func testSuperPropertiesCanBeUdpated() {
let analyticsClient = PostHogAnalyticsClient(posthogFactory: MockPostHogFactory(mock: posthogMock))
analyticsClient.start()
let superProperties = AnalyticsEvent.SuperProperties(appPlatform: .EI, cryptoSDK: .Rust, cryptoSDKVersion: "0.0")
analyticsClient.updateSuperProperties(superProperties)
// It should be the same for any event
let someEvent = AnalyticsEvent.CallEnded(durationMs: 0, isVideo: false, numParticipants: 1, placed: true)
analyticsClient.capture(someEvent)
let capturedEvent = posthogMock.capturePropertiesUserPropertiesReceivedArguments
//
XCTAssertEqual(capturedEvent?.properties?["cryptoSDKVersion"] as? String, "0.0")
analyticsClient.updateSuperProperties(AnalyticsEvent.SuperProperties(appPlatform: .EI, cryptoSDK: .Rust, cryptoSDKVersion: "1.0"))
analyticsClient.capture(someEvent)
let secondCapturedEvent = posthogMock.capturePropertiesUserPropertiesReceivedArguments
XCTAssertEqual(secondCapturedEvent?.properties?["cryptoSDKVersion"] as? String, "1.0")
}
func testSuperPropertiesDontOverrideEventProperties() {
let analyticsClient = PostHogAnalyticsClient(posthogFactory: MockPostHogFactory(mock: posthogMock))
analyticsClient.start()
// Super property for cryptoSDK is rust
let superProperties = AnalyticsEvent.SuperProperties(appPlatform: nil, cryptoSDK: .Rust, cryptoSDKVersion: nil)
analyticsClient.updateSuperProperties(superProperties)
// This event as a similar named property `cryptoSDK` with Legacy value
let someEvent = AnalyticsEvent.Error(context: nil, cryptoModule: nil, cryptoSDK: .Legacy, domain: .E2EE, eventLocalAgeMillis: nil, isFederated: nil, isMatrixDotOrg: nil, name: .OlmKeysNotSentError, timeToDecryptMillis: nil, userTrustsOwnIdentity: nil, wasVisibleToUser: nil)
analyticsClient.capture(someEvent)
let capturedEvent = posthogMock.capturePropertiesUserPropertiesReceivedArguments
XCTAssertEqual(capturedEvent?.properties?["cryptoSDK"] as? String, AnalyticsEvent.Error.CryptoSDK.Legacy.rawValue)
}
}