For #24707 - Remove Event.wrapper for CreditCards telemetry

pull/543/head
Alexandru2909 2 years ago committed by mergify[bot]
parent b8a59b2602
commit 9ff4f373ec

@ -57,18 +57,6 @@ sealed class Event {
// Recently visited/Recent searches
object RecentSearchesGroupDeleted : Event()
// Credit cards
object CreditCardSaved : Event()
object CreditCardDeleted : Event()
object CreditCardModified : Event()
object CreditCardFormDetected : Event()
object CreditCardAutofilled : Event()
object CreditCardAutofillPromptShown : Event()
object CreditCardAutofillPromptExpanded : Event()
object CreditCardAutofillPromptDismissed : Event()
object CreditCardManagementAddTapped : Event()
object CreditCardManagementCardTapped : Event()
// Interaction events with extras
data class SearchWithAds(val providerName: String) : Event() {

@ -12,7 +12,6 @@ import org.mozilla.fenix.GleanMetrics.Autoplay
import org.mozilla.fenix.GleanMetrics.Awesomebar
import org.mozilla.fenix.GleanMetrics.BrowserSearch
import org.mozilla.fenix.GleanMetrics.ContextualMenu
import org.mozilla.fenix.GleanMetrics.CreditCards
import org.mozilla.fenix.GleanMetrics.HomeMenu
import org.mozilla.fenix.GleanMetrics.HomeScreen
import org.mozilla.fenix.GleanMetrics.Pings
@ -178,36 +177,6 @@ private val Event.wrapper: EventWrapper<*>?
is Event.RecentBookmarkCount -> EventWrapper<NoExtraKeys>(
{ RecentBookmarks.recentBookmarksCount.set(this.count.toLong()) },
)
is Event.CreditCardSaved -> EventWrapper<NoExtraKeys>(
{ CreditCards.saved.add() }
)
is Event.CreditCardDeleted -> EventWrapper<NoExtraKeys>(
{ CreditCards.deleted.add() }
)
is Event.CreditCardModified -> EventWrapper<NoExtraKeys>(
{ CreditCards.modified.record(it) }
)
is Event.CreditCardFormDetected -> EventWrapper<NoExtraKeys>(
{ CreditCards.formDetected.record(it) }
)
is Event.CreditCardAutofillPromptShown -> EventWrapper<NoExtraKeys>(
{ CreditCards.autofillPromptShown.record(it) }
)
is Event.CreditCardAutofillPromptExpanded -> EventWrapper<NoExtraKeys>(
{ CreditCards.autofillPromptExpanded.record(it) }
)
is Event.CreditCardAutofillPromptDismissed -> EventWrapper<NoExtraKeys>(
{ CreditCards.autofillPromptDismissed.record(it) }
)
is Event.CreditCardAutofilled -> EventWrapper<NoExtraKeys>(
{ CreditCards.autofilled.record(it) }
)
is Event.CreditCardManagementAddTapped -> EventWrapper<NoExtraKeys>(
{ CreditCards.managementAddTapped.record(it) }
)
is Event.CreditCardManagementCardTapped -> EventWrapper<NoExtraKeys>(
{ CreditCards.managementCardTapped.record(it) }
)
is Event.SearchTermGroupCount -> EventWrapper(
{ SearchTerms.numberOfSearchTermGroup.record(it) },
{ SearchTerms.numberOfSearchTermGroupKeys.valueOf(it) }

@ -38,6 +38,7 @@ import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.GleanMetrics.Addons
import org.mozilla.fenix.GleanMetrics.ContextMenu
import org.mozilla.fenix.GleanMetrics.AndroidAutofill
import org.mozilla.fenix.GleanMetrics.CreditCards
import org.mozilla.fenix.GleanMetrics.CustomTab
import org.mozilla.fenix.GleanMetrics.Events
import org.mozilla.fenix.GleanMetrics.LoginDialog
@ -163,6 +164,16 @@ internal class ReleaseMetricController(
}
Unit
}
Component.FEATURE_PROMPTS to CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_FORM_DETECTED ->
CreditCards.formDetected.record(NoExtras())
Component.FEATURE_PROMPTS to CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_SUCCESS ->
CreditCards.autofilled.record(NoExtras())
Component.FEATURE_PROMPTS to CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_SHOWN ->
CreditCards.autofillPromptShown.record(NoExtras())
Component.FEATURE_PROMPTS to CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_EXPANDED ->
CreditCards.autofillPromptExpanded.record(NoExtras())
Component.FEATURE_PROMPTS to CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_DISMISSED ->
CreditCards.autofillPromptDismissed.record(NoExtras())
Component.FEATURE_AUTOFILL to AutofillFacts.Items.AUTOFILL_REQUEST -> {
val hasMatchingLogins = metadata?.get(AutofillFacts.Metadata.HAS_MATCHING_LOGINS) as Boolean?
@ -260,17 +271,6 @@ internal class ReleaseMetricController(
@Suppress("LongMethod", "MaxLineLength")
private fun Fact.toEvent(): Event? = when {
Component.FEATURE_PROMPTS == component && CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_FORM_DETECTED == item ->
Event.CreditCardFormDetected
Component.FEATURE_PROMPTS == component && CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_SUCCESS == item ->
Event.CreditCardAutofilled
Component.FEATURE_PROMPTS == component && CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_SHOWN == item ->
Event.CreditCardAutofillPromptShown
Component.FEATURE_PROMPTS == component && CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_EXPANDED == item ->
Event.CreditCardAutofillPromptExpanded
Component.FEATURE_PROMPTS == component && CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_DISMISSED == item ->
Event.CreditCardAutofillPromptDismissed
Component.FEATURE_CONTEXTMENU == component && ContextMenuFacts.Items.TEXT_SELECTION_OPTION == item -> {
when (metadata?.get("textSelectionOption")?.toString()) {
CONTEXT_MENU_COPY -> Event.ContextMenuCopyTapped

@ -49,7 +49,6 @@ class CreditCardsManagementFragment : SecureFragment() {
controller = DefaultCreditCardsManagementController(
navController = findNavController()
),
requireContext().components.analytics.metrics
)
val binding = ComponentCreditCardsBinding.bind(view)

@ -12,8 +12,9 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import mozilla.components.concept.storage.NewCreditCardFields
import mozilla.components.concept.storage.UpdatableCreditCardFields
import mozilla.components.service.glean.private.NoExtras
import mozilla.components.service.sync.autofill.AutofillCreditCardsAddressesStorage
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.GleanMetrics.CreditCards
import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.settings.creditcards.CreditCardEditorFragment
import org.mozilla.fenix.settings.creditcards.interactor.CreditCardEditorInteractor
@ -77,7 +78,7 @@ class DefaultCreditCardEditorController(
lifecycleScope.launch(Dispatchers.Main) {
navController.popBackStack()
}
metrics.track(Event.CreditCardDeleted)
CreditCards.deleted.add()
}
dialog.dismiss()
}
@ -90,7 +91,7 @@ class DefaultCreditCardEditorController(
lifecycleScope.launch(Dispatchers.Main) {
navController.popBackStack()
}
metrics.track(Event.CreditCardSaved)
CreditCards.saved.add()
}
}
@ -101,7 +102,7 @@ class DefaultCreditCardEditorController(
lifecycleScope.launch(Dispatchers.Main) {
navController.popBackStack()
}
metrics.track(Event.CreditCardModified)
CreditCards.modified.record(NoExtras())
}
}
}

@ -5,8 +5,8 @@
package org.mozilla.fenix.settings.creditcards.interactor
import mozilla.components.concept.storage.CreditCard
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController
import mozilla.components.service.glean.private.NoExtras
import org.mozilla.fenix.GleanMetrics.CreditCards
import org.mozilla.fenix.settings.creditcards.controller.CreditCardsManagementController
/**
@ -37,16 +37,15 @@ interface CreditCardsManagementInteractor {
*/
class DefaultCreditCardsManagementInteractor(
private val controller: CreditCardsManagementController,
private val metrics: MetricController
) : CreditCardsManagementInteractor {
override fun onSelectCreditCard(creditCard: CreditCard) {
controller.handleCreditCardClicked(creditCard)
metrics.track(Event.CreditCardManagementCardTapped)
CreditCards.managementCardTapped.record(NoExtras())
}
override fun onAddCreditCardClick() {
controller.handleAddCreditCardClicked()
metrics.track(Event.CreditCardManagementAddTapped)
CreditCards.managementAddTapped.record(NoExtras())
}
}

@ -13,7 +13,6 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.GleanMetrics.Awesomebar
import org.mozilla.fenix.GleanMetrics.CreditCards
import org.mozilla.fenix.GleanMetrics.RecentBookmarks
import org.mozilla.fenix.GleanMetrics.RecentlyVisitedHomepage
import org.mozilla.fenix.GleanMetrics.SyncedTabs
@ -90,47 +89,4 @@ class GleanMetricsServiceTest {
gleanService.track(Event.HistorySearchGroupOpened)
assertTrue(RecentlyVisitedHomepage.searchGroupOpened.testHasValue())
}
@Test
fun `credit card events are correctly recorded`() {
assertFalse(CreditCards.saved.testHasValue())
gleanService.track(Event.CreditCardSaved)
assertTrue(CreditCards.saved.testHasValue())
assertFalse(CreditCards.deleted.testHasValue())
gleanService.track(Event.CreditCardDeleted)
assertTrue(CreditCards.deleted.testHasValue())
assertFalse(CreditCards.modified.testHasValue())
gleanService.track(Event.CreditCardModified)
assertTrue(CreditCards.modified.testHasValue())
assertFalse(CreditCards.formDetected.testHasValue())
gleanService.track(Event.CreditCardFormDetected)
assertTrue(CreditCards.formDetected.testHasValue())
assertFalse(CreditCards.autofilled.testHasValue())
gleanService.track(Event.CreditCardAutofilled)
assertTrue(CreditCards.autofilled.testHasValue())
assertFalse(CreditCards.autofillPromptShown.testHasValue())
gleanService.track(Event.CreditCardAutofillPromptShown)
assertTrue(CreditCards.autofillPromptShown.testHasValue())
assertFalse(CreditCards.autofillPromptExpanded.testHasValue())
gleanService.track(Event.CreditCardAutofillPromptExpanded)
assertTrue(CreditCards.autofillPromptExpanded.testHasValue())
assertFalse(CreditCards.autofillPromptDismissed.testHasValue())
gleanService.track(Event.CreditCardAutofillPromptDismissed)
assertTrue(CreditCards.autofillPromptDismissed.testHasValue())
assertFalse(CreditCards.managementAddTapped.testHasValue())
gleanService.track(Event.CreditCardManagementAddTapped)
assertTrue(CreditCards.managementAddTapped.testHasValue())
assertFalse(CreditCards.managementCardTapped.testHasValue())
gleanService.track(Event.CreditCardManagementCardTapped)
assertTrue(CreditCards.managementCardTapped.testHasValue())
}
}

@ -35,6 +35,7 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.GleanMetrics.AndroidAutofill
import org.mozilla.fenix.GleanMetrics.CreditCards
import org.mozilla.fenix.GleanMetrics.CustomTab
import org.mozilla.fenix.GleanMetrics.LoginDialog
import org.mozilla.fenix.GleanMetrics.MediaNotification
@ -274,107 +275,6 @@ class MetricControllerTest {
assertEquals(settings.enabledAddonsList, "test2,test4")
}
@Test
fun `credit card fact should trigger event`() {
val enabled = true
val settings: Settings = mockk(relaxed = true)
val controller = ReleaseMetricController(
services = listOf(dataService1),
isDataTelemetryEnabled = { enabled },
isMarketingDataTelemetryEnabled = { enabled },
settings
)
var fact = Fact(
Component.FEATURE_PROMPTS,
Action.INTERACTION,
CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_FORM_DETECTED
)
var event = controller.factToEvent(fact)
assertEquals(event, Event.CreditCardFormDetected)
fact = Fact(
Component.FEATURE_PROMPTS,
Action.INTERACTION,
CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_SUCCESS
)
event = controller.factToEvent(fact)
assertEquals(event, Event.CreditCardAutofilled)
fact = Fact(
Component.FEATURE_PROMPTS,
Action.INTERACTION,
CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_SHOWN
)
event = controller.factToEvent(fact)
assertEquals(event, Event.CreditCardAutofillPromptShown)
fact = Fact(
Component.FEATURE_PROMPTS,
Action.INTERACTION,
CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_EXPANDED
)
event = controller.factToEvent(fact)
assertEquals(event, Event.CreditCardAutofillPromptExpanded)
fact = Fact(
Component.FEATURE_PROMPTS,
Action.INTERACTION,
CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_DISMISSED
)
event = controller.factToEvent(fact)
assertEquals(event, Event.CreditCardAutofillPromptDismissed)
}
@Test
fun `credit card events should be sent to enabled service`() {
val controller = ReleaseMetricController(
listOf(dataService1),
isDataTelemetryEnabled = { true },
isMarketingDataTelemetryEnabled = { true },
mockk()
)
every { dataService1.shouldTrack(Event.CreditCardSaved) } returns true
every { dataService1.shouldTrack(Event.CreditCardDeleted) } returns true
every { dataService1.shouldTrack(Event.CreditCardModified) } returns true
every { dataService1.shouldTrack(Event.CreditCardFormDetected) } returns true
every { dataService1.shouldTrack(Event.CreditCardAutofilled) } returns true
every { dataService1.shouldTrack(Event.CreditCardAutofillPromptShown) } returns true
every { dataService1.shouldTrack(Event.CreditCardAutofillPromptExpanded) } returns true
every { dataService1.shouldTrack(Event.CreditCardAutofillPromptDismissed) } returns true
every { dataService1.shouldTrack(Event.CreditCardManagementAddTapped) } returns true
every { dataService1.shouldTrack(Event.CreditCardManagementCardTapped) } returns true
controller.start(MetricServiceType.Data)
controller.track(Event.CreditCardSaved)
controller.track(Event.CreditCardDeleted)
controller.track(Event.CreditCardModified)
controller.track(Event.CreditCardFormDetected)
controller.track(Event.CreditCardAutofilled)
controller.track(Event.CreditCardAutofillPromptShown)
controller.track(Event.CreditCardAutofillPromptExpanded)
controller.track(Event.CreditCardAutofillPromptDismissed)
controller.track(Event.CreditCardManagementAddTapped)
controller.track(Event.CreditCardManagementCardTapped)
verify { dataService1.track(Event.CreditCardSaved) }
verify { dataService1.track(Event.CreditCardDeleted) }
verify { dataService1.track(Event.CreditCardModified) }
verify { dataService1.track(Event.CreditCardFormDetected) }
verify { dataService1.track(Event.CreditCardAutofilled) }
verify { dataService1.track(Event.CreditCardAutofillPromptShown) }
verify { dataService1.track(Event.CreditCardAutofillPromptExpanded) }
verify { dataService1.track(Event.CreditCardAutofillPromptDismissed) }
verify { dataService1.track(Event.CreditCardManagementAddTapped) }
verify { dataService1.track(Event.CreditCardManagementCardTapped) }
}
@Test
fun `WHEN changing Fact(component, item) without additional vals to events THEN it returns the right event`() {
// This naive test was added for a refactoring. It only covers the comparisons that were easy to add.
@ -568,4 +468,28 @@ class MetricControllerTest {
assertTrue(AndroidAutofill.unlockCancelled.testHasValue())
}
}
@Test
fun `WHEN processing a CreditCardAutofillDialog fact THEN the right metric is recorded`() {
val controller = ReleaseMetricController(emptyList(), { true }, { true }, mockk())
val action = mockk<Action>(relaxed = true)
val itemsToEvents = listOf(
CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_FORM_DETECTED to CreditCards.formDetected,
CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_SUCCESS to CreditCards.autofilled,
CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_SHOWN to CreditCards.autofillPromptShown,
CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_EXPANDED to CreditCards.autofillPromptExpanded,
CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_DISMISSED to CreditCards.autofillPromptDismissed,
)
itemsToEvents.forEach { (item, event) ->
val fact = Fact(Component.FEATURE_PROMPTS, action, item)
controller.run {
fact.process()
}
assertEquals(true, event.testHasValue())
assertEquals(1, event.testGetValue().size)
assertEquals(null, event.testGetValue().single().extra)
}
}
}

@ -17,18 +17,28 @@ import mozilla.components.concept.storage.CreditCardNumber
import mozilla.components.concept.storage.NewCreditCardFields
import mozilla.components.concept.storage.UpdatableCreditCardFields
import mozilla.components.service.sync.autofill.AutofillCreditCardsAddressesStorage
import mozilla.components.support.test.robolectric.testContext
import mozilla.components.support.test.rule.MainCoroutineRule
import mozilla.components.support.utils.CreditCardNetworkType
import mozilla.telemetry.glean.testing.GleanTestRule
import org.junit.After
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.components.metrics.Event
import org.junit.runner.RunWith
import org.mozilla.fenix.GleanMetrics.CreditCards
import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.settings.creditcards.controller.DefaultCreditCardEditorController
@RunWith(FenixRobolectricTestRunner::class) // for gleanTestRule
class DefaultCreditCardEditorControllerTest {
@get:Rule
val gleanTestRule = GleanTestRule(testContext)
private val storage: AutofillCreditCardsAddressesStorage = mockk(relaxed = true)
private val navController: NavController = mockk(relaxed = true)
private val metrics: MetricController = mockk(relaxed = true)
@ -78,14 +88,15 @@ class DefaultCreditCardEditorControllerTest {
@Test
fun handleDeleteCreditCard() = testCoroutineScope.runBlockingTest {
val creditCardId = "id"
assertFalse(CreditCards.deleted.testHasValue())
controller.handleDeleteCreditCard(creditCardId)
coVerify {
storage.deleteCreditCard(creditCardId)
navController.popBackStack()
metrics.track(Event.CreditCardDeleted)
}
assertTrue(CreditCards.deleted.testHasValue())
}
@Test
@ -98,14 +109,15 @@ class DefaultCreditCardEditorControllerTest {
expiryYear = 2030,
cardType = CreditCardNetworkType.DISCOVER.cardName
)
assertFalse(CreditCards.saved.testHasValue())
controller.handleSaveCreditCard(creditCardFields)
coVerify {
storage.addCreditCard(creditCardFields)
navController.popBackStack()
metrics.track(Event.CreditCardSaved)
}
assertTrue(CreditCards.saved.testHasValue())
}
@Test
@ -119,13 +131,14 @@ class DefaultCreditCardEditorControllerTest {
expiryYear = 2034,
cardType = CreditCardNetworkType.DISCOVER.cardName
)
assertFalse(CreditCards.modified.testHasValue())
controller.handleUpdateCreditCard(creditCardId, creditCardFields)
coVerify {
storage.updateCreditCard(creditCardId, creditCardFields)
navController.popBackStack()
metrics.track(Event.CreditCardModified)
}
assertTrue(CreditCards.modified.testHasValue())
}
}

