diff --git a/holder/build.gradle b/holder/build.gradle index c99cc9e0e..2067b7a5c 100644 --- a/holder/build.gradle +++ b/holder/build.gradle @@ -7,7 +7,7 @@ plugins { } def appVersionCode = System.getenv("GITHUB_RUN_NUMBER") != null ? System.getenv("GITHUB_RUN_NUMBER").toInteger() : 1000000 -version = "2.4" +version = "2.3.2" archivesBaseName = "holder-v${version}-${appVersionCode}" android { diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/models/DashboardItems.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/models/DashboardItems.kt new file mode 100644 index 000000000..1b2c9540e --- /dev/null +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/models/DashboardItems.kt @@ -0,0 +1,6 @@ +package nl.rijksoverheid.ctr.holder.ui.create_qr.models + +data class DashboardItems( + val domesticItems: List, + val internationalItems: List +) \ No newline at end of file diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/usecases/GetDashboardItemsUseCase.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/usecases/GetDashboardItemsUseCase.kt index 52fc4448c..1b79d00f7 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/usecases/GetDashboardItemsUseCase.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/usecases/GetDashboardItemsUseCase.kt @@ -5,19 +5,15 @@ import nl.rijksoverheid.ctr.holder.persistence.database.DatabaseSyncerResult import nl.rijksoverheid.ctr.holder.persistence.database.entities.GreenCardType import nl.rijksoverheid.ctr.holder.persistence.database.models.GreenCard import nl.rijksoverheid.ctr.holder.ui.create_qr.models.DashboardItem +import nl.rijksoverheid.ctr.holder.ui.create_qr.models.DashboardItems import nl.rijksoverheid.ctr.holder.ui.create_qr.util.* interface GetDashboardItemsUseCase { - suspend fun getDomesticItems( + suspend fun getItems( allGreenCards: List, databaseSyncerResult: DatabaseSyncerResult = DatabaseSyncerResult.Success, - isLoadingNewCredentials: Boolean - ): List - suspend fun getInternationalItems( - allGreenCards: List, - databaseSyncerResult: DatabaseSyncerResult = DatabaseSyncerResult.Success, - isLoadingNewCredentials: Boolean - ): List + isLoadingNewCredentials: Boolean, + ): DashboardItems } class GetDashboardItemsUseCaseImpl( @@ -26,8 +22,26 @@ class GetDashboardItemsUseCaseImpl( private val originUtil: OriginUtil, private val dashboardItemUtil: DashboardItemUtil, ): GetDashboardItemsUseCase { + override suspend fun getItems( + allGreenCards: List, + databaseSyncerResult: DatabaseSyncerResult, + isLoadingNewCredentials: Boolean + ): DashboardItems { + return DashboardItems( + domesticItems = getDomesticItems( + allGreenCards = allGreenCards, + databaseSyncerResult = databaseSyncerResult, + isLoadingNewCredentials = isLoadingNewCredentials + ), + internationalItems = getInternationalItems( + allGreenCards = allGreenCards, + databaseSyncerResult = databaseSyncerResult, + isLoadingNewCredentials = isLoadingNewCredentials + ) + ) + } - override suspend fun getDomesticItems( + private fun getDomesticItems( allGreenCards: List, databaseSyncerResult: DatabaseSyncerResult, isLoadingNewCredentials: Boolean, @@ -36,12 +50,6 @@ class GetDashboardItemsUseCaseImpl( val domesticGreenCards = allGreenCards.filter { it.greenCardEntity.type == GreenCardType.Domestic } val internationalGreenCards = allGreenCards.filter { it.greenCardEntity.type == GreenCardType.Eu } - if (dashboardItemUtil.shouldShowPlaceholderItem(allGreenCards)) { - dashboardItems.add(DashboardItem.PlaceholderCardItem( - greenCardType = GreenCardType.Domestic - )) - } - if (dashboardItemUtil.shouldShowHeaderItem(allGreenCards)) { dashboardItems.add(DashboardItem.HeaderItem( text = R.string.my_overview_description @@ -62,6 +70,12 @@ class GetDashboardItemsUseCaseImpl( ) ) + if (dashboardItemUtil.shouldShowPlaceholderItem(allGreenCards)) { + dashboardItems.add(DashboardItem.PlaceholderCardItem( + greenCardType = GreenCardType.Domestic + )) + } + dashboardItems.add( DashboardItem.AddQrButtonItem(dashboardItemUtil.shouldAddQrButtonItem(allGreenCards)) ) @@ -69,7 +83,7 @@ class GetDashboardItemsUseCaseImpl( return dashboardItems } - override suspend fun getInternationalItems( + private fun getInternationalItems( allGreenCards: List, databaseSyncerResult: DatabaseSyncerResult, isLoadingNewCredentials: Boolean, @@ -78,12 +92,6 @@ class GetDashboardItemsUseCaseImpl( val domesticGreenCards = allGreenCards.filter { it.greenCardEntity.type == GreenCardType.Domestic } val internationalGreenCards = allGreenCards.filter { it.greenCardEntity.type == GreenCardType.Eu } - if (dashboardItemUtil.shouldShowPlaceholderItem(allGreenCards)) { - dashboardItems.add(DashboardItem.PlaceholderCardItem( - greenCardType = GreenCardType.Eu - )) - } - if (dashboardItemUtil.shouldShowHeaderItem(allGreenCards)) { dashboardItems.add(DashboardItem.HeaderItem( text = R.string.my_overview_description_eu @@ -94,10 +102,6 @@ class GetDashboardItemsUseCaseImpl( dashboardItems.add(DashboardItem.ClockDeviationItem) } - dashboardItems.add( - DashboardItem.AddQrButtonItem(dashboardItemUtil.shouldAddQrButtonItem(allGreenCards)) - ) - dashboardItems.addAll( getGreenCardItems( greenCardType = GreenCardType.Eu, @@ -108,6 +112,16 @@ class GetDashboardItemsUseCaseImpl( ) ) + if (dashboardItemUtil.shouldShowPlaceholderItem(allGreenCards)) { + dashboardItems.add(DashboardItem.PlaceholderCardItem( + greenCardType = GreenCardType.Eu + )) + } + + dashboardItems.add( + DashboardItem.AddQrButtonItem(dashboardItemUtil.shouldAddQrButtonItem(allGreenCards)) + ) + return dashboardItems } diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/myoverview/DashboardViewModel.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/myoverview/DashboardViewModel.kt index 5f93bd531..963ee739c 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/myoverview/DashboardViewModel.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/myoverview/DashboardViewModel.kt @@ -82,24 +82,22 @@ class DashboardViewModelImpl( databaseSyncerResult: DatabaseSyncerResult, isLoadingNewCredentials: Boolean ) { + val items = getDashboardItemsUseCase.getItems( + allGreenCards = allGreenCards, + databaseSyncerResult = databaseSyncerResult, + isLoadingNewCredentials = isLoadingNewCredentials + ) + val domesticItem = DashboardTabItem( title = R.string.travel_button_domestic, greenCardType = GreenCardType.Domestic, - items = getDashboardItemsUseCase.getDomesticItems( - allGreenCards = allGreenCards, - databaseSyncerResult = databaseSyncerResult, - isLoadingNewCredentials = isLoadingNewCredentials - ) + items = items.domesticItems ) val internationalItem = DashboardTabItem( title = R.string.travel_button_europe, greenCardType = GreenCardType.Eu, - items = getDashboardItemsUseCase.getInternationalItems( - allGreenCards = allGreenCards, - databaseSyncerResult = databaseSyncerResult, - isLoadingNewCredentials = isLoadingNewCredentials - ) + items = items.internationalItems ) val dashboardTabItems = listOf( diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/Fakes.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/Fakes.kt index 9570f857a..07d8bb87c 100644 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/Fakes.kt +++ b/holder/src/test/java/nl/rijksoverheid/ctr/holder/Fakes.kt @@ -1,21 +1,14 @@ package nl.rijksoverheid.ctr.holder import androidx.lifecycle.MutableLiveData -import androidx.room.DatabaseConfiguration -import androidx.room.InvalidationTracker -import androidx.sqlite.db.SupportSQLiteOpenHelper import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel -import io.mockk.mockk import nl.rijksoverheid.ctr.appconfig.AppConfigViewModel import nl.rijksoverheid.ctr.appconfig.api.model.HolderConfig import nl.rijksoverheid.ctr.appconfig.models.AppStatus +import nl.rijksoverheid.ctr.appconfig.usecases.ClockDeviationUseCase import nl.rijksoverheid.ctr.holder.persistence.CachedAppConfigUseCase import nl.rijksoverheid.ctr.holder.persistence.PersistenceManager -import nl.rijksoverheid.ctr.holder.persistence.database.HolderDatabase -import nl.rijksoverheid.ctr.holder.persistence.database.dao.* -import nl.rijksoverheid.ctr.holder.persistence.database.entities.EventGroupEntity -import nl.rijksoverheid.ctr.holder.persistence.database.entities.GreenCardType -import nl.rijksoverheid.ctr.holder.persistence.database.entities.OriginType +import nl.rijksoverheid.ctr.holder.persistence.database.entities.* import nl.rijksoverheid.ctr.holder.persistence.database.models.GreenCard import nl.rijksoverheid.ctr.holder.persistence.database.usecases.* import nl.rijksoverheid.ctr.holder.ui.create_qr.CommercialTestCodeViewModel @@ -24,7 +17,7 @@ import nl.rijksoverheid.ctr.holder.ui.create_qr.repositories.CoronaCheckReposito import nl.rijksoverheid.ctr.holder.ui.create_qr.repositories.EventProviderRepository import nl.rijksoverheid.ctr.holder.ui.create_qr.repositories.TestProviderRepository import nl.rijksoverheid.ctr.holder.ui.create_qr.usecases.* -import nl.rijksoverheid.ctr.holder.ui.create_qr.util.GreenCardUtil +import nl.rijksoverheid.ctr.holder.ui.create_qr.util.* import nl.rijksoverheid.ctr.holder.ui.myoverview.DashboardViewModel import nl.rijksoverheid.ctr.holder.ui.myoverview.usecases.TestResultAttributesUseCase import nl.rijksoverheid.ctr.holder.ui.myoverview.utils.TokenValidatorUtil @@ -507,6 +500,27 @@ fun fakeGreenCardUtil( } } +fun fakeCredentialUtil() = object: CredentialUtil { + override fun getActiveCredential(entities: List): CredentialEntity? { + return null + } + + override fun isExpiring(credentialRenewalDays: Long, credential: CredentialEntity): Boolean { + return false + } + + override fun getTestTypeForEuropeanCredentials(entities: List): String { + return "" + } + + override fun getVaccinationDosesForEuropeanCredentials( + entities: List, + getString: (String, String) -> String + ): String { + return "" + } +} + fun fakeGetRemoteGreenCardUseCase(result: RemoteGreenCardsResult = RemoteGreenCardsResult.Success( RemoteGreenCards(null, null) )) = object: GetRemoteGreenCardsUseCase { @@ -523,5 +537,29 @@ fun fakeSyncRemoteGreenCardUseCase( } } +fun fakeClockDevationUseCase( + hasDeviation: Boolean = false +) = object: ClockDeviationUseCase() { + override fun store(serverResponseTimestamp: Long, localReceivedTimestamp: Long) { + + } + + override fun hasDeviation(): Boolean { + return hasDeviation + } +} + +val fakeGreenCardEntity = GreenCardEntity( + id = 0, + walletId = 1, + type = GreenCardType.Domestic +) + +val fakeGreenCard = GreenCard( + greenCardEntity = fakeGreenCardEntity, + origins = listOf(), + credentialEntities = listOf() +) + diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/TestHolderApplication.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/TestHolderApplication.kt index 2d0f27021..f09fdd551 100644 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/TestHolderApplication.kt +++ b/holder/src/test/java/nl/rijksoverheid/ctr/holder/TestHolderApplication.kt @@ -14,10 +14,6 @@ import org.koin.dsl.module */ class TestHolderApplication : HolderApplication() { - fun addKoinModules(modules: List) { - loadKoinModules(modules) - } - override fun getAdditionalModules(): List { return listOf(module { factory { diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/create_qr/usecases/GetDashboardItemsUseCaseImplTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/create_qr/usecases/GetDashboardItemsUseCaseImplTest.kt new file mode 100644 index 000000000..ebb081dfe --- /dev/null +++ b/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/create_qr/usecases/GetDashboardItemsUseCaseImplTest.kt @@ -0,0 +1,346 @@ +package nl.rijksoverheid.ctr.holder.ui.create_qr.usecases + +import kotlinx.coroutines.runBlocking +import nl.rijksoverheid.ctr.appconfig.usecases.ClockDeviationUseCase +import nl.rijksoverheid.ctr.holder.persistence.database.DatabaseSyncerResult +import nl.rijksoverheid.ctr.holder.persistence.database.entities.GreenCardEntity +import nl.rijksoverheid.ctr.holder.persistence.database.entities.GreenCardType +import nl.rijksoverheid.ctr.holder.persistence.database.entities.OriginEntity +import nl.rijksoverheid.ctr.holder.persistence.database.entities.OriginType +import nl.rijksoverheid.ctr.holder.persistence.database.models.GreenCard +import nl.rijksoverheid.ctr.holder.ui.create_qr.models.DashboardItem +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.koin.core.context.loadKoinModules +import org.koin.dsl.module +import org.koin.test.AutoCloseKoinTest +import org.koin.test.inject +import org.robolectric.RobolectricTestRunner +import java.time.OffsetDateTime + +@RunWith(RobolectricTestRunner::class) +class GetDashboardItemsUseCaseImplTest: AutoCloseKoinTest() { + + private val usecase: GetDashboardItemsUseCase by inject() + + @Test + fun `getItems returns correct models when no green cards`() = runBlocking { + val dashboardItems = usecase.getItems( + allGreenCards = listOf(), + databaseSyncerResult = DatabaseSyncerResult.Success, + isLoadingNewCredentials = false + ) + + assertEquals(dashboardItems.domesticItems.size, 2) + assertTrue(dashboardItems.domesticItems[0] is DashboardItem.PlaceholderCardItem) + assertTrue(dashboardItems.domesticItems[1] is DashboardItem.AddQrButtonItem) + + assertEquals(dashboardItems.internationalItems.size, 2) + assertTrue(dashboardItems.internationalItems[0] is DashboardItem.PlaceholderCardItem) + assertTrue(dashboardItems.internationalItems[1] is DashboardItem.AddQrButtonItem) + } + + @Test + fun `getItems returns correct models for single domestic green card`() = runBlocking { + val domesticGreenCardEntity = GreenCardEntity( + id = 1, + walletId = 1, + type = GreenCardType.Domestic + ) + + val domesticGreenCard = GreenCard( + greenCardEntity = domesticGreenCardEntity, + origins = listOf( + OriginEntity( + id = 1, + greenCardId = 1, + type = OriginType.Vaccination, + eventTime = OffsetDateTime.now().minusHours(1), + expirationTime = OffsetDateTime.now().plusHours(5), + validFrom = OffsetDateTime.now().minusHours(5) + ) + ), + credentialEntities = listOf() + ) + + val dashboardItems = usecase.getItems( + allGreenCards = listOf(domesticGreenCard), + databaseSyncerResult = DatabaseSyncerResult.Success, + isLoadingNewCredentials = false + ) + + assertEquals(dashboardItems.domesticItems.size, 3) + assertTrue(dashboardItems.domesticItems[0] is DashboardItem.HeaderItem) + assertTrue(dashboardItems.domesticItems[1] is DashboardItem.GreenCardItem) + assertTrue(dashboardItems.domesticItems[2] is DashboardItem.AddQrButtonItem) + + assertEquals(dashboardItems.internationalItems.size, 3) + assertTrue(dashboardItems.domesticItems[0] is DashboardItem.HeaderItem) + assertTrue(dashboardItems.internationalItems[1] is DashboardItem.OriginInfoItem) + assertTrue(dashboardItems.internationalItems[2] is DashboardItem.AddQrButtonItem) + } + + @Test + fun `getItems returns correct models for single international green card`() = runBlocking { + val internationalGreenCardEntity = GreenCardEntity( + id = 1, + walletId = 1, + type = GreenCardType.Eu + ) + + val internationalGreenCard = GreenCard( + greenCardEntity = internationalGreenCardEntity, + origins = listOf( + OriginEntity( + id = 1, + greenCardId = 1, + type = OriginType.Vaccination, + eventTime = OffsetDateTime.now().minusHours(1), + expirationTime = OffsetDateTime.now().plusHours(5), + validFrom = OffsetDateTime.now().minusHours(5) + ) + ), + credentialEntities = listOf() + ) + + val dashboardItems = usecase.getItems( + allGreenCards = listOf(internationalGreenCard), + databaseSyncerResult = DatabaseSyncerResult.Success, + isLoadingNewCredentials = false + ) + + assertEquals(dashboardItems.domesticItems.size, 3) + assertTrue(dashboardItems.internationalItems[0] is DashboardItem.HeaderItem) + assertTrue(dashboardItems.internationalItems[1] is DashboardItem.GreenCardItem) + assertTrue(dashboardItems.internationalItems[2] is DashboardItem.AddQrButtonItem) + + assertEquals(dashboardItems.internationalItems.size, 3) + assertTrue(dashboardItems.internationalItems[0] is DashboardItem.HeaderItem) + assertTrue(dashboardItems.internationalItems[1] is DashboardItem.GreenCardItem) + assertTrue(dashboardItems.internationalItems[2] is DashboardItem.AddQrButtonItem) + } + + @Test + fun `getItems returns correct models for domestic and international green cards`() = runBlocking { + val domesticGreenCardEntity = GreenCardEntity( + id = 1, + walletId = 1, + type = GreenCardType.Domestic + ) + + val domesticGreenCard = GreenCard( + greenCardEntity = domesticGreenCardEntity, + origins = listOf( + OriginEntity( + id = 1, + greenCardId = 1, + type = OriginType.Vaccination, + eventTime = OffsetDateTime.now().minusHours(1), + expirationTime = OffsetDateTime.now().plusHours(5), + validFrom = OffsetDateTime.now().minusHours(5) + ) + ), + credentialEntities = listOf() + ) + + val internationalGreenCardEntity = GreenCardEntity( + id = 1, + walletId = 1, + type = GreenCardType.Eu + ) + + val internationalGreenCard = GreenCard( + greenCardEntity = internationalGreenCardEntity, + origins = listOf( + OriginEntity( + id = 1, + greenCardId = 1, + type = OriginType.Vaccination, + eventTime = OffsetDateTime.now().minusHours(1), + expirationTime = OffsetDateTime.now().plusHours(5), + validFrom = OffsetDateTime.now().minusHours(5) + ) + ), + credentialEntities = listOf() + ) + + val dashboardItems = usecase.getItems( + allGreenCards = listOf(domesticGreenCard, internationalGreenCard), + databaseSyncerResult = DatabaseSyncerResult.Success, + isLoadingNewCredentials = false + ) + + assertEquals(dashboardItems.domesticItems.size, 3) + assertTrue(dashboardItems.domesticItems[0] is DashboardItem.HeaderItem) + assertTrue(dashboardItems.domesticItems[1] is DashboardItem.GreenCardItem) + assertTrue(dashboardItems.domesticItems[2] is DashboardItem.AddQrButtonItem) + + assertEquals(dashboardItems.internationalItems.size, 3) + assertTrue(dashboardItems.internationalItems[0] is DashboardItem.HeaderItem) + assertTrue(dashboardItems.internationalItems[1] is DashboardItem.GreenCardItem) + assertTrue(dashboardItems.internationalItems[2] is DashboardItem.AddQrButtonItem) + } + + @Test + fun `getItems returns correct models for domestic and international green cards with clock deviation`() = runBlocking { + loadKoinModules(fakeClockDeviationModule(hasDeviation = true)) + + val domesticGreenCardEntity = GreenCardEntity( + id = 1, + walletId = 1, + type = GreenCardType.Domestic + ) + + val domesticGreenCard = GreenCard( + greenCardEntity = domesticGreenCardEntity, + origins = listOf( + OriginEntity( + id = 1, + greenCardId = 1, + type = OriginType.Vaccination, + eventTime = OffsetDateTime.now().minusHours(1), + expirationTime = OffsetDateTime.now().plusHours(5), + validFrom = OffsetDateTime.now().minusHours(5) + ) + ), + credentialEntities = listOf() + ) + + val internationalGreenCardEntity = GreenCardEntity( + id = 1, + walletId = 1, + type = GreenCardType.Eu + ) + + val internationalGreenCard = GreenCard( + greenCardEntity = internationalGreenCardEntity, + origins = listOf( + OriginEntity( + id = 1, + greenCardId = 1, + type = OriginType.Vaccination, + eventTime = OffsetDateTime.now().minusHours(1), + expirationTime = OffsetDateTime.now().plusHours(5), + validFrom = OffsetDateTime.now().minusHours(5) + ) + ), + credentialEntities = listOf() + ) + + val dashboardItems = usecase.getItems( + allGreenCards = listOf(domesticGreenCard, internationalGreenCard), + databaseSyncerResult = DatabaseSyncerResult.Success, + isLoadingNewCredentials = false + ) + + assertEquals(dashboardItems.domesticItems.size, 4) + assertTrue(dashboardItems.domesticItems[0] is DashboardItem.HeaderItem) + assertTrue(dashboardItems.domesticItems[1] is DashboardItem.ClockDeviationItem) + assertTrue(dashboardItems.domesticItems[2] is DashboardItem.GreenCardItem) + assertTrue(dashboardItems.domesticItems[3] is DashboardItem.AddQrButtonItem) + + assertEquals(dashboardItems.internationalItems.size, 4) + assertTrue(dashboardItems.internationalItems[0] is DashboardItem.HeaderItem) + assertTrue(dashboardItems.internationalItems[1] is DashboardItem.ClockDeviationItem) + assertTrue(dashboardItems.internationalItems[2] is DashboardItem.GreenCardItem) + assertTrue(dashboardItems.internationalItems[3] is DashboardItem.AddQrButtonItem) + } + + @Test + fun `getItems returns correct models for expired domestic green card`() = runBlocking { + val domesticGreenCardEntity = GreenCardEntity( + id = 1, + walletId = 1, + type = GreenCardType.Domestic + ) + + val domesticGreenCard = GreenCard( + greenCardEntity = domesticGreenCardEntity, + origins = listOf( + OriginEntity( + id = 1, + greenCardId = 1, + type = OriginType.Vaccination, + eventTime = OffsetDateTime.now().minusHours(1), + expirationTime = OffsetDateTime.now().minusHours(5), + validFrom = OffsetDateTime.now().minusHours(5) + ) + ), + credentialEntities = listOf() + ) + + val dashboardItems = usecase.getItems( + allGreenCards = listOf(domesticGreenCard), + databaseSyncerResult = DatabaseSyncerResult.Success, + isLoadingNewCredentials = false + ) + + assertEquals(dashboardItems.domesticItems.size, 4) + assertTrue(dashboardItems.domesticItems[0] is DashboardItem.HeaderItem) + assertTrue(dashboardItems.domesticItems[1] is DashboardItem.GreenCardExpiredItem) + assertTrue(dashboardItems.domesticItems[2] is DashboardItem.PlaceholderCardItem) + assertTrue(dashboardItems.domesticItems[3] is DashboardItem.AddQrButtonItem) + + assertEquals(dashboardItems.internationalItems.size, 3) + assertTrue(dashboardItems.internationalItems[0] is DashboardItem.HeaderItem) + assertTrue(dashboardItems.internationalItems[1] is DashboardItem.PlaceholderCardItem) + assertTrue(dashboardItems.internationalItems[2] is DashboardItem.AddQrButtonItem) + } + + @Test + fun `getItems returns correct models for expired international green card`() = runBlocking { + val internationalGreenCardEntity = GreenCardEntity( + id = 1, + walletId = 1, + type = GreenCardType.Eu + ) + + val internationalGreenCard = GreenCard( + greenCardEntity = internationalGreenCardEntity, + origins = listOf( + OriginEntity( + id = 1, + greenCardId = 1, + type = OriginType.Vaccination, + eventTime = OffsetDateTime.now().minusHours(1), + expirationTime = OffsetDateTime.now().minusHours(5), + validFrom = OffsetDateTime.now().minusHours(5) + ) + ), + credentialEntities = listOf() + ) + + val dashboardItems = usecase.getItems( + allGreenCards = listOf(internationalGreenCard), + databaseSyncerResult = DatabaseSyncerResult.Success, + isLoadingNewCredentials = false + ) + + assertEquals(dashboardItems.domesticItems.size, 3) + assertTrue(dashboardItems.domesticItems[0] is DashboardItem.HeaderItem) + assertTrue(dashboardItems.domesticItems[1] is DashboardItem.PlaceholderCardItem) + assertTrue(dashboardItems.domesticItems[2] is DashboardItem.AddQrButtonItem) + + assertEquals(dashboardItems.internationalItems.size, 4) + assertTrue(dashboardItems.internationalItems[0] is DashboardItem.HeaderItem) + assertTrue(dashboardItems.internationalItems[1] is DashboardItem.GreenCardExpiredItem) + assertTrue(dashboardItems.internationalItems[2] is DashboardItem.PlaceholderCardItem) + assertTrue(dashboardItems.internationalItems[3] is DashboardItem.AddQrButtonItem) + } + + private fun fakeClockDeviationModule(hasDeviation: Boolean) = module(override = true) { + factory { + object: ClockDeviationUseCase() { + override fun store(serverResponseTimestamp: Long, localReceivedTimestamp: Long) { + + } + + override fun hasDeviation(): Boolean { + return hasDeviation + } + } + } + } +} \ No newline at end of file diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/myoverview/utils/DashboardItemUtilImplTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/myoverview/utils/DashboardItemUtilImplTest.kt new file mode 100644 index 000000000..a1a138814 --- /dev/null +++ b/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/myoverview/utils/DashboardItemUtilImplTest.kt @@ -0,0 +1,119 @@ +package nl.rijksoverheid.ctr.holder.ui.myoverview.utils + +import nl.rijksoverheid.ctr.holder.fakeClockDevationUseCase +import nl.rijksoverheid.ctr.holder.fakeGreenCard +import nl.rijksoverheid.ctr.holder.fakeGreenCardUtil +import nl.rijksoverheid.ctr.holder.ui.create_qr.util.DashboardItemUtilImpl +import org.junit.Assert.assertEquals +import org.junit.Test + +class DashboardItemUtilImplTest { + + @Test + fun `shouldShowHeaderItem returns true if has green cards`() { + val util = DashboardItemUtilImpl( + clockDeviationUseCase = fakeClockDevationUseCase(), + greenCardUtil = fakeGreenCardUtil() + ) + + val shouldShowHeaderItem = util.shouldShowHeaderItem( + allGreenCards = listOf(fakeGreenCard) + ) + + assertEquals(true, shouldShowHeaderItem) + } + + @Test + fun `shouldShowHeaderItem returns true if not all green cards expired`() { + val util = DashboardItemUtilImpl( + clockDeviationUseCase = fakeClockDevationUseCase(), + greenCardUtil = fakeGreenCardUtil( + isExpired = false + ) + ) + + val shouldShowHeaderItem = util.shouldShowHeaderItem( + allGreenCards = listOf(fakeGreenCard) + ) + + assertEquals(true, shouldShowHeaderItem) + } + + @Test + fun `shouldShowClockDeviationItem returns true if has deviation and has green cards`() { + val util = DashboardItemUtilImpl( + clockDeviationUseCase = fakeClockDevationUseCase( + hasDeviation = true + ), + greenCardUtil = fakeGreenCardUtil() + ) + + val shouldShowClockDeviationItem = util.shouldShowClockDeviationItem( + allGreenCards = listOf(fakeGreenCard) + ) + + assertEquals(true, shouldShowClockDeviationItem) + } + + @Test + fun `shouldShowClockDeviationItem returns true if has deviation and not all green cards expired`() { + val util = DashboardItemUtilImpl( + clockDeviationUseCase = fakeClockDevationUseCase( + hasDeviation = true + ), + greenCardUtil = fakeGreenCardUtil( + isExpired = false + ) + ) + + val shouldShowClockDeviationItem = util.shouldShowClockDeviationItem( + allGreenCards = listOf(fakeGreenCard) + ) + + assertEquals(true, shouldShowClockDeviationItem) + } + + @Test + fun `shouldShowPlaceholderItem returns true if has no green cards`() { + val util = DashboardItemUtilImpl( + clockDeviationUseCase = fakeClockDevationUseCase(), + greenCardUtil = fakeGreenCardUtil() + ) + + val shouldShowHeaderItem = util.shouldShowPlaceholderItem( + allGreenCards = listOf() + ) + + assertEquals(true, shouldShowHeaderItem) + } + + @Test + fun `shouldShowPlaceholderItem returns true if all green cards expired`() { + val util = DashboardItemUtilImpl( + clockDeviationUseCase = fakeClockDevationUseCase(), + greenCardUtil = fakeGreenCardUtil( + isExpired = true + ) + ) + + val shouldShowHeaderItem = util.shouldShowPlaceholderItem( + allGreenCards = listOf(fakeGreenCard) + ) + + assertEquals(true, shouldShowHeaderItem) + } + + @Test + fun `shouldAddQrButtonItem returns true if has no green cards`() { + val util = DashboardItemUtilImpl( + clockDeviationUseCase = fakeClockDevationUseCase(), + greenCardUtil = fakeGreenCardUtil() + ) + + val shouldAddQrButtonItem = util.shouldAddQrButtonItem( + allGreenCards = listOf() + ) + + assertEquals(true, shouldAddQrButtonItem) + } +} \ No newline at end of file