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

Refactor FXIOS-11025 [Glean improvements] Refactor HomepageTelemetry to Use Glean Wrapper for Improved Testability πŸš€ #24121

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
10 changes: 8 additions & 2 deletions firefox-ios/Client/Telemetry/HomepageTelemetry.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,14 @@ import Foundation
import Glean

struct HomepageTelemetry {
private let gleanWrapper: GleanWrapper

init(gleanWrapper: GleanWrapper = DefaultGleanWrapper()) {
self.gleanWrapper = gleanWrapper
}

func sendHomepageTappedTelemetry(enteringPrivateMode: Bool) {
let isPrivateModeExtra = GleanMetrics.Homepage.PrivateModeToggleExtra(isPrivateMode: enteringPrivateMode)
GleanMetrics.Homepage.privateModeToggle.record(isPrivateModeExtra)
let extras = GleanMetrics.Homepage.PrivateModeToggleExtra(isPrivateMode: enteringPrivateMode)
gleanWrapper.recordEvent(for: GleanMetrics.Homepage.privateModeToggle, extras: extras)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,56 @@
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/

import Glean
import XCTest

@testable import Client

final class HomepageTelemetryTests: XCTestCase {
override func setUp() {
super.setUp()// Due to changes allow certain custom pings to implement their own opt-out
// independent of Glean, custom pings may need to be registered manually in
// tests in order to puth them in a state in which they can collect data.
Glean.shared.registerPings(GleanMetrics.Pings.shared)
Glean.shared.resetGlean(clearStores: true)
}

func testPrivateModeShortcutToggleTappedInNormalMode() throws {
let subject = HomepageTelemetry()
let mockWrapper = MockGleanWrapper()
let subject = HomepageTelemetry(gleanWrapper: mockWrapper)

subject.sendHomepageTappedTelemetry(enteringPrivateMode: true)

testEventMetricRecordingSuccess(metric: GleanMetrics.Homepage.privateModeToggle)
XCTAssertEqual(mockWrapper.recordEventCalled, 1)

let resultValue = try XCTUnwrap(GleanMetrics.Homepage.privateModeToggle.testGetValue())
XCTAssertEqual(resultValue[0].extra?["is_private_mode"], "true")
let savedEvent = try XCTUnwrap(mockWrapper.savedEvent as? GleanEvent)
XCTAssertEqual(savedEvent.extra?["is_private_mode"], "true")
}

func testPrivateModeShortcutToggleTappedInPrivateMode() throws {
let subject = HomepageTelemetry()
let mockWrapper = MockGleanWrapper() // Use the existing MockGleanWrapper
let subject = HomepageTelemetry(gleanWrapper: mockWrapper)

subject.sendHomepageTappedTelemetry(enteringPrivateMode: false)

testEventMetricRecordingSuccess(metric: GleanMetrics.Homepage.privateModeToggle)
XCTAssertEqual(mockWrapper.recordEventCalled, 1)

let savedEvent = try XCTUnwrap(mockWrapper.savedEvent as? GleanEvent)
XCTAssertEqual(savedEvent.extra?["is_private_mode"], "false")
}

func testGleanWrapperIntegration() throws {
let mockWrapper = MockGleanWrapper()
let subject = HomepageTelemetry(gleanWrapper: mockWrapper)

// Test recording with enteringPrivateMode = true
subject.sendHomepageTappedTelemetry(enteringPrivateMode: true)
XCTAssertEqual(mockWrapper.recordEventCalled, 1)

// Test recording with enteringPrivateMode = false
subject.sendHomepageTappedTelemetry(enteringPrivateMode: false)
XCTAssertEqual(mockWrapper.recordEventCalled, 2)

// Verify that the event was recorded
XCTAssertNotNil(mockWrapper.savedEvent)
}
}

class GleanEvent {
let extra: [String: String]?

let resultValue = try XCTUnwrap(GleanMetrics.Homepage.privateModeToggle.testGetValue())
XCTAssertEqual(resultValue[0].extra?["is_private_mode"], "false")
init(extra: [String: String]?) {
self.extra = extra
}
}