@ -7,37 +7,50 @@ package org.mozilla.fenix.settings.creditcards
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.concept.storage.CreditCard
import mozilla.components.support.test.robolectric.testContext
import mozilla.telemetry.glean.testing.GleanTestRule
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController
import org.junit.runner.RunWith
import org.mozilla.fenix.GleanMetrics.CreditCards
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.settings.creditcards.controller.CreditCardsManagementController
import org.mozilla.fenix.settings.creditcards.interactor.DefaultCreditCardsManagementInteractor
@RunWith(FenixRobolectricTestRunner::class)
class DefaultCreditCardsManagementInteractorTest {
@get:Rule
val gleanTestRule = GleanTestRule(testContext)
private val controller: CreditCardsManagementController = mockk(relaxed = true)
private val metrics: MetricController = mockk(relaxed = true)
private lateinit var interactor: DefaultCreditCardsManagementInteractor
@Before
fun setup() {
interactor = DefaultCreditCardsManagementInteractor(controller, metrics)
interactor = DefaultCreditCardsManagementInteractor(controller)
}
@Test
fun onSelectCreditCard() {
val creditCard: CreditCard = mockk(relaxed = true)
assertFalse(CreditCards.managementCardTapped.testHasValue())
interactor.onSelectCreditCard(creditCard)
verify { controller.handleCreditCardClicked(creditCard) }
verify { metrics.track(Event.CreditCardManagementCardTapped) }
assertTrue(CreditCards.managementCardTapped.testHasValue())
}
@Test
fun onClickAddCreditCard() {
assertFalse(CreditCards.managementAddTapped.testHasValue())
interactor.onAddCreditCardClick()
verify { controller.handleAddCreditCardClicked() }
verify { metrics.track(Event.CreditCardManagementAddTapped) }
assertTrue(CreditCards.managementAddTapped.testHasValue())
}
}

Loading…
Cancel
Save