/* This Source Code Form is subject to the terms of the Mozilla Public * 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/. */ package org.mozilla.fenix.components.metrics import android.content.Context import io.mockk.Runs import io.mockk.every import io.mockk.just import io.mockk.mockk import io.mockk.mockkStatic import io.mockk.spyk import io.mockk.verify import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runBlockingTest import org.junit.Test import org.mozilla.fenix.TestApplication import org.mozilla.fenix.ext.settings import org.mozilla.fenix.utils.Settings import org.robolectric.annotation.Config @ExperimentalCoroutinesApi @Config(application = TestApplication::class) internal class InstallationPingTest { @Test fun `checkAndSend() triggers the ping if it wasn't marked as triggered`() = runBlockingTest { val mockedContext: Context = mockk(relaxed = true) val mockedSettings: Settings = mockk(relaxed = true) mockkStatic("org.mozilla.fenix.ext.ContextKt") every { mockedContext.settings() } returns mockedSettings val mockAp = spyk(InstallationPing(mockedContext), recordPrivateCalls = true) every { mockAp.checkMetricsNotEmpty() } returns true every { mockAp.wasAlreadyTriggered() } returns false every { mockAp.markAsTriggered() } just Runs mockAp.checkAndSend() verify(exactly = 1) { mockAp.triggerPing() } // Marking the ping as triggered happens in a co-routine off the main thread, // so wait a bit for it. verify(exactly = 1) { mockAp.markAsTriggered() } } @Test fun `checkAndSend() doesn't trigger the ping again if it was marked as triggered`() { val mockAp = spyk(InstallationPing(mockk()), recordPrivateCalls = true) every { mockAp.wasAlreadyTriggered() } returns true mockAp.checkAndSend() verify(exactly = 0) { mockAp.triggerPing() } } }