diff --git a/firefox-ios/Client/Frontend/Share/ShareTelemetry.swift b/firefox-ios/Client/Frontend/Share/ShareTelemetry.swift index d85eec988d31..aed9af4662a5 100644 --- a/firefox-ios/Client/Frontend/Share/ShareTelemetry.swift +++ b/firefox-ios/Client/Frontend/Share/ShareTelemetry.swift @@ -16,6 +16,12 @@ protocol ShareTelemetry { } struct DefaultShareTelemetry: ShareTelemetry { + private let gleanWrapper: GleanWrapper + + init(gleanWrapper: GleanWrapper = DefaultGleanWrapper()) { + self.gleanWrapper = gleanWrapper + } + func sharedTo( activityType: UIActivity.ActivityType?, shareType: ShareType, @@ -30,6 +36,6 @@ struct DefaultShareTelemetry: ShareTelemetry { isOptedInSentFromFirefox: isOptedInSentFromFirefox, shareType: shareType.typeName ) - GleanMetrics.ShareSheet.sharedTo.record(extra) + gleanWrapper.recordEvent(for: GleanMetrics.ShareSheet.sharedTo, extras: extra) } } diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Sharing/ShareTelemetryTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Sharing/ShareTelemetryTests.swift index a386f5e0ffa6..7d58316f19a6 100644 --- a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Sharing/ShareTelemetryTests.swift +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Sharing/ShareTelemetryTests.swift @@ -9,6 +9,7 @@ import XCTest final class ShareTelemetryTests: XCTestCase { private let testWebURL = URL(string: "https://mozilla.org")! + var gleanWrapper: MockGleanWrapper! // For telemetry extras let activityIdentifierKey = "activity_identifier" @@ -19,11 +20,7 @@ final class ShareTelemetryTests: 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) + gleanWrapper = MockGleanWrapper() } func testSharedTo_withNoActivityType() throws { @@ -42,14 +39,27 @@ final class ShareTelemetryTests: XCTestCase { isOptedInSentFromFirefox: testIsOptedInSentFromFirefox ) - testEventMetricRecordingSuccess(metric: GleanMetrics.ShareSheet.sharedTo) + let savedEvent = try XCTUnwrap( + gleanWrapper.savedEvent as? EventMetricType + ) + + let savedExtras = try XCTUnwrap( + gleanWrapper.savedExtras as? GleanMetrics.ShareSheet.SharedToExtra + ) - let resultValue = try XCTUnwrap(GleanMetrics.ShareSheet.sharedTo.testGetValue()) - XCTAssertEqual(resultValue[0].extra?[activityIdentifierKey], "unknown") - XCTAssertEqual(resultValue[0].extra?[shareTypeKey], testShareType.typeName) - XCTAssertEqual(resultValue[0].extra?[hasShareMessageKey], String(testHasShareMessage)) - XCTAssertEqual(resultValue[0].extra?[hasIsEnrolledInSentFromFirefoxKey], String(testIsEnrolledInSentFromFirefox)) - XCTAssertEqual(resultValue[0].extra?[hasIsOptedInSentFromFirefoxKey], String(testIsOptedInSentFromFirefox)) + let extraRecord = savedExtras.toExtraRecord() + + let expectedMetricType = type(of: GleanMetrics.ShareSheet.sharedTo) + let resultMetricType = type(of: savedEvent) + + let message = TelemetryDebugMessage(expectedMetric: expectedMetricType, resultMetric: resultMetricType) + XCTAssert(resultMetricType == expectedMetricType, message.text) + XCTAssertEqual(gleanWrapper.recordEventCalled, 1) + XCTAssertEqual(extraRecord[activityIdentifierKey], "unknown") + XCTAssertEqual(extraRecord[shareTypeKey], testShareType.typeName) + XCTAssertEqual(extraRecord[hasShareMessageKey], String(testHasShareMessage)) + XCTAssertEqual(extraRecord[hasIsEnrolledInSentFromFirefoxKey], String(testIsEnrolledInSentFromFirefox)) + XCTAssertEqual(extraRecord[hasIsOptedInSentFromFirefoxKey], String(testIsOptedInSentFromFirefox)) } func testSharedTo_withActivityType() throws { @@ -68,14 +78,25 @@ final class ShareTelemetryTests: XCTestCase { isOptedInSentFromFirefox: testIsOptedInSentFromFirefox ) - testEventMetricRecordingSuccess(metric: GleanMetrics.ShareSheet.sharedTo) - - let resultValue = try XCTUnwrap(GleanMetrics.ShareSheet.sharedTo.testGetValue()) - XCTAssertEqual(resultValue[0].extra?[activityIdentifierKey], testActivityType.rawValue) - XCTAssertEqual(resultValue[0].extra?[shareTypeKey], testShareType.typeName) - XCTAssertEqual(resultValue[0].extra?[hasShareMessageKey], String(testHasShareMessage)) - XCTAssertEqual(resultValue[0].extra?[hasIsEnrolledInSentFromFirefoxKey], String(testIsEnrolledInSentFromFirefox)) - XCTAssertEqual(resultValue[0].extra?[hasIsOptedInSentFromFirefoxKey], String(testIsOptedInSentFromFirefox)) + let savedEvent = try XCTUnwrap( + gleanWrapper.savedEvent as? EventMetricType + ) + let savedExtras = try XCTUnwrap( + gleanWrapper.savedExtras as? GleanMetrics.ShareSheet.SharedToExtra + ) + let extraRecord = savedExtras.toExtraRecord() + + let expectedMetricType = type(of: GleanMetrics.ShareSheet.sharedTo) + let resultMetricType = type(of: savedEvent) + + let message = TelemetryDebugMessage(expectedMetric: expectedMetricType, resultMetric: resultMetricType) + XCTAssert(resultMetricType == expectedMetricType, message.text) + XCTAssertEqual(gleanWrapper.recordEventCalled, 1) + XCTAssertEqual(extraRecord[activityIdentifierKey], testActivityType.rawValue) + XCTAssertEqual(extraRecord[shareTypeKey], testShareType.typeName) + XCTAssertEqual(extraRecord[hasShareMessageKey], String(testHasShareMessage)) + XCTAssertEqual(extraRecord[hasIsEnrolledInSentFromFirefoxKey], String(testIsEnrolledInSentFromFirefox)) + XCTAssertEqual(extraRecord[hasIsOptedInSentFromFirefoxKey], String(testIsOptedInSentFromFirefox)) } func testSharedTo_enrolledAndOptedInSentFromFirefox() throws { @@ -94,17 +115,29 @@ final class ShareTelemetryTests: XCTestCase { isOptedInSentFromFirefox: testIsOptedInSentFromFirefox ) - testEventMetricRecordingSuccess(metric: GleanMetrics.ShareSheet.sharedTo) + let savedEvent = try XCTUnwrap( + gleanWrapper.savedEvent as? EventMetricType + ) + let savedExtras = try XCTUnwrap( + gleanWrapper.savedExtras as? GleanMetrics.ShareSheet.SharedToExtra + ) + + let extraRecord = savedExtras.toExtraRecord() + + let expectedMetricType = type(of: GleanMetrics.ShareSheet.sharedTo) + let resultMetricType = type(of: savedEvent) - let resultValue = try XCTUnwrap(GleanMetrics.ShareSheet.sharedTo.testGetValue()) - XCTAssertEqual(resultValue[0].extra?[activityIdentifierKey], testActivityType.rawValue) - XCTAssertEqual(resultValue[0].extra?[shareTypeKey], testShareType.typeName) - XCTAssertEqual(resultValue[0].extra?[hasShareMessageKey], String(testHasShareMessage)) - XCTAssertEqual(resultValue[0].extra?[hasIsEnrolledInSentFromFirefoxKey], String(testIsEnrolledInSentFromFirefox)) - XCTAssertEqual(resultValue[0].extra?[hasIsOptedInSentFromFirefoxKey], String(testIsOptedInSentFromFirefox)) + let message = TelemetryDebugMessage(expectedMetric: expectedMetricType, resultMetric: resultMetricType) + XCTAssert(resultMetricType == expectedMetricType, message.text) + XCTAssertEqual(gleanWrapper.recordEventCalled, 1) + XCTAssertEqual(extraRecord[activityIdentifierKey], testActivityType.rawValue) + XCTAssertEqual(extraRecord[shareTypeKey], testShareType.typeName) + XCTAssertEqual(extraRecord[hasShareMessageKey], String(testHasShareMessage)) + XCTAssertEqual(extraRecord[hasIsEnrolledInSentFromFirefoxKey], String(testIsEnrolledInSentFromFirefox)) + XCTAssertEqual(extraRecord[hasIsOptedInSentFromFirefoxKey], String(testIsOptedInSentFromFirefox)) } func createSubject() -> ShareTelemetry { - return DefaultShareTelemetry() + return DefaultShareTelemetry(gleanWrapper: GleanWrapper) } }