You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
706 lines
31 KiB
Kotlin
706 lines
31 KiB
Kotlin
package org.mozilla.fenix.wallpapers
|
|
|
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
|
import io.mockk.Runs
|
|
import io.mockk.coEvery
|
|
import io.mockk.coVerify
|
|
import io.mockk.every
|
|
import io.mockk.just
|
|
import io.mockk.mockk
|
|
import io.mockk.runs
|
|
import io.mockk.slot
|
|
import io.mockk.verify
|
|
import kotlinx.coroutines.test.runTest
|
|
import mozilla.components.service.glean.testing.GleanTestRule
|
|
import mozilla.components.support.test.libstate.ext.waitUntilIdle
|
|
import mozilla.components.support.test.robolectric.testContext
|
|
import org.junit.Assert.assertEquals
|
|
import org.junit.Assert.assertFalse
|
|
import org.junit.Assert.assertTrue
|
|
import org.junit.Rule
|
|
import org.junit.Test
|
|
import org.junit.runner.RunWith
|
|
import org.mozilla.fenix.components.AppStore
|
|
import org.mozilla.fenix.components.appstate.AppAction
|
|
import org.mozilla.fenix.utils.Settings
|
|
import java.util.Calendar
|
|
import java.util.Date
|
|
import kotlin.random.Random
|
|
|
|
@RunWith(AndroidJUnit4::class)
|
|
class WallpapersUseCasesTest {
|
|
|
|
@get:Rule
|
|
val gleanTestRule = GleanTestRule(testContext)
|
|
|
|
// initialize this once, so it can be shared throughout tests
|
|
private val baseFakeDate = Date()
|
|
private val fakeCalendar = Calendar.getInstance()
|
|
|
|
private val appStore = AppStore()
|
|
private val mockSettings = mockk<Settings> {
|
|
every { currentWallpaperTextColor } returns 0L
|
|
every { currentWallpaperTextColor = any() } just Runs
|
|
every { currentWallpaperCardColor } returns 0L
|
|
every { currentWallpaperCardColor = any() } just Runs
|
|
every { shouldMigrateLegacyWallpaper } returns false
|
|
every { shouldMigrateLegacyWallpaper = any() } just Runs
|
|
}
|
|
private val mockLegacyDownloader = mockk<LegacyWallpaperDownloader>(relaxed = true)
|
|
private val mockLegacyFileManager = mockk<LegacyWallpaperFileManager> {
|
|
every { clean(any(), any()) } just runs
|
|
}
|
|
private val mockMigrationHelper = mockk<LegacyWallpaperMigration> {
|
|
coEvery { migrateLegacyWallpaper(any()) } just runs
|
|
}
|
|
|
|
private val mockMetadataFetcher = mockk<WallpaperMetadataFetcher>()
|
|
private val mockDownloader = mockk<WallpaperDownloader> {
|
|
coEvery { downloadWallpaper(any()) } returns mockk()
|
|
}
|
|
private val mockFileManager = mockk<WallpaperFileManager> {
|
|
coEvery { clean(any(), any()) } returns mockk()
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN legacy use case WHEN initializing THEN the default wallpaper is not downloaded`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockLegacyFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
|
|
WallpapersUseCases.LegacyInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockLegacyDownloader,
|
|
mockLegacyFileManager,
|
|
mockSettings,
|
|
"en-US",
|
|
possibleWallpapers = listOf(Wallpaper.Default) + fakeRemoteWallpapers,
|
|
).invoke()
|
|
|
|
appStore.waitUntilIdle()
|
|
coVerify(exactly = 0) { mockLegacyDownloader.downloadWallpaper(Wallpaper.Default) }
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN legacy use case WHEN initializing THEN default wallpaper is included in available wallpapers`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockLegacyFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
|
|
WallpapersUseCases.LegacyInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockLegacyDownloader,
|
|
mockLegacyFileManager,
|
|
mockSettings,
|
|
"en-US",
|
|
possibleWallpapers = listOf(Wallpaper.Default) + fakeRemoteWallpapers,
|
|
).invoke()
|
|
|
|
appStore.waitUntilIdle()
|
|
assertTrue(appStore.state.wallpaperState.availableWallpapers.contains(Wallpaper.Default))
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN legacy use case and wallpapers that expired WHEN invoking initialize use case THEN expired wallpapers are filtered out and cleaned up`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
val fakeExpiredRemoteWallpapers = listOf("expired").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.BEFORE, name)
|
|
}
|
|
val possibleWallpapers = fakeRemoteWallpapers + fakeExpiredRemoteWallpapers
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockLegacyFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
|
|
WallpapersUseCases.LegacyInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockLegacyDownloader,
|
|
mockLegacyFileManager,
|
|
mockSettings,
|
|
"en-US",
|
|
possibleWallpapers = possibleWallpapers,
|
|
).invoke()
|
|
|
|
val expectedFilteredWallpaper = fakeExpiredRemoteWallpapers[0]
|
|
appStore.waitUntilIdle()
|
|
assertFalse(appStore.state.wallpaperState.availableWallpapers.contains(expectedFilteredWallpaper))
|
|
verify { mockLegacyFileManager.clean(Wallpaper.Default, possibleWallpapers) }
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN leagacy use case and wallpapers that expired and an expired one is selected WHEN invoking initialize use case THEN selected wallpaper is not filtered out`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
val expiredWallpaper = makeFakeRemoteWallpaper(TimeRelation.BEFORE, "expired")
|
|
every { mockSettings.currentWallpaperName } returns expiredWallpaper.name
|
|
coEvery { mockLegacyFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
|
|
WallpapersUseCases.LegacyInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockLegacyDownloader,
|
|
mockLegacyFileManager,
|
|
mockSettings,
|
|
"en-US",
|
|
possibleWallpapers = fakeRemoteWallpapers + listOf(expiredWallpaper),
|
|
).invoke()
|
|
|
|
appStore.waitUntilIdle()
|
|
assertTrue(appStore.state.wallpaperState.availableWallpapers.contains(expiredWallpaper))
|
|
assertEquals(expiredWallpaper, appStore.state.wallpaperState.currentWallpaper)
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN legacy use case and wallpapers that are in promotions outside of locale WHEN invoking initialize use case THEN promotional wallpapers are filtered out`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
val locale = "en-CA"
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockLegacyFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
|
|
WallpapersUseCases.LegacyInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockLegacyDownloader,
|
|
mockLegacyFileManager,
|
|
mockSettings,
|
|
locale,
|
|
possibleWallpapers = fakeRemoteWallpapers,
|
|
).invoke()
|
|
|
|
appStore.waitUntilIdle()
|
|
assertTrue(appStore.state.wallpaperState.availableWallpapers.isEmpty())
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN legacy use case and available wallpapers WHEN invoking initialize use case THEN available wallpapers downloaded`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockLegacyFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
|
|
WallpapersUseCases.LegacyInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockLegacyDownloader,
|
|
mockLegacyFileManager,
|
|
mockSettings,
|
|
"en-US",
|
|
possibleWallpapers = fakeRemoteWallpapers,
|
|
).invoke()
|
|
|
|
for (fakeRemoteWallpaper in fakeRemoteWallpapers) {
|
|
coVerify { mockLegacyDownloader.downloadWallpaper(fakeRemoteWallpaper) }
|
|
}
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN legacy use case and a wallpaper has not been selected WHEN invoking initialize use case THEN store contains default`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockLegacyFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
|
|
WallpapersUseCases.LegacyInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockLegacyDownloader,
|
|
mockLegacyFileManager,
|
|
mockSettings,
|
|
"en-US",
|
|
possibleWallpapers = fakeRemoteWallpapers,
|
|
).invoke()
|
|
|
|
appStore.waitUntilIdle()
|
|
assertTrue(appStore.state.wallpaperState.currentWallpaper == Wallpaper.Default)
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN legacy use case a wallpaper is selected and there are available wallpapers WHEN invoking initialize use case THEN these are dispatched to the store`() = runTest {
|
|
val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected")
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
val possibleWallpapers = listOf(selectedWallpaper) + fakeRemoteWallpapers
|
|
every { mockSettings.currentWallpaperName } returns selectedWallpaper.name
|
|
coEvery { mockLegacyFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
|
|
WallpapersUseCases.LegacyInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockLegacyDownloader,
|
|
mockLegacyFileManager,
|
|
mockSettings,
|
|
"en-US",
|
|
possibleWallpapers = possibleWallpapers,
|
|
).invoke()
|
|
|
|
appStore.waitUntilIdle()
|
|
assertEquals(selectedWallpaper, appStore.state.wallpaperState.currentWallpaper)
|
|
assertEquals(possibleWallpapers, appStore.state.wallpaperState.availableWallpapers)
|
|
}
|
|
|
|
@Test
|
|
fun `WHEN initializing THEN the default wallpaper is not downloaded`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
coEvery { mockMetadataFetcher.downloadWallpaperList() } returns fakeRemoteWallpapers
|
|
coEvery { mockDownloader.downloadThumbnail(any()) } returns Wallpaper.ImageFileState.Downloaded
|
|
|
|
WallpapersUseCases.DefaultInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockDownloader,
|
|
mockFileManager,
|
|
mockMetadataFetcher,
|
|
mockMigrationHelper,
|
|
mockSettings,
|
|
"en-US",
|
|
).invoke()
|
|
|
|
appStore.waitUntilIdle()
|
|
coVerify(exactly = 0) { mockDownloader.downloadWallpaper(Wallpaper.Default) }
|
|
}
|
|
|
|
@Test
|
|
fun `WHEN initializing THEN default wallpaper is included in available wallpapers`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
coEvery { mockMetadataFetcher.downloadWallpaperList() } returns fakeRemoteWallpapers
|
|
coEvery { mockDownloader.downloadThumbnail(any()) } returns Wallpaper.ImageFileState.Downloaded
|
|
|
|
WallpapersUseCases.DefaultInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockDownloader,
|
|
mockFileManager,
|
|
mockMetadataFetcher,
|
|
mockMigrationHelper,
|
|
mockSettings,
|
|
"en-US",
|
|
).invoke()
|
|
|
|
appStore.waitUntilIdle()
|
|
assertTrue(appStore.state.wallpaperState.availableWallpapers.contains(Wallpaper.Default))
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN wallpapers that expired WHEN invoking initialize use case THEN expired wallpapers are filtered out and cleaned up`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
val fakeExpiredRemoteWallpapers = listOf("expired").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.BEFORE, name)
|
|
}
|
|
val possibleWallpapers = fakeRemoteWallpapers + fakeExpiredRemoteWallpapers
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
coEvery { mockMetadataFetcher.downloadWallpaperList() } returns possibleWallpapers
|
|
coEvery { mockDownloader.downloadThumbnail(any()) } returns Wallpaper.ImageFileState.Downloaded
|
|
|
|
WallpapersUseCases.DefaultInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockDownloader,
|
|
mockFileManager,
|
|
mockMetadataFetcher,
|
|
mockMigrationHelper,
|
|
mockSettings,
|
|
"en-US",
|
|
).invoke()
|
|
|
|
val expectedFilteredWallpaper = fakeExpiredRemoteWallpapers[0]
|
|
appStore.waitUntilIdle()
|
|
assertFalse(appStore.state.wallpaperState.availableWallpapers.contains(expectedFilteredWallpaper))
|
|
coVerify { mockFileManager.clean(Wallpaper.Default, fakeRemoteWallpapers) }
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN wallpapers that expired and an expired one is selected WHEN invoking initialize use case THEN selected wallpaper is not filtered out`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
val expiredWallpaper = makeFakeRemoteWallpaper(TimeRelation.BEFORE, "expired")
|
|
val allWallpapers = listOf(expiredWallpaper) + fakeRemoteWallpapers
|
|
every { mockSettings.currentWallpaperName } returns "expired"
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns expiredWallpaper
|
|
coEvery { mockMetadataFetcher.downloadWallpaperList() } returns allWallpapers
|
|
coEvery { mockDownloader.downloadThumbnail(any()) } returns Wallpaper.ImageFileState.Downloaded
|
|
|
|
WallpapersUseCases.DefaultInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockDownloader,
|
|
mockFileManager,
|
|
mockMetadataFetcher,
|
|
mockMigrationHelper,
|
|
mockSettings,
|
|
"en-US",
|
|
).invoke()
|
|
|
|
val expectedWallpaper = expiredWallpaper.copy(
|
|
thumbnailFileState = Wallpaper.ImageFileState.Downloaded,
|
|
)
|
|
appStore.waitUntilIdle()
|
|
assertTrue(appStore.state.wallpaperState.availableWallpapers.contains(expectedWallpaper))
|
|
assertEquals(expiredWallpaper, appStore.state.wallpaperState.currentWallpaper)
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN wallpapers that are in promotions outside of locale WHEN invoking initialize use case THEN promotional wallpapers are filtered out`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
val locale = "en-CA"
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
coEvery { mockMetadataFetcher.downloadWallpaperList() } returns fakeRemoteWallpapers
|
|
|
|
WallpapersUseCases.DefaultInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockDownloader,
|
|
mockFileManager,
|
|
mockMetadataFetcher,
|
|
mockMigrationHelper,
|
|
mockSettings,
|
|
locale,
|
|
).invoke()
|
|
|
|
appStore.waitUntilIdle()
|
|
assertEquals(1, appStore.state.wallpaperState.availableWallpapers.size)
|
|
assertEquals(Wallpaper.Default, appStore.state.wallpaperState.availableWallpapers[0])
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN available wallpapers WHEN invoking initialize use case THEN available wallpaper thumbnails downloaded`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
coEvery { mockMetadataFetcher.downloadWallpaperList() } returns fakeRemoteWallpapers
|
|
coEvery { mockDownloader.downloadThumbnail(any()) } returns Wallpaper.ImageFileState.Downloaded
|
|
|
|
WallpapersUseCases.DefaultInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockDownloader,
|
|
mockFileManager,
|
|
mockMetadataFetcher,
|
|
mockMigrationHelper,
|
|
mockSettings,
|
|
"en-US",
|
|
).invoke()
|
|
|
|
for (fakeRemoteWallpaper in fakeRemoteWallpapers) {
|
|
coVerify { mockDownloader.downloadThumbnail(fakeRemoteWallpaper) }
|
|
}
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN available wallpapers WHEN invoking initialize use case THEN thumbnails downloaded and the store state is updated to reflect that`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
coEvery { mockMetadataFetcher.downloadWallpaperList() } returns fakeRemoteWallpapers
|
|
coEvery { mockDownloader.downloadThumbnail(any()) } returns Wallpaper.ImageFileState.Downloaded
|
|
|
|
WallpapersUseCases.DefaultInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockDownloader,
|
|
mockFileManager,
|
|
mockMetadataFetcher,
|
|
mockMigrationHelper,
|
|
mockSettings,
|
|
"en-US",
|
|
).invoke()
|
|
|
|
for (fakeRemoteWallpaper in fakeRemoteWallpapers) {
|
|
coVerify { mockDownloader.downloadThumbnail(fakeRemoteWallpaper) }
|
|
}
|
|
appStore.waitUntilIdle()
|
|
assertTrue(
|
|
appStore.state.wallpaperState.availableWallpapers.all {
|
|
it.thumbnailFileState == Wallpaper.ImageFileState.Downloaded
|
|
},
|
|
)
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN thumbnail download fails WHEN invoking initialize use case THEN the store state is updated to reflect that`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
val failedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "failed")
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
coEvery { mockMetadataFetcher.downloadWallpaperList() } returns listOf(failedWallpaper) + fakeRemoteWallpapers
|
|
coEvery { mockDownloader.downloadThumbnail(any()) } returns Wallpaper.ImageFileState.Downloaded
|
|
coEvery { mockDownloader.downloadThumbnail(failedWallpaper) } returns Wallpaper.ImageFileState.Error
|
|
|
|
WallpapersUseCases.DefaultInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockDownloader,
|
|
mockFileManager,
|
|
mockMetadataFetcher,
|
|
mockMigrationHelper,
|
|
mockSettings,
|
|
"en-US",
|
|
).invoke()
|
|
|
|
val expectedWallpaper = failedWallpaper.copy(thumbnailFileState = Wallpaper.ImageFileState.Error)
|
|
appStore.waitUntilIdle()
|
|
assertTrue(appStore.state.wallpaperState.availableWallpapers.contains(expectedWallpaper))
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN a wallpaper has not been selected WHEN invoking initialize use case THEN store contains default`() = runTest {
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
coEvery { mockMetadataFetcher.downloadWallpaperList() } returns fakeRemoteWallpapers
|
|
coEvery { mockDownloader.downloadThumbnail(any()) } returns Wallpaper.ImageFileState.Downloaded
|
|
|
|
WallpapersUseCases.DefaultInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockDownloader,
|
|
mockFileManager,
|
|
mockMetadataFetcher,
|
|
mockMigrationHelper,
|
|
mockSettings,
|
|
"en-US",
|
|
).invoke()
|
|
|
|
appStore.waitUntilIdle()
|
|
assertTrue(appStore.state.wallpaperState.currentWallpaper == Wallpaper.Default)
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN a wallpaper is selected and there are available wallpapers WHEN invoking initialize use case THEN these are dispatched to the store`() = runTest {
|
|
val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected")
|
|
val fakeRemoteWallpapers = listOf("first", "second", "third").map { name ->
|
|
makeFakeRemoteWallpaper(TimeRelation.LATER, name)
|
|
}
|
|
val possibleWallpapers = listOf(selectedWallpaper) + fakeRemoteWallpapers
|
|
every { mockSettings.currentWallpaperName } returns selectedWallpaper.name
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
coEvery { mockMetadataFetcher.downloadWallpaperList() } returns possibleWallpapers
|
|
coEvery { mockDownloader.downloadThumbnail(any()) } returns Wallpaper.ImageFileState.Downloaded
|
|
|
|
WallpapersUseCases.DefaultInitializeWallpaperUseCase(
|
|
appStore,
|
|
mockDownloader,
|
|
mockFileManager,
|
|
mockMetadataFetcher,
|
|
mockMigrationHelper,
|
|
mockSettings,
|
|
"en-US",
|
|
).invoke()
|
|
|
|
val expectedWallpapers = (listOf(Wallpaper.Default) + possibleWallpapers).map {
|
|
it.copy(thumbnailFileState = Wallpaper.ImageFileState.Downloaded)
|
|
}
|
|
appStore.waitUntilIdle()
|
|
assertEquals(selectedWallpaper, appStore.state.wallpaperState.currentWallpaper)
|
|
assertEquals(expectedWallpapers, appStore.state.wallpaperState.availableWallpapers)
|
|
}
|
|
|
|
@Test
|
|
fun `WHEN legacy selected wallpaper usecase invoked THEN storage updated and store receives dispatch`() = runTest {
|
|
val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected")
|
|
every { mockSettings.currentWallpaperName = any() } just Runs
|
|
|
|
val wallpaperFileState = WallpapersUseCases.LegacySelectWallpaperUseCase(
|
|
mockSettings,
|
|
appStore,
|
|
).invoke(selectedWallpaper)
|
|
|
|
appStore.waitUntilIdle()
|
|
|
|
verify { mockSettings.currentWallpaperName = selectedWallpaper.name }
|
|
verify { mockSettings.currentWallpaperTextColor = selectedWallpaper.textColor!! }
|
|
verify { mockSettings.currentWallpaperCardColor = selectedWallpaper.cardColor!! }
|
|
assertEquals(selectedWallpaper, appStore.state.wallpaperState.currentWallpaper)
|
|
assertEquals(wallpaperFileState, Wallpaper.ImageFileState.Downloaded)
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN wallpaper downloaded WHEN selecting a wallpaper THEN storage updated and store receives dispatch`() = runTest {
|
|
val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected")
|
|
val slot = slot<String>()
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
every { mockSettings.currentWallpaperName = capture(slot) } just runs
|
|
coEvery { mockFileManager.wallpaperImagesExist(selectedWallpaper) } returns true
|
|
|
|
val wallpaperFileState = WallpapersUseCases.DefaultSelectWallpaperUseCase(
|
|
mockSettings,
|
|
appStore,
|
|
mockFileManager,
|
|
mockDownloader,
|
|
).invoke(selectedWallpaper)
|
|
|
|
appStore.waitUntilIdle()
|
|
assertEquals(selectedWallpaper.name, slot.captured)
|
|
assertEquals(selectedWallpaper, appStore.state.wallpaperState.currentWallpaper)
|
|
assertEquals(wallpaperFileState, Wallpaper.ImageFileState.Downloaded)
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN wallpaper is not downloaded WHEN selecting a wallpaper and download succeeds THEN storage updated and store receives dispatch`() = runTest {
|
|
val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected")
|
|
val slot = slot<String>()
|
|
val mockStore = mockk<AppStore>(relaxed = true)
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
every { mockSettings.currentWallpaperName = capture(slot) } just runs
|
|
coEvery { mockFileManager.wallpaperImagesExist(selectedWallpaper) } returns false
|
|
coEvery { mockDownloader.downloadWallpaper(selectedWallpaper) } returns Wallpaper.ImageFileState.Downloaded
|
|
|
|
val wallpaperFileState = WallpapersUseCases.DefaultSelectWallpaperUseCase(
|
|
mockSettings,
|
|
mockStore,
|
|
mockFileManager,
|
|
mockDownloader,
|
|
).invoke(selectedWallpaper)
|
|
|
|
verify { mockStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(selectedWallpaper, Wallpaper.ImageFileState.Downloading)) }
|
|
verify { mockStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(selectedWallpaper, Wallpaper.ImageFileState.Downloaded)) }
|
|
verify { mockStore.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(selectedWallpaper)) }
|
|
assertEquals(wallpaperFileState, Wallpaper.ImageFileState.Downloaded)
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN wallpaper is not downloaded WHEN selecting a wallpaper and any download fails THEN wallpaper not set and store receives dispatch`() = runTest {
|
|
val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected")
|
|
val slot = slot<String>()
|
|
val mockStore = mockk<AppStore>(relaxed = true)
|
|
coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null
|
|
every { mockSettings.currentWallpaperName } returns ""
|
|
every { mockSettings.currentWallpaperName = capture(slot) } just runs
|
|
coEvery { mockFileManager.wallpaperImagesExist(selectedWallpaper) } returns false
|
|
coEvery { mockDownloader.downloadWallpaper(selectedWallpaper) } returns Wallpaper.ImageFileState.Error
|
|
|
|
val wallpaperFileState = WallpapersUseCases.DefaultSelectWallpaperUseCase(
|
|
mockSettings,
|
|
mockStore,
|
|
mockFileManager,
|
|
mockDownloader,
|
|
).invoke(selectedWallpaper)
|
|
|
|
verify { mockStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(selectedWallpaper, Wallpaper.ImageFileState.Downloading)) }
|
|
verify { mockStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(selectedWallpaper, Wallpaper.ImageFileState.Error)) }
|
|
assertEquals(wallpaperFileState, Wallpaper.ImageFileState.Error)
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN a wallpaper with no text color WHEN it is is selected THEN persist the wallpaper name and missing text color and dispatch the update`() {
|
|
every { mockSettings.currentWallpaperName = any() } just Runs
|
|
val store = mockk<AppStore>(relaxed = true)
|
|
val wallpaperFileState = WallpapersUseCases.DefaultSelectWallpaperUseCase(
|
|
settings = mockSettings,
|
|
store = store,
|
|
fileManager = mockk(),
|
|
downloader = mockk(),
|
|
)
|
|
val wallpaper: Wallpaper = mockk {
|
|
every { name } returns "Test"
|
|
every { textColor } returns null
|
|
}
|
|
|
|
wallpaperFileState.selectWallpaper(wallpaper)
|
|
|
|
verify { mockSettings.currentWallpaperName = "Test" }
|
|
verify { mockSettings.currentWallpaperTextColor = 0L }
|
|
verify { store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) }
|
|
}
|
|
|
|
@Test
|
|
fun `GIVEN a wallpaper with available text color WHEN it is is selected THEN persist the wallpaper name and text color and dispatch the update`() {
|
|
every { mockSettings.currentWallpaperName = any() } just Runs
|
|
val store = mockk<AppStore>(relaxed = true)
|
|
val wallpaperFileState = WallpapersUseCases.DefaultSelectWallpaperUseCase(
|
|
settings = mockSettings,
|
|
store = store,
|
|
fileManager = mockk(),
|
|
downloader = mockk(),
|
|
)
|
|
val wallpaper: Wallpaper = mockk {
|
|
every { name } returns "Test"
|
|
every { textColor } returns 321L
|
|
}
|
|
|
|
wallpaperFileState.selectWallpaper(wallpaper)
|
|
|
|
verify { mockSettings.currentWallpaperName = "Test" }
|
|
verify { mockSettings.currentWallpaperTextColor = 321L }
|
|
verify { store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) }
|
|
}
|
|
|
|
private enum class TimeRelation {
|
|
BEFORE,
|
|
NOW,
|
|
LATER,
|
|
}
|
|
|
|
/**
|
|
* [timeRelation] should specify a time relative to the time the tests are run
|
|
*/
|
|
private fun makeFakeRemoteWallpaper(
|
|
timeRelation: TimeRelation,
|
|
name: String = "name",
|
|
isInPromo: Boolean = true,
|
|
): Wallpaper {
|
|
fakeCalendar.time = baseFakeDate
|
|
when (timeRelation) {
|
|
TimeRelation.BEFORE -> fakeCalendar.add(Calendar.DATE, -5)
|
|
TimeRelation.NOW -> Unit
|
|
TimeRelation.LATER -> fakeCalendar.add(Calendar.DATE, 5)
|
|
}
|
|
val relativeTime = fakeCalendar.time
|
|
return if (isInPromo) {
|
|
Wallpaper(
|
|
name = name,
|
|
collection = Wallpaper.Collection(
|
|
name = Wallpaper.firefoxCollectionName,
|
|
heading = null,
|
|
description = null,
|
|
availableLocales = listOf("en-US"),
|
|
startDate = null,
|
|
endDate = relativeTime,
|
|
learnMoreUrl = null,
|
|
),
|
|
textColor = Random.nextLong(),
|
|
cardColor = Random.nextLong(),
|
|
thumbnailFileState = Wallpaper.ImageFileState.Unavailable,
|
|
assetsFileState = Wallpaper.ImageFileState.Unavailable,
|
|
)
|
|
} else {
|
|
Wallpaper(
|
|
name = name,
|
|
collection = Wallpaper.Collection(
|
|
name = Wallpaper.firefoxCollectionName,
|
|
heading = null,
|
|
description = null,
|
|
availableLocales = null,
|
|
startDate = null,
|
|
endDate = relativeTime,
|
|
learnMoreUrl = null,
|
|
),
|
|
textColor = Random.nextLong(),
|
|
cardColor = Random.nextLong(),
|
|
thumbnailFileState = Wallpaper.ImageFileState.Unavailable,
|
|
assetsFileState = Wallpaper.ImageFileState.Unavailable,
|
|
)
|
|
}
|
|
}
|
|
}
|