From 46d8cb9eb7b2a4f7edda5c46e2adb3917a0617a7 Mon Sep 17 00:00:00 2001 From: Shuvo Date: Tue, 10 Dec 2024 21:45:27 +0600 Subject: [PATCH] Add some unit tests. --- .../datastore/NiaPreferencesDataSourceTest.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/core/datastore/src/test/kotlin/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt b/core/datastore/src/test/kotlin/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt index 433bbb5ea..2804b6857 100644 --- a/core/datastore/src/test/kotlin/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt +++ b/core/datastore/src/test/kotlin/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt @@ -16,13 +16,18 @@ package com.google.samples.apps.nowinandroid.core.datastore +import androidx.datastore.core.DataStore +import androidx.datastore.core.IOException import com.google.samples.apps.nowinandroid.core.datastore.test.InMemoryDataStore +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.flow import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test +import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertTrue @@ -32,11 +37,34 @@ class NiaPreferencesDataSourceTest { private lateinit var subject: NiaPreferencesDataSource + // A DataStore implementation that throws an IOException when accessed + private val ioExceptionThrowingDataStore = object : DataStore { + override val data: Flow + get() = flow { throw IOException("Failed to read proto") } + + override suspend fun updateData(transform: suspend (t: UserPreferences) -> UserPreferences): UserPreferences { + throw Exception("Not needed for this test") + } + } + @Before fun setup() { subject = NiaPreferencesDataSource(InMemoryDataStore(UserPreferences.getDefaultInstance())) } + @Test + fun userData_emitDefault_whenDataStoreThrowsIOException() = + testScope.runTest { + // Given: NiaPreferencesDataSource with ioException throwing datastore + val dataSource = NiaPreferencesDataSource(ioExceptionThrowingDataStore) + + // When: Retrieving user data from the data source + val actualUserData = dataSource.userData.first() + + // Then: The default user data is returned + assertEquals(subject.userData.first(), actualUserData) + } + @Test fun shouldHideOnboardingIsFalseByDefault() = testScope.runTest { assertFalse(subject.userData.first().shouldHideOnboarding) @@ -76,6 +104,19 @@ class NiaPreferencesDataSourceTest { assertFalse(subject.userData.first().shouldHideOnboarding) } + @Test + fun getChangeListVersions_returnsDefault_whenDataStoreThrowsIOException() = + testScope.runTest { + // Given: NiaPreferencesDataSource with ioException throwing datastore + val dataSource = NiaPreferencesDataSource(ioExceptionThrowingDataStore) + + // When: Retrieving change list versions from the data source + val actualResult = dataSource.getChangeListVersions() + + // Then: The default value is returned + assertEquals(subject.getChangeListVersions(), actualResult) + } + @Test fun shouldUseDynamicColorFalseByDefault() = testScope.runTest { assertFalse(subject.userData.first().useDynamicColor)