diff --git a/.github/workflows/Build.yaml b/.github/workflows/Build.yaml index 54dbcb252..a047a451a 100644 --- a/.github/workflows/Build.yaml +++ b/.github/workflows/Build.yaml @@ -34,16 +34,16 @@ jobs: uses: gradle/gradle-build-action@v2 - name: Check spotless - run: ./gradlew spotlessCheck --init-script gradle/init.gradle.kts --no-configuration-cache --stacktrace + run: ./gradlew spotlessCheck --init-script gradle/init.gradle.kts --no-configuration-cache - name: Check lint - run: ./gradlew lintDemoDebug --stacktrace + run: ./gradlew lintDemoDebug - name: Build all build type and flavor permutations - run: ./gradlew assemble --stacktrace + run: ./gradlew assemble - name: Run local tests - run: ./gradlew testDemoDebug testProdDebug --stacktrace + run: ./gradlew testDemoDebug testProdDebug - name: Upload build outputs (APKs) uses: actions/upload-artifact@v3 @@ -90,7 +90,7 @@ jobs: disable-animations: true disk-size: 6000M heap-size: 600M - script: ./gradlew connectedProdDebugAndroidTest -x :benchmark:connectedProdBenchmarkAndroidTest --stacktrace + script: ./gradlew connectedProdDebugAndroidTest -x :benchmark:connectedProdBenchmarkAndroidTest - name: Upload test reports if: always() diff --git a/.google/packaging.yaml b/.google/packaging.yaml index e3b33ada7..40ab81389 100644 --- a/.google/packaging.yaml +++ b/.google/packaging.yaml @@ -18,15 +18,31 @@ # End users may safely ignore this file. It has no relevance to other systems. --- status: PUBLISHED -technologies: [Android] +technologies: [Android, JetpackCompose, Coroutines] categories: - AndroidTesting - AndroidArchitecture - AndroidArchitectureUILayer - AndroidArchitectureDomainLayer - AndroidArchitectureDataLayer + - AndroidArchitectureStateProduction + - AndroidArchitectureStateHolder + - JetpackComposeTesting + - JetpackComposeA11y + - JetpackComposeArchitectureAndState + - JetpackComposeDesignSystems + - JetpackComposeNavigation + - JetpackComposeAnimation +solutions: + - Mobile + - Flow + - JetpackHilt + - JetpackDataStore + - JetpackRoom + - JetpackNavigation + - JetpackWorkManager + - JetpackLifecycle languages: [Kotlin] -solutions: [Mobile] github: android/nowinandroid level: ADVANCED license: apache2 diff --git a/.run/Generate Demo Baseline Profile.run.xml b/.run/Generate Demo Baseline Profile.run.xml new file mode 100644 index 000000000..68174ea4b --- /dev/null +++ b/.run/Generate Demo Baseline Profile.run.xml @@ -0,0 +1,44 @@ + + + + + + + + + + true + true + false + + + diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c4d60e202..b73bdef64 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -91,13 +91,13 @@ dependencies { implementation(project(":core:model")) implementation(project(":sync:work")) - implementation(project(":sync:sync-test")) androidTestImplementation(project(":core:testing")) androidTestImplementation(project(":core:datastore-test")) androidTestImplementation(project(":core:data-test")) androidTestImplementation(project(":core:network")) androidTestImplementation(libs.androidx.navigation.testing) + androidTestImplementation(kotlin("test")) debugImplementation(libs.androidx.compose.ui.testManifest) implementation(libs.accompanist.systemuicontroller) diff --git a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt index cfda9c0d9..8e0d65636 100644 --- a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt +++ b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt @@ -31,13 +31,13 @@ import androidx.navigation.compose.composable import androidx.navigation.createGraph import androidx.navigation.testing.TestNavHostController import com.google.samples.apps.nowinandroid.core.testing.util.TestNetworkMonitor +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals -import org.junit.Assert.assertFalse -import org.junit.Assert.assertTrue import org.junit.Rule import org.junit.Test diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4287a5fb9..5c3b889d2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,8 +32,7 @@ + android:exported="true"> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ba503b90d..47ca6df06 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -15,12 +15,6 @@ limitations under the License. --> - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #4D000000 diff --git a/benchmark/build.gradle.kts b/benchmarks/build.gradle.kts similarity index 92% rename from benchmark/build.gradle.kts rename to benchmarks/build.gradle.kts index 931fd6d00..3271250dd 100644 --- a/benchmark/build.gradle.kts +++ b/benchmarks/build.gradle.kts @@ -21,7 +21,7 @@ plugins { } android { - namespace = "com.google.samples.apps.nowinandroid.benchmark" + namespace = "com.google.samples.apps.nowinandroid.benchmarks" defaultConfig { minSdk = 23 @@ -55,9 +55,9 @@ android { testOptions { managedDevices { devices { - create("pixel5Api30") { - device = "Pixel 5" - apiLevel = 30 + create("pixel6Api31") { + device = "Pixel 6" + apiLevel = 31 systemImageSource = "aosp" } } diff --git a/benchmark/src/main/AndroidManifest.xml b/benchmarks/src/main/AndroidManifest.xml similarity index 100% rename from benchmark/src/main/AndroidManifest.xml rename to benchmarks/src/main/AndroidManifest.xml diff --git a/benchmark/src/main/java/com/google/samples/apps/nowinandroid/Utils.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/Utils.kt similarity index 68% rename from benchmark/src/main/java/com/google/samples/apps/nowinandroid/Utils.kt rename to benchmarks/src/main/java/com/google/samples/apps/nowinandroid/Utils.kt index 41f817c8d..ffb3da23c 100644 --- a/benchmark/src/main/java/com/google/samples/apps/nowinandroid/Utils.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/Utils.kt @@ -16,10 +16,16 @@ package com.google.samples.apps.nowinandroid -import com.google.samples.apps.nowinandroid.benchmark.BuildConfig +import com.google.samples.apps.nowinandroid.benchmarks.BuildConfig /** * Convenience parameter to use proper package name with regards to build type and build flavor. */ -const val PACKAGE_NAME = - "com.google.samples.apps.nowinandroid.${BuildConfig.FLAVOR}.${BuildConfig.BUILD_TYPE}" +val PACKAGE_NAME = StringBuilder("com.google.samples.apps.nowinandroid").apply { + if (BuildConfig.FLAVOR != "prod") { + append(".${BuildConfig.FLAVOR}") + } + if (BuildConfig.BUILD_TYPE != "release") { + append(".${BuildConfig.BUILD_TYPE}") + } +}.toString() diff --git a/benchmark/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt similarity index 100% rename from benchmark/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt rename to benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt diff --git a/benchmark/src/main/java/com/google/samples/apps/nowinandroid/bookmarks/BookmarksActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/bookmarks/BookmarksActions.kt similarity index 100% rename from benchmark/src/main/java/com/google/samples/apps/nowinandroid/bookmarks/BookmarksActions.kt rename to benchmarks/src/main/java/com/google/samples/apps/nowinandroid/bookmarks/BookmarksActions.kt diff --git a/benchmark/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt similarity index 100% rename from benchmark/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt rename to benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt diff --git a/benchmark/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt similarity index 100% rename from benchmark/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt rename to benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt diff --git a/benchmark/src/main/java/com/google/samples/apps/nowinandroid/interests/InterestsActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/InterestsActions.kt similarity index 100% rename from benchmark/src/main/java/com/google/samples/apps/nowinandroid/interests/InterestsActions.kt rename to benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/InterestsActions.kt diff --git a/benchmark/src/main/java/com/google/samples/apps/nowinandroid/interests/TopicsScreenRecompositionBenchmark.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/TopicsScreenRecompositionBenchmark.kt similarity index 100% rename from benchmark/src/main/java/com/google/samples/apps/nowinandroid/interests/TopicsScreenRecompositionBenchmark.kt rename to benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/TopicsScreenRecompositionBenchmark.kt diff --git a/benchmark/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt similarity index 100% rename from benchmark/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt rename to benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt diff --git a/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt index 110c5ade0..a637b78c0 100644 --- a/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt @@ -21,6 +21,7 @@ import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.kotlin class AndroidFeatureConventionPlugin : Plugin { override fun apply(target: Project) { @@ -46,7 +47,9 @@ class AndroidFeatureConventionPlugin : Plugin { add("implementation", project(":core:common")) add("implementation", project(":core:domain")) + add("testImplementation", kotlin("test")) add("testImplementation", project(":core:testing")) + add("androidTestImplementation", kotlin("test")) add("androidTestImplementation", project(":core:testing")) add("implementation", libs.findLibrary("coil.kt").get()) diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt index 4bcd039f3..f7d6d184a 100644 --- a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt @@ -26,6 +26,7 @@ import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.kotlin class AndroidLibraryConventionPlugin : Plugin { override fun apply(target: Project) { @@ -51,6 +52,10 @@ class AndroidLibraryConventionPlugin : Plugin { force("org.objenesis:objenesis:2.6") } } + dependencies { + add("androidTestImplementation", kotlin("test")) + add("testImplementation", kotlin("test")) + } } } } \ No newline at end of file diff --git a/core/common/src/test/java/com/google/samples/apps/nowinandroid/core/result/ResultKtTest.kt b/core/common/src/test/java/com/google/samples/apps/nowinandroid/core/result/ResultKtTest.kt index 964ac2ab5..90852c7c5 100644 --- a/core/common/src/test/java/com/google/samples/apps/nowinandroid/core/result/ResultKtTest.kt +++ b/core/common/src/test/java/com/google/samples/apps/nowinandroid/core/result/ResultKtTest.kt @@ -17,9 +17,9 @@ package com.google.samples.apps.nowinandroid.core.result import app.cash.turbine.test +import kotlin.test.assertEquals import kotlinx.coroutines.flow.flow import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals import org.junit.Test class ResultKtTest { diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/model/NetworkEntityKtTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/model/NetworkEntityKtTest.kt index c910d2c79..035d72801 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/model/NetworkEntityKtTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/model/NetworkEntityKtTest.kt @@ -21,8 +21,8 @@ import com.google.samples.apps.nowinandroid.core.network.model.NetworkAuthor import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResourceExpanded import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic +import kotlin.test.assertEquals import kotlinx.datetime.Instant -import org.junit.Assert.assertEquals import org.junit.Test class NetworkEntityKtTest { diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepositoryTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepositoryTest.kt index 61c5fb809..ea7e9c4ba 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepositoryTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstAuthorsRepositoryTest.kt @@ -29,9 +29,9 @@ import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferen import com.google.samples.apps.nowinandroid.core.model.data.Author import com.google.samples.apps.nowinandroid.core.network.model.NetworkAuthor import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList +import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest -import org.junit.Assert import org.junit.Before import org.junit.Rule import org.junit.Test @@ -68,7 +68,7 @@ class OfflineFirstAuthorsRepositoryTest { @Test fun offlineFirstAuthorsRepository_Authors_stream_is_backed_by_Authors_dao() = runTest { - Assert.assertEquals( + assertEquals( authorDao.getAuthorEntitiesStream() .first() .map(AuthorEntity::asExternalModel), @@ -88,13 +88,13 @@ class OfflineFirstAuthorsRepositoryTest { val dbAuthors = authorDao.getAuthorEntitiesStream() .first() - Assert.assertEquals( + assertEquals( networkAuthors.map(AuthorEntity::id), dbAuthors.map(AuthorEntity::id) ) // After sync version should be updated - Assert.assertEquals( + assertEquals( network.latestChangeListVersion(CollectionType.Authors), synchronizer.getChangeListVersions().authorVersion ) @@ -125,13 +125,13 @@ class OfflineFirstAuthorsRepositoryTest { val db = authorDao.getAuthorEntitiesStream() .first() - Assert.assertEquals( + assertEquals( network.map(AuthorEntity::id), db.map(AuthorEntity::id) ) // After sync version should be updated - Assert.assertEquals( + assertEquals( changeList.last().changeListVersion, synchronizer.getChangeListVersions().authorVersion ) @@ -166,13 +166,13 @@ class OfflineFirstAuthorsRepositoryTest { .map(AuthorEntity::asExternalModel) // Assert that items marked deleted on the network have been deleted locally - Assert.assertEquals( + assertEquals( networkAuthors.map(Author::id) - deletedItems, dbAuthors.map(Author::id) ) // After sync version should be updated - Assert.assertEquals( + assertEquals( network.latestChangeListVersion(CollectionType.Authors), synchronizer.getChangeListVersions().authorVersion ) diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt index 4429f1021..78fcac0f2 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt @@ -39,9 +39,9 @@ import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferen import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource +import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Rule import org.junit.Test @@ -112,7 +112,7 @@ class OfflineFirstNewsRepositoryTest { ) assertEquals( - emptyList(), + emptyList(), subject.getNewsResourcesStream( filterTopicIds = nonPresentInterestsIds, ) @@ -136,7 +136,7 @@ class OfflineFirstNewsRepositoryTest { ) assertEquals( - emptyList(), + emptyList(), subject.getNewsResourcesStream( filterAuthorIds = nonPresentInterestsIds ) diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt index 48570d5f0..2514b07cb 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt @@ -28,9 +28,9 @@ import com.google.samples.apps.nowinandroid.core.datastore.NiaPreferencesDataSou import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferencesDataStore import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic +import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest -import org.junit.Assert import org.junit.Before import org.junit.Rule import org.junit.Test @@ -69,7 +69,7 @@ class OfflineFirstTopicsRepositoryTest { @Test fun offlineFirstTopicsRepository_topics_stream_is_backed_by_topics_dao() = runTest { - Assert.assertEquals( + assertEquals( topicDao.getTopicEntitiesStream() .first() .map(TopicEntity::asExternalModel), @@ -89,13 +89,13 @@ class OfflineFirstTopicsRepositoryTest { val dbTopics = topicDao.getTopicEntitiesStream() .first() - Assert.assertEquals( + assertEquals( networkTopics.map(TopicEntity::id), dbTopics.map(TopicEntity::id) ) // After sync version should be updated - Assert.assertEquals( + assertEquals( network.latestChangeListVersion(CollectionType.Topics), synchronizer.getChangeListVersions().topicVersion ) @@ -119,13 +119,13 @@ class OfflineFirstTopicsRepositoryTest { val dbTopics = topicDao.getTopicEntitiesStream() .first() - Assert.assertEquals( + assertEquals( networkTopics.map(TopicEntity::id), dbTopics.map(TopicEntity::id) ) // After sync version should be updated - Assert.assertEquals( + assertEquals( network.latestChangeListVersion(CollectionType.Topics), synchronizer.getChangeListVersions().topicVersion ) @@ -160,13 +160,13 @@ class OfflineFirstTopicsRepositoryTest { .map(TopicEntity::asExternalModel) // Assert that items marked deleted on the network have been deleted locally - Assert.assertEquals( + assertEquals( networkTopics.map(Topic::id) - deletedItems, dbTopics.map(Topic::id) ) // After sync version should be updated - Assert.assertEquals( + assertEquals( network.latestChangeListVersion(CollectionType.Topics), synchronizer.getChangeListVersions().topicVersion ) diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt index c1d740602..63aadc7bf 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt @@ -21,10 +21,12 @@ import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferen import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.model.data.UserData +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Rule import org.junit.Test @@ -194,9 +196,9 @@ class OfflineFirstUserDataRepositoryTest { runTest { subject.setFollowedTopicIds(setOf("1")) subject.setShouldHideOnboarding(true) - assertEquals(true, subject.userDataStream.first().shouldHideOnboarding) + assertTrue(subject.userDataStream.first().shouldHideOnboarding) subject.setFollowedTopicIds(emptySet()) - assertEquals(false, subject.userDataStream.first().shouldHideOnboarding) + assertFalse(subject.userDataStream.first().shouldHideOnboarding) } } diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt index 1bc89d1f4..504277e23 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt @@ -20,8 +20,8 @@ import com.google.samples.apps.nowinandroid.core.model.data.Author import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Video import com.google.samples.apps.nowinandroid.core.model.data.Topic +import kotlin.test.assertEquals import kotlinx.datetime.Instant -import org.junit.Assert.assertEquals import org.junit.Test class PopulatedNewsResourceKtTest { diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverterTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverterTest.kt index 4a52bd5b7..37a25dc7e 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverterTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverterTest.kt @@ -17,7 +17,7 @@ package com.google.samples.apps.nowinandroid.core.database.util import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType -import org.junit.Assert.assertEquals +import kotlin.test.assertEquals import org.junit.Test class NewsResourceTypeConverterTest { diff --git a/core/database/src/androidTest/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt b/core/database/src/androidTest/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt index 3c6557a2b..017704381 100644 --- a/core/database/src/androidTest/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt +++ b/core/database/src/androidTest/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt @@ -27,10 +27,10 @@ import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceTopi import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType +import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import kotlinx.datetime.Instant -import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigrationTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigrationTest.kt index 89035dc91..e82f74b52 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigrationTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigrationTest.kt @@ -16,9 +16,9 @@ package com.google.samples.apps.nowinandroid.core.datastore +import kotlin.test.assertEquals +import kotlin.test.assertTrue import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals -import org.junit.Assert.assertTrue import org.junit.Test /** diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigrationTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigrationTest.kt index 6fc06f585..c2fdf4f55 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigrationTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigrationTest.kt @@ -16,8 +16,9 @@ package com.google.samples.apps.nowinandroid.core.datastore +import kotlin.test.assertEquals +import kotlin.test.assertTrue import kotlinx.coroutines.test.runTest -import org.junit.Assert import org.junit.Test class ListToMapMigrationTest { @@ -29,7 +30,7 @@ class ListToMapMigrationTest { deprecatedFollowedTopicIds.addAll(listOf("1", "2", "3")) } // Assert that there are no topic ids in the map yet - Assert.assertEquals( + assertEquals( emptyMap(), preMigrationUserPreferences.followedTopicIdsMap ) @@ -39,13 +40,13 @@ class ListToMapMigrationTest { ListToMapMigration.migrate(preMigrationUserPreferences) // Assert the deprecated topic ids have been migrated to the topic ids map - Assert.assertEquals( + assertEquals( mapOf("1" to true, "2" to true, "3" to true), postMigrationUserPreferences.followedTopicIdsMap ) // Assert that the migration has been marked complete - Assert.assertTrue(postMigrationUserPreferences.hasDoneListToMapMigration) + assertTrue(postMigrationUserPreferences.hasDoneListToMapMigration) } @Test @@ -55,7 +56,7 @@ class ListToMapMigrationTest { deprecatedFollowedAuthorIds.addAll(listOf("4", "5", "6")) } // Assert that there are no author ids in the map yet - Assert.assertEquals( + assertEquals( emptyMap(), preMigrationUserPreferences.followedAuthorIdsMap ) @@ -65,13 +66,13 @@ class ListToMapMigrationTest { ListToMapMigration.migrate(preMigrationUserPreferences) // Assert the deprecated author ids have been migrated to the author ids map - Assert.assertEquals( + assertEquals( mapOf("4" to true, "5" to true, "6" to true), postMigrationUserPreferences.followedAuthorIdsMap ) // Assert that the migration has been marked complete - Assert.assertTrue(postMigrationUserPreferences.hasDoneListToMapMigration) + assertTrue(postMigrationUserPreferences.hasDoneListToMapMigration) } @Test @@ -81,7 +82,7 @@ class ListToMapMigrationTest { deprecatedBookmarkedNewsResourceIds.addAll(listOf("7", "8", "9")) } // Assert that there are no bookmarks in the map yet - Assert.assertEquals( + assertEquals( emptyMap(), preMigrationUserPreferences.bookmarkedNewsResourceIdsMap ) @@ -91,12 +92,12 @@ class ListToMapMigrationTest { ListToMapMigration.migrate(preMigrationUserPreferences) // Assert the deprecated bookmarks have been migrated to the bookmarks map - Assert.assertEquals( + assertEquals( mapOf("7" to true, "8" to true, "9" to true), postMigrationUserPreferences.bookmarkedNewsResourceIdsMap ) // Assert that the migration has been marked complete - Assert.assertTrue(postMigrationUserPreferences.hasDoneListToMapMigration) + assertTrue(postMigrationUserPreferences.hasDoneListToMapMigration) } } diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt index d5e4be841..78759d0ce 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt @@ -17,9 +17,10 @@ package com.google.samples.apps.nowinandroid.core.datastore import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferencesDataStore +import kotlin.test.assertFalse +import kotlin.test.assertTrue import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Rule import org.junit.Test @@ -40,13 +41,13 @@ class NiaPreferencesDataSourceTest { @Test fun shouldHideOnboardingIsFalseByDefault() = runTest { - assertEquals(false, subject.userDataStream.first().shouldHideOnboarding) + assertFalse(subject.userDataStream.first().shouldHideOnboarding) } @Test fun userShouldHideOnboardingIsTrueWhenSet() = runTest { subject.setShouldHideOnboarding(true) - assertEquals(true, subject.userDataStream.first().shouldHideOnboarding) + assertTrue(subject.userDataStream.first().shouldHideOnboarding) } @Test @@ -60,7 +61,7 @@ class NiaPreferencesDataSourceTest { subject.toggleFollowedAuthorId("1", false) // Then: onboarding should be shown again - assertEquals(false, subject.userDataStream.first().shouldHideOnboarding) + assertFalse(subject.userDataStream.first().shouldHideOnboarding) } @Test @@ -74,7 +75,7 @@ class NiaPreferencesDataSourceTest { subject.toggleFollowedTopicId("1", false) // Then: onboarding should be shown again - assertEquals(false, subject.userDataStream.first().shouldHideOnboarding) + assertFalse(subject.userDataStream.first().shouldHideOnboarding) } @Test @@ -88,7 +89,7 @@ class NiaPreferencesDataSourceTest { subject.setFollowedAuthorIds(emptySet()) // Then: onboarding should be shown again - assertEquals(false, subject.userDataStream.first().shouldHideOnboarding) + assertFalse(subject.userDataStream.first().shouldHideOnboarding) } @Test @@ -102,7 +103,7 @@ class NiaPreferencesDataSourceTest { subject.setFollowedTopicIds(emptySet()) // Then: onboarding should be shown again - assertEquals(false, subject.userDataStream.first().shouldHideOnboarding) + assertFalse(subject.userDataStream.first().shouldHideOnboarding) } @Test @@ -117,7 +118,7 @@ class NiaPreferencesDataSourceTest { subject.setFollowedTopicIds(emptySet()) // Then: onboarding should still be dismissed - assertEquals(true, subject.userDataStream.first().shouldHideOnboarding) + assertTrue(subject.userDataStream.first().shouldHideOnboarding) } @Test @@ -132,6 +133,6 @@ class NiaPreferencesDataSourceTest { subject.setFollowedAuthorIds(emptySet()) // Then: onboarding should still be dismissed - assertEquals(true, subject.userDataStream.first().shouldHideOnboarding) + assertTrue(subject.userDataStream.first().shouldHideOnboarding) } } diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/UserPreferencesSerializerTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/UserPreferencesSerializerTest.kt index cf3fcf338..1b10c5672 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/UserPreferencesSerializerTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/UserPreferencesSerializerTest.kt @@ -19,8 +19,8 @@ package com.google.samples.apps.nowinandroid.core.datastore import androidx.datastore.core.CorruptionException import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream +import kotlin.test.assertEquals import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals import org.junit.Test class UserPreferencesSerializerTest { diff --git a/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt b/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt index 8710ba265..4bc69712d 100644 --- a/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt +++ b/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt @@ -36,7 +36,7 @@ import com.google.samples.apps.nowinandroid.core.designsystem.theme.LightDefault import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalBackgroundTheme import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalGradientColors import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme -import org.junit.Assert.assertEquals +import kotlin.test.assertEquals import org.junit.Rule import org.junit.Test diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsStreamUseCaseTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsStreamUseCaseTest.kt index 101590605..a3fff0d20 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsStreamUseCaseTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsStreamUseCaseTest.kt @@ -22,9 +22,9 @@ import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.testing.repository.TestTopicsRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule +import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals import org.junit.Rule import org.junit.Test diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesStreamUseCaseTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesStreamUseCaseTest.kt index c8fa5b949..062fb4dc2 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesStreamUseCaseTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesStreamUseCaseTest.kt @@ -24,10 +24,10 @@ import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.testing.repository.TestNewsRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule +import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import kotlinx.datetime.Instant -import org.junit.Assert.assertEquals import org.junit.Rule import org.junit.Test diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsStreamUseCaseTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsStreamUseCaseTest.kt index a08ca1b3a..24b88a88b 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsStreamUseCaseTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetSortedFollowableAuthorsStreamUseCaseTest.kt @@ -21,9 +21,9 @@ import com.google.samples.apps.nowinandroid.core.model.data.Author import com.google.samples.apps.nowinandroid.core.testing.repository.TestAuthorsRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule +import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals import org.junit.Rule import org.junit.Test diff --git a/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceTest.kt b/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceTest.kt index 2147b8cc4..3d7cbee4a 100644 --- a/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceTest.kt +++ b/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceTest.kt @@ -20,13 +20,13 @@ import JvmUnitTestFakeAssetManager import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Codelab import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic +import kotlin.test.assertEquals import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.runTest import kotlinx.datetime.LocalDateTime import kotlinx.datetime.TimeZone import kotlinx.datetime.toInstant import kotlinx.serialization.json.Json -import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test diff --git a/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializerTest.kt b/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializerTest.kt index c446c7ec3..191501a3d 100644 --- a/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializerTest.kt +++ b/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializerTest.kt @@ -17,8 +17,8 @@ package com.google.samples.apps.nowinandroid.core.network.model.util import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType +import kotlin.test.assertEquals import kotlinx.serialization.json.Json -import org.junit.Assert.assertEquals import org.junit.Test class NewsResourceTypeSerializerTest { diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt index 36e5ff60a..16e86c192 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt @@ -156,12 +156,12 @@ fun NewsResourceAuthors( authors: List ) { if (authors.isNotEmpty()) { - // Only display first author for now - val author = authors[0] + // display all authors + val authorNameFormatted = + authors.joinToString(separator = ", ") { author -> author.name } + .uppercase(Locale.getDefault()) - val authorNameFormatted = author.name.uppercase(Locale.getDefault()) - - val authorImageUrl = author.imageUrl + val authorImageUrl = authors[0].imageUrl val authorImageModifier = Modifier .clip(CircleShape) diff --git a/docs/images/screenshots.png b/docs/images/screenshots.png index 7319fd6d7..92f8b3679 100644 Binary files a/docs/images/screenshots.png and b/docs/images/screenshots.png differ diff --git a/feature/author/src/test/java/com/google/samples/apps/nowinandroid/feature/author/AuthorViewModelTest.kt b/feature/author/src/test/java/com/google/samples/apps/nowinandroid/feature/author/AuthorViewModelTest.kt index aac9617a4..92164ae54 100644 --- a/feature/author/src/test/java/com/google/samples/apps/nowinandroid/feature/author/AuthorViewModelTest.kt +++ b/feature/author/src/test/java/com/google/samples/apps/nowinandroid/feature/author/AuthorViewModelTest.kt @@ -28,6 +28,9 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestNewsRepo import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.feature.author.navigation.authorIdArg +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.assertTrue import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.first @@ -35,8 +38,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import kotlinx.datetime.Instant -import org.junit.Assert.assertEquals -import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule import org.junit.Test @@ -83,15 +84,14 @@ class AuthorViewModelTest { userDataRepository.setFollowedAuthorIds(setOf(testInputAuthors[1].author.id)) val item = viewModel.authorUiState.value - assertTrue(item is AuthorUiState.Success) + assertIs(item) - val successAuthorUiState = item as AuthorUiState.Success val authorFromRepository = authorsRepository.getAuthorStream( id = testInputAuthors[0].author.id ).first() - successAuthorUiState.followableAuthor.author - assertEquals(authorFromRepository, successAuthorUiState.followableAuthor.author) + item.followableAuthor.author + assertEquals(authorFromRepository, item.followableAuthor.author) collectJob.cancel() } @@ -132,8 +132,8 @@ class AuthorViewModelTest { val authorState = viewModel.authorUiState.value val newsUiState = viewModel.newsUiState.value - assertTrue(authorState is AuthorUiState.Success) - assertTrue(newsUiState is NewsUiState.Loading) + assertIs(authorState) + assertIs(newsUiState) collectJob.cancel() } @@ -155,8 +155,8 @@ class AuthorViewModelTest { val authorState = viewModel.authorUiState.value val newsUiState = viewModel.newsUiState.value - assertTrue(authorState is AuthorUiState.Success) - assertTrue(newsUiState is NewsUiState.Success) + assertIs(authorState) + assertIs(newsUiState) collectJob.cancel() } diff --git a/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt b/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt index f018be8c0..1dafc5c98 100644 --- a/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt +++ b/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt @@ -34,8 +34,8 @@ import androidx.compose.ui.test.performScrollToNode import com.google.samples.apps.nowinandroid.core.domain.model.SaveableNewsResource import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState -import org.junit.Assert.assertEquals -import org.junit.Assert.assertTrue +import kotlin.test.assertEquals +import kotlin.test.assertTrue import org.junit.Rule import org.junit.Test diff --git a/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt b/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt index 78d9801b1..03d04af75 100644 --- a/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt +++ b/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt @@ -23,12 +23,12 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState.Loading import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState.Success +import kotlin.test.assertEquals +import kotlin.test.assertIs import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals -import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule import org.junit.Test @@ -69,8 +69,8 @@ class BookmarksViewModelTest { newsRepository.sendNewsResources(previewNewsResources) userDataRepository.updateNewsResourceBookmark(previewNewsResources[0].id, true) val item = viewModel.feedUiState.value - assertTrue(item is Success) - assertEquals((item as Success).feed.size, 1) + assertIs(item) + assertEquals(item.feed.size, 1) collectJob.cancel() } @@ -86,8 +86,8 @@ class BookmarksViewModelTest { viewModel.removeFromSavedResources(previewNewsResources[0].id) // Verify list of saved resources is now empty val item = viewModel.feedUiState.value - assertTrue(item is Success) - assertEquals((item as Success).feed.size, 0) + assertIs(item) + assertEquals(item.feed.size, 0) collectJob.cancel() } diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt index c79c9d777..599bfd868 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt @@ -16,7 +16,6 @@ package com.google.samples.apps.nowinandroid.feature.foryou -import androidx.compose.runtime.snapshotFlow import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.nowinandroid.core.data.repository.UserDataRepository @@ -33,6 +32,7 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flatMapLatest +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn @@ -67,7 +67,7 @@ class ForYouViewModel @Inject constructor( userData.followedAuthors.isEmpty() && userData.followedTopics.isEmpty() ) { - snapshotFlow { NewsFeedUiState.Success(emptyList()) } + flowOf(NewsFeedUiState.Success(emptyList())) } else { getSaveableNewsResourcesStream( filterTopicIds = userData.followedTopics, diff --git a/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt b/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt index 5f21f9d06..daeeb46c2 100644 --- a/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt +++ b/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt @@ -34,13 +34,13 @@ import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.core.testing.util.TestNetworkMonitor import com.google.samples.apps.nowinandroid.core.testing.util.TestSyncStatusMonitor import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState +import kotlin.test.assertEquals import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest import kotlinx.datetime.Instant -import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Rule import org.junit.Test diff --git a/feature/interests/src/test/java/com/google/samples/apps/nowinandroid/interests/InterestsViewModelTest.kt b/feature/interests/src/test/java/com/google/samples/apps/nowinandroid/interests/InterestsViewModelTest.kt index 6ecf3930a..aaac504d3 100644 --- a/feature/interests/src/test/java/com/google/samples/apps/nowinandroid/interests/InterestsViewModelTest.kt +++ b/feature/interests/src/test/java/com/google/samples/apps/nowinandroid/interests/InterestsViewModelTest.kt @@ -28,11 +28,11 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.feature.interests.InterestsUiState import com.google.samples.apps.nowinandroid.feature.interests.InterestsViewModel +import kotlin.test.assertEquals import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Rule import org.junit.Test diff --git a/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt b/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt index b9df2fafd..6d8cf8b13 100644 --- a/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt +++ b/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt @@ -22,7 +22,7 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Loading import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Success -import junit.framework.Assert.assertEquals +import kotlin.test.assertEquals import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher diff --git a/feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt b/feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt index b914856be..17d7b45ee 100644 --- a/feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt +++ b/feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt @@ -28,6 +28,8 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestTopicsRe import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.feature.topic.navigation.topicIdArg +import kotlin.test.assertEquals +import kotlin.test.assertIs import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.first @@ -35,8 +37,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import kotlinx.datetime.Instant -import org.junit.Assert.assertEquals -import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule import org.junit.Test @@ -77,14 +77,13 @@ class TopicViewModelTest { topicsRepository.sendTopics(testInputTopics.map(FollowableTopic::topic)) userDataRepository.setFollowedTopicIds(setOf(testInputTopics[1].topic.id)) val item = viewModel.topicUiState.value - assertTrue(item is TopicUiState.Success) + assertIs(item) - val successTopicState = item as TopicUiState.Success val topicFromRepository = topicsRepository.getTopic( testInputTopics[0].topic.id ).first() - assertEquals(topicFromRepository, successTopicState.followableTopic.topic) + assertEquals(topicFromRepository, item.followableTopic.topic) collectJob.cancel() } @@ -119,8 +118,8 @@ class TopicViewModelTest { val topicUiState = viewModel.topicUiState.value val newsUiState = viewModel.newUiState.value - assertTrue(topicUiState is TopicUiState.Success) - assertTrue(newsUiState is NewsUiState.Loading) + assertIs(topicUiState) + assertIs(newsUiState) collectJob.cancel() } @@ -141,8 +140,8 @@ class TopicViewModelTest { val topicUiState = viewModel.topicUiState.value val newsUiState = viewModel.newUiState.value - assertTrue(topicUiState is TopicUiState.Success) - assertTrue(newsUiState is NewsUiState.Success) + assertIs(topicUiState) + assertIs(newsUiState) collectJob.cancel() } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8d13d36d5..5892e277d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ androidDesugarJdkLibs = "1.2.0" androidGradlePlugin = "7.3.1" androidxActivity = "1.6.1" androidxAppCompat = "1.5.1" -androidxComposeBom = "2022.10.00" +androidxComposeBom = "2022.11.00" androidxComposeCompiler = "1.3.2" androidxComposeRuntimeTracing = "1.0.0-alpha01" androidxCore = "1.9.0" @@ -13,7 +13,7 @@ androidxDataStore = "1.0.0" androidxEspresso = "3.5.0" androidxHiltNavigationCompose = "1.0.0" androidxLifecycle = "2.6.0-alpha03" -androidxMacroBenchmark = "1.1.0" +androidxMacroBenchmark = "1.1.1" androidxNavigation = "2.5.3" androidxMetrics = "1.0.0-alpha03" androidxProfileinstaller = "1.2.0" @@ -27,7 +27,7 @@ androidxTracing = "1.1.0" androidxUiAutomator = "2.2.0" androidxWork = "2.7.1" coil = "2.2.2" -hilt = "2.44" +hilt = "2.44.2" hiltExt = "1.0.0" jacoco = "0.8.7" junit4 = "4.13.2" @@ -35,14 +35,14 @@ kotlin = "1.7.20" kotlinxCoroutines = "1.6.4" kotlinxDatetime = "0.4.0" kotlinxSerializationJson = "1.4.1" -ksp = "1.7.20-1.0.8" +ksp = "1.7.21-1.0.8" lint = "30.3.1" okhttp = "4.10.0" protobuf = "3.21.9" protobufPlugin = "0.8.19" retrofit = "2.9.0" retrofitKotlinxSerializationJson = "0.8.0" -room = "2.5.0-beta01" +room = "2.5.0-beta02" secrets = "2.0.1" turbine = "0.12.1" diff --git a/settings.gradle.kts b/settings.gradle.kts index d8ff0162c..cfa31a150 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -33,7 +33,7 @@ dependencyResolutionManagement { rootProject.name = "nowinandroid" include(":app") include(":app-nia-catalog") -include(":benchmark") +include(":benchmarks") include(":core:common") include(":core:data") include(":core:data-test") diff --git a/sync/README.md b/sync/README.md index 5fb075605..b100e27ad 100644 --- a/sync/README.md +++ b/sync/README.md @@ -1,3 +1,3 @@ # :sync module -![Dependency graph](../docs/images/graphs/dep_graph_lint.png) +![Dependency graph](../docs/images/graphs/dep_graph_sync.png) diff --git a/sync/work/src/androidTest/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorkerTest.kt b/sync/work/src/androidTest/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorkerTest.kt index 3f3fa9d8e..4bcc19be8 100644 --- a/sync/work/src/androidTest/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorkerTest.kt +++ b/sync/work/src/androidTest/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorkerTest.kt @@ -25,7 +25,7 @@ import androidx.work.testing.SynchronousExecutor import androidx.work.testing.WorkManagerTestInitHelper import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest -import org.junit.Assert.assertEquals +import kotlin.test.assertEquals import org.junit.Before import org.junit.Rule import org.junit.Test