commit 61617ef6966cba6f24070b026f38866f27c49706
parent 2c518d40a8da389566b749fb397430f43b54eb58
Author: mcarare <48995920+mcarare@users.noreply.github.com>
Date: Mon, 29 Dec 2025 16:55:14 +0000
Bug 2007521 - Update MessagingMiddlewareTest to use modern coroutine testing APIs. r=android-reviewers,rebecatudor273
Differential Revision: https://phabricator.services.mozilla.com/D277421
Diffstat:
1 file changed, 50 insertions(+), 48 deletions(-)
diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/messaging/state/MessagingMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/messaging/state/MessagingMiddlewareTest.kt
@@ -9,19 +9,15 @@ import io.mockk.coVerify
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.advanceUntilIdle
+import kotlinx.coroutines.test.runTest
import mozilla.components.service.nimbus.messaging.Message
import mozilla.components.service.nimbus.messaging.MessageData
import mozilla.components.service.nimbus.messaging.NimbusMessagingController
import mozilla.components.service.nimbus.messaging.StyleData
-import mozilla.components.support.test.rule.MainCoroutineRule
-import mozilla.components.support.test.rule.runTestOnMain
import org.junit.Assert.assertEquals
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.AppStore
import org.mozilla.fenix.components.appstate.AppAction
@@ -37,9 +33,6 @@ import org.mozilla.fenix.messaging.MessagingState
import org.mozilla.fenix.utils.Settings
class MessagingMiddlewareTest {
- @get:Rule
- val coroutinesTestRule = MainCoroutineRule()
- private val coroutineScope = coroutinesTestRule.scope
private lateinit var controller: NimbusMessagingController
private lateinit var settings: Settings
@@ -49,9 +42,8 @@ class MessagingMiddlewareTest {
settings = mockk(relaxed = true)
}
- @OptIn(ExperimentalCoroutinesApi::class) // advanceUntilIdle
@Test
- fun `WHEN restored THEN get messages from the storage`() = runTestOnMain {
+ fun `WHEN restored THEN get messages from the storage`() = runTest {
val store = AppStore(
AppState(
messaging = MessagingState(
@@ -59,7 +51,7 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
val message = createMessage()
@@ -67,13 +59,13 @@ class MessagingMiddlewareTest {
coEvery { controller.getMessages() } returns listOf(message)
store.dispatch(Restore)
- coroutineScope.advanceUntilIdle()
+ testScheduler.advanceUntilIdle()
assertEquals(listOf(message), store.state.messaging.messages)
}
@Test
- fun `WHEN Evaluate THEN getNextMessage from the storage and UpdateMessageToShow`() = runTestOnMain {
+ fun `WHEN Evaluate THEN getNextMessage from the storage and UpdateMessageToShow`() = runTest {
val message = createMessage()
val store = AppStore(
AppState(
@@ -84,7 +76,7 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
@@ -104,7 +96,7 @@ class MessagingMiddlewareTest {
}
@Test
- fun `WHEN MessageClicked THEN update storage`() = runTestOnMain {
+ fun `WHEN MessageClicked THEN update storage`() = runTest {
val message = createMessage()
val store = AppStore(
AppState(
@@ -113,13 +105,14 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
assertEquals(message, store.state.messaging.messages.first())
store.dispatch(MessageClicked(message))
+ testScheduler.advanceUntilIdle()
assertTrue(store.state.messaging.messages.isEmpty())
coVerify { controller.onMessageClicked(message = message) }
@@ -127,7 +120,7 @@ class MessagingMiddlewareTest {
@Test
fun `GVIEN a microsurvey WHEN Started THEN only notify the controller`() =
- runTestOnMain {
+ runTest {
val message = createMessage(data = mockk<MessageData>(relaxed = true))
val store = AppStore(
AppState(
@@ -137,20 +130,21 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
assertEquals(message, store.state.messaging.messages.first())
store.dispatch(MicrosurveyAction.Started(message.id))
+ testScheduler.advanceUntilIdle()
assertFalse(store.state.messaging.messages.isEmpty())
coVerify { controller.onMicrosurveyStarted(id = message.id) }
}
@Test
- fun `WHEN MessageDismissed THEN update storage`() = runTestOnMain {
+ fun `WHEN MessageDismissed THEN update storage`() = runTest {
val metadata = createMetadata(displayCount = 1, "same-id")
val message = createMessage(metadata)
val store = AppStore(
@@ -160,17 +154,18 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
store.dispatch(MessageDismissed(message))
+ testScheduler.advanceUntilIdle()
assertTrue(store.state.messaging.messages.isEmpty())
coVerify { controller.onMessageDismissed(message = message) }
}
@Test
- fun `WHEN onMicrosurveyDismissed THEN update storage`() = runTestOnMain {
+ fun `WHEN onMicrosurveyDismissed THEN update storage`() = runTest {
val metadata = createMetadata(displayCount = 1, "same-id")
val message = createMessage(metadata)
val store = AppStore(
@@ -180,10 +175,11 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
store.dispatch(Dismissed(message.id))
+ testScheduler.advanceUntilIdle()
assertTrue(store.state.messaging.messages.isEmpty())
coVerify { controller.onMicrosurveyDismissed(message = message) }
@@ -191,7 +187,7 @@ class MessagingMiddlewareTest {
@Test
fun `GIVEN a microsurvey WHEN onMicrosurveyShown THEN only notify the controller`() =
- runTestOnMain {
+ runTest {
val message = createMessage()
val store = AppStore(
AppState(
@@ -201,13 +197,14 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
assertEquals(message, store.state.messaging.messages.first())
store.dispatch(AppAction.MessagingAction.MicrosurveyAction.Shown(message.id))
+ testScheduler.advanceUntilIdle()
assertFalse(store.state.messaging.messages.isEmpty())
coVerify { controller.onMicrosurveyShown(id = message.id) }
@@ -215,7 +212,7 @@ class MessagingMiddlewareTest {
@Test
fun `GVIEN a microsurvey WHEN onMicrosurveyConfirmationShown THEN only notify the controller`() =
- runTestOnMain {
+ runTest {
val message = createMessage()
val store = AppStore(
AppState(
@@ -225,13 +222,14 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
assertEquals(message, store.state.messaging.messages.first())
store.dispatch(AppAction.MessagingAction.MicrosurveyAction.SentConfirmationShown(message.id))
+ testScheduler.advanceUntilIdle()
assertFalse(store.state.messaging.messages.isEmpty())
coVerify { controller.onMicrosurveySentConfirmationShown(id = message.id) }
@@ -239,7 +237,7 @@ class MessagingMiddlewareTest {
@Test
fun `GVIEN a microsurvey WHEN onPrivacyNoticeTapped THEN only notify the controller`() =
- runTestOnMain {
+ runTest {
val message = createMessage()
val store = AppStore(
AppState(
@@ -249,20 +247,21 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
assertEquals(message, store.state.messaging.messages.first())
store.dispatch(AppAction.MessagingAction.MicrosurveyAction.OnPrivacyNoticeTapped(message.id))
+ testScheduler.advanceUntilIdle()
assertFalse(store.state.messaging.messages.isEmpty())
coVerify { controller.onMicrosurveyPrivacyNoticeTapped(id = message.id) }
}
@Test
- fun `WHEN onMessageDismissed THEN remove the message from storage and state`() = runTestOnMain {
+ fun `WHEN onMessageDismissed THEN remove the message from storage and state`() = runTest {
val message = createMessage(createMetadata(displayCount = 1))
val store = AppStore(
AppState(
@@ -274,7 +273,7 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
@@ -287,7 +286,7 @@ class MessagingMiddlewareTest {
}
@Test
- fun `WHEN onMicrosurveyDismissed THEN remove the message from storage and state`() = runTestOnMain {
+ fun `WHEN onMicrosurveyDismissed THEN remove the message from storage and state`() = runTest {
val message = createMessage(createMetadata(displayCount = 1))
val store = AppStore(
AppState(
@@ -299,7 +298,7 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
@@ -312,7 +311,7 @@ class MessagingMiddlewareTest {
}
@Test
- fun `WHEN consumeMessageToShowIfNeeded THEN consume the message`() = runTestOnMain {
+ fun `WHEN consumeMessageToShowIfNeeded THEN consume the message`() = runTest {
val message = createMessage()
val store = AppStore(
AppState(
@@ -324,7 +323,7 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
@@ -335,7 +334,7 @@ class MessagingMiddlewareTest {
}
@Test
- fun `WHEN updateMessage THEN update available messages`() = runTestOnMain {
+ fun `WHEN updateMessage THEN update available messages`() = runTest {
val message = createMessage()
val messageDisplayed = message.copy(metadata = createMetadata(displayCount = 1))
val store = AppStore(
@@ -347,7 +346,7 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
@@ -363,13 +362,14 @@ class MessagingMiddlewareTest {
} returns messageDisplayed
store.dispatch(Evaluate(FenixMessageSurfaceId.HOMESCREEN))
+ testScheduler.advanceUntilIdle()
assertEquals(1, store.state.messaging.messages.count())
assertEquals(1, store.state.messaging.messages.first().displayCount)
}
@Test
- fun `WHEN evaluate THEN update displayCount without altering message order`() = runTestOnMain {
+ fun `WHEN evaluate THEN update displayCount without altering message order`() = runTest {
val message1 = createMessage()
val message2 = message1.copy(id = "message2", action = "action2")
// An updated message1 that has been displayed once.
@@ -384,7 +384,7 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
@@ -403,13 +403,14 @@ class MessagingMiddlewareTest {
} returns messageDisplayed1
store.dispatch(Evaluate(FenixMessageSurfaceId.HOMESCREEN))
+ testScheduler.advanceUntilIdle()
assertEquals(messageDisplayed1, store.state.messaging.messages[0])
assertEquals(message2, store.state.messaging.messages[1])
}
@Test
- fun `GIVEN a message has not surpassed the maxDisplayCount WHEN evaluate THEN update the message displayCount`() = runTestOnMain {
+ fun `GIVEN a message has not surpassed the maxDisplayCount WHEN evaluate THEN update the message displayCount`() = runTest {
val message = createMessage()
// An updated message that has been displayed once.
val messageDisplayed = incrementDisplayCount(message)
@@ -422,7 +423,7 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
@@ -441,6 +442,7 @@ class MessagingMiddlewareTest {
} returns messageDisplayed
store.dispatch(Evaluate(FenixMessageSurfaceId.HOMESCREEN))
+ testScheduler.advanceUntilIdle()
assertEquals(messageDisplayed.displayCount, store.state.messaging.messages[0].displayCount)
assertEquals(1, store.state.messaging.messages.size)
@@ -448,7 +450,7 @@ class MessagingMiddlewareTest {
}
@Test
- fun `GIVEN a message has reached the maxDisplayCount WHEN onMessagedDisplayed THEN remove the message`() = runTestOnMain {
+ fun `GIVEN a message has reached the maxDisplayCount WHEN onMessagedDisplayed THEN remove the message`() = runTest {
val message = createMessage(createMetadata(displayCount = 4))
val messageDisplayed = createMessage(createMetadata(displayCount = 5))
assertFalse(message.isExpired)
@@ -464,7 +466,7 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)
@@ -483,20 +485,19 @@ class MessagingMiddlewareTest {
} returns messageDisplayed
store.dispatch(Evaluate(FenixMessageSurfaceId.HOMESCREEN))
+ testScheduler.advanceUntilIdle()
assertEquals(0, store.state.messaging.messages.size)
assertEquals(1, store.state.messaging.messageToShow.size)
}
@Test
- fun `GIVEN a microsurvey message that surpassed the maxDisplayCount WHEN onMessagedDisplayed THEN remove the message, consume it & reset the pref`() = runTestOnMain {
+ fun `GIVEN a microsurvey message that surpassed the maxDisplayCount WHEN onMessagedDisplayed THEN remove the message, consume it & reset the pref`() = runTest {
val message = createMessage(metadata = createMetadata(displayCount = 4), data = MessageData(surface = "microsurvey"))
val messageDisplayed = createMessage(createMetadata(displayCount = 5), data = MessageData(surface = "microsurvey"))
assertFalse(message.isExpired)
assertTrue(messageDisplayed.isExpired)
- settings.shouldShowMicrosurveyPrompt = true
- verify { settings.shouldShowMicrosurveyPrompt = true }
val store = AppStore(
AppState(
@@ -505,7 +506,7 @@ class MessagingMiddlewareTest {
messageToShow = mapOf(message.surface to message),
),
),
- listOf(MessagingMiddleware(controller, settings, coroutineScope)),
+ listOf(MessagingMiddleware(controller, settings, this)),
)
every { controller.getNextMessage(FenixMessageSurfaceId.MICROSURVEY, any()) } returns message
@@ -515,6 +516,7 @@ class MessagingMiddlewareTest {
coEvery { controller.onMessageDisplayed(eq(message), any()) } returns messageDisplayed
store.dispatch(Evaluate(FenixMessageSurfaceId.MICROSURVEY))
+ testScheduler.advanceUntilIdle()
verify { settings.shouldShowMicrosurveyPrompt = false }
assertEquals(0, store.state.messaging.messages.size)
@@ -522,7 +524,7 @@ class MessagingMiddlewareTest {
}
@Test
- fun `GIVEN message is not found WHEN updateMessage THEN do not update the message list`() = runTestOnMain {
+ fun `GIVEN message is not found WHEN updateMessage THEN do not update the message list`() = runTest {
val message = createMessage(messageId = "1")
val message2 = createMessage(messageId = "2")
val store = AppStore(
@@ -534,7 +536,7 @@ class MessagingMiddlewareTest {
),
),
listOf(
- MessagingMiddleware(controller, settings, coroutineScope),
+ MessagingMiddleware(controller, settings, this),
),
)