From 73a9960cbd9b6e8a96568e1743ae49704815ec02 Mon Sep 17 00:00:00 2001
From: Maximillian Leonov <91663102+MaximillianLeonov@users.noreply.github.com>
Date: Fri, 7 Oct 2022 14:35:32 +0400
Subject: [PATCH 01/18] Remove redundant unused color resources
---
app/src/main/res/values/colors.xml | 6 ------
1 file changed, 6 deletions(-)
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
From f16b698ba69b3d77d84034a3d3d633733a336134 Mon Sep 17 00:00:00 2001
From: Maximillian Leonov <91663102+MaximillianLeonov@users.noreply.github.com>
Date: Fri, 7 Oct 2022 14:45:43 +0400
Subject: [PATCH 02/18] Remove redundant label on activity
---
app/src/main/AndroidManifest.xml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 821bc605e..8811851a5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -32,8 +32,7 @@
+ android:exported="true">
From 7f93eeadcd5c4ba68c1a77e01d14ac4af3b756d1 Mon Sep 17 00:00:00 2001
From: mlykotom
Date: Fri, 4 Nov 2022 12:41:10 +0100
Subject: [PATCH 03/18] Store run configuration for generating demo flavor
Baseline Profile
---
.run/Generate Demo Baseline Profile.run.xml | 23 +++++++++++++++++++++
benchmark/build.gradle.kts | 6 +++---
2 files changed, 26 insertions(+), 3 deletions(-)
create mode 100644 .run/Generate Demo Baseline Profile.run.xml
diff --git a/.run/Generate Demo Baseline Profile.run.xml b/.run/Generate Demo Baseline Profile.run.xml
new file mode 100644
index 000000000..ac47f3971
--- /dev/null
+++ b/.run/Generate Demo Baseline Profile.run.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+ false
+
+
+
\ No newline at end of file
diff --git a/benchmark/build.gradle.kts b/benchmark/build.gradle.kts
index 931fd6d00..0cbde5bd3 100644
--- a/benchmark/build.gradle.kts
+++ b/benchmark/build.gradle.kts
@@ -55,9 +55,9 @@ android {
testOptions {
managedDevices {
devices {
- create("pixel5Api30") {
- device = "Pixel 5"
- apiLevel = 30
+ create("pixel6Api31") {
+ device = "Pixel 6"
+ apiLevel = 31
systemImageSource = "aosp"
}
}
From 63cfa19af223ec403d92730f8b4626833d0d2f3d Mon Sep 17 00:00:00 2001
From: Maximillian Leonov <91663102+MaximillianLeonov@users.noreply.github.com>
Date: Fri, 4 Nov 2022 19:42:25 +0400
Subject: [PATCH 04/18] Fix sync module README graph image
---
sync/README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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
-
+
From af4d0fb87d582c3a0b54b181f335b5f44f6c2766 Mon Sep 17 00:00:00 2001
From: mlykotom
Date: Mon, 7 Nov 2022 14:52:05 +0100
Subject: [PATCH 05/18] Add comments to run configuration
---
.run/Generate Demo Baseline Profile.run.xml | 23 ++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/.run/Generate Demo Baseline Profile.run.xml b/.run/Generate Demo Baseline Profile.run.xml
index ac47f3971..68174ea4b 100644
--- a/.run/Generate Demo Baseline Profile.run.xml
+++ b/.run/Generate Demo Baseline Profile.run.xml
@@ -1,9 +1,30 @@
+
+
+
+
@@ -20,4 +41,4 @@
false
-
\ No newline at end of file
+
From e050c22c882723083790d1e8bc0de1a11561f4f0 Mon Sep 17 00:00:00 2001
From: Simon Marquis
Date: Thu, 10 Nov 2022 21:22:37 +0000
Subject: [PATCH 06/18] Remove test dependency from `implementation`
configuration, fixes #411
---
app/build.gradle.kts | 1 -
1 file changed, 1 deletion(-)
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index b67a3f965..3bf4fae6d 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -91,7 +91,6 @@ dependencies {
implementation(project(":core:model"))
implementation(project(":sync:work"))
- implementation(project(":sync:sync-test"))
androidTestImplementation(project(":core:testing"))
androidTestImplementation(project(":core:datastore-test"))
From 90dc3007839073e333889e05d743af8014c346c9 Mon Sep 17 00:00:00 2001
From: Simon Marquis
Date: Fri, 11 Nov 2022 16:15:33 +0100
Subject: [PATCH 07/18] Migrate from JUnit assertions to Kotlin's test
framework
Fixes #419
---
app/build.gradle.kts | 1 +
.../apps/nowinandroid/ui/NiaAppStateTest.kt | 6 +++---
.../kotlin/AndroidFeatureConventionPlugin.kt | 3 +++
.../kotlin/AndroidLibraryConventionPlugin.kt | 5 +++++
.../nowinandroid/core/result/ResultKtTest.kt | 2 +-
.../core/data/model/NetworkEntityKtTest.kt | 2 +-
.../OfflineFirstAuthorsRepositoryTest.kt | 16 +++++++-------
.../OfflineFirstNewsRepositoryTest.kt | 6 +++---
.../OfflineFirstTopicsRepositoryTest.kt | 16 +++++++-------
.../OfflineFirstUserDataRepositoryTest.kt | 8 ++++---
.../model/PopulatedNewsResourceKtTest.kt | 2 +-
.../util/NewsResourceTypeConverterTest.kt | 2 +-
.../core/database/dao/NewsResourceDaoTest.kt | 2 +-
.../datastore/IntToStringIdsMigrationTest.kt | 4 ++--
.../core/datastore/ListToMapMigrationTest.kt | 21 ++++++++++---------
.../datastore/NiaPreferencesDataSourceTest.kt | 19 +++++++++--------
.../UserPreferencesSerializerTest.kt | 2 +-
.../core/designsystem/ThemeTest.kt | 2 +-
.../GetFollowableTopicsStreamUseCaseTest.kt | 2 +-
...tSaveableNewsResourcesStreamUseCaseTest.kt | 2 +-
...ortedFollowableAuthorsStreamUseCaseTest.kt | 2 +-
.../fake/FakeNiaNetworkDataSourceTest.kt | 2 +-
.../util/NewsResourceTypeSerializerTest.kt | 2 +-
.../feature/author/AuthorViewModelTest.kt | 20 +++++++++---------
.../feature/bookmarks/BookmarksScreenTest.kt | 4 ++--
.../bookmarks/BookmarksViewModelTest.kt | 12 +++++------
.../feature/foryou/ForYouViewModelTest.kt | 2 +-
.../interests/InterestsViewModelTest.kt | 2 +-
.../feature/settings/SettingsViewModelTest.kt | 2 +-
.../feature/topic/TopicViewModelTest.kt | 17 +++++++--------
.../sync/workers/SyncWorkerTest.kt | 2 +-
31 files changed, 101 insertions(+), 89 deletions(-)
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index c4d60e202..6dbe922b2 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -98,6 +98,7 @@ dependencies {
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/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 78d28d98b..bb497a694 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
@@ -16,10 +16,10 @@
package com.google.samples.apps.nowinandroid.core.network.fake
+import kotlin.test.assertEquals
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.runTest
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/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..8bca5b5ee 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
@@ -35,11 +35,12 @@ 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
+import kotlin.test.assertEquals
+import kotlin.test.assertIs
+import kotlin.test.assertTrue
/**
* To learn more about how this test handles Flows created with stateIn, see
@@ -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..ee7513420 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
@@ -27,11 +27,11 @@ 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
+import kotlin.test.assertEquals
+import kotlin.test.assertIs
/**
* To learn more about how this test handles Flows created with stateIn, see
@@ -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/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..603a42bed 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
@@ -40,10 +40,10 @@ 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
+import kotlin.test.assertEquals
/**
* To learn more about how this test handles Flows created with stateIn, see
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..b00e05cae 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
@@ -35,11 +35,11 @@ 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
+import kotlin.test.assertEquals
+import kotlin.test.assertIs
/**
* To learn more about how this test handles Flows created with stateIn, see
@@ -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/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
From 671a048e7c4cf5e3e635b35008dbe4ff453c6a08 Mon Sep 17 00:00:00 2001
From: Simon Marquis
Date: Fri, 11 Nov 2022 16:19:33 +0100
Subject: [PATCH 08/18] Fix spotless issues
---
.../apps/nowinandroid/feature/author/AuthorViewModelTest.kt | 6 +++---
.../feature/bookmarks/BookmarksViewModelTest.kt | 4 ++--
.../apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt | 2 +-
.../apps/nowinandroid/feature/topic/TopicViewModelTest.kt | 4 ++--
4 files changed, 8 insertions(+), 8 deletions(-)
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 8bca5b5ee..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
@@ -38,9 +41,6 @@ import kotlinx.datetime.Instant
import org.junit.Before
import org.junit.Rule
import org.junit.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertIs
-import kotlin.test.assertTrue
/**
* To learn more about how this test handles Flows created with stateIn, see
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 ee7513420..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,6 +23,8 @@ 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
@@ -30,8 +32,6 @@ import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Rule
import org.junit.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertIs
/**
* To learn more about how this test handles Flows created with stateIn, see
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 603a42bed..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,6 +34,7 @@ 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
@@ -43,7 +44,6 @@ import kotlinx.datetime.Instant
import org.junit.Before
import org.junit.Rule
import org.junit.Test
-import kotlin.test.assertEquals
/**
* To learn more about how this test handles Flows created with stateIn, see
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 b00e05cae..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
@@ -38,8 +40,6 @@ import kotlinx.datetime.Instant
import org.junit.Before
import org.junit.Rule
import org.junit.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertIs
/**
* To learn more about how this test handles Flows created with stateIn, see
From dcf0bf475abaa757539b9fa16467f887015aa033 Mon Sep 17 00:00:00 2001
From: Don Turner
Date: Fri, 11 Nov 2022 18:33:47 +0000
Subject: [PATCH 09/18] Remove --stacktrace from CI as it's difficult to find
the error
Change-Id: Ie7be474a24367b17658a04a281bf8051f3f5ffd1
---
.github/workflows/Build.yaml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
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()
From 006d9ecd681a951d000365711991ce996c125f39 Mon Sep 17 00:00:00 2001
From: Adetunji Dahunsi
Date: Fri, 11 Nov 2022 07:57:24 -0500
Subject: [PATCH 10/18] Update sample tags
Change-Id: I295377976053383ce8114e88bf893b25d487b915
---
.google/packaging.yaml | 20 ++++++++++++++++++--
docs/images/screenshots.png | Bin 165019 -> 571706 bytes
2 files changed, 18 insertions(+), 2 deletions(-)
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/docs/images/screenshots.png b/docs/images/screenshots.png
index 7319fd6d762215567d9a50663f6b7f515364c571..92f8b3679ad03cf3c4b255a1cd5562c414c0e21c 100644
GIT binary patch
literal 571706
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