Update dependencies and make adjustments based on version migrations

This commit is contained in:
Gergely Hegedus 2021-09-18 13:55:58 +03:00
parent 4147ac7afd
commit 472b7591f5
27 changed files with 120 additions and 97 deletions

View file

@ -83,20 +83,17 @@ afterEvaluate {
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "androidx.core:core-ktx:$androidx_core_version"
implementation "androidx.appcompat:appcompat:$androidx_appcompat_version"
implementation "com.google.android.material:material:$androidx_material_version"
implementation "androidx.constraintlayout:constraintlayout:$androidx_constraintlayout_version"
implementation "androidx.lifecycle:lifecycle-livedata-core-ktx:$androidx_livedata_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$androidx_livedata_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$androidx_livedata_version"
implementation "androidx.swiperefreshlayout:swiperefreshlayout:$androidx_swiperefreshlayout_version"
// Koin
implementation "org.koin:koin-androidx-scope:$koin_version"
implementation "org.koin:koin-androidx-viewmodel:$koin_version"
implementation "org.koin:koin-androidx-fragment:$koin_version"
implementation "io.insert-koin:koin-android:$koin_version"
implementation "androidx.room:room-runtime:$androidx_room_version"
kapt "androidx.room:room-compiler:$androidx_room_version"
@ -113,7 +110,7 @@ dependencies {
testImplementation "org.mockito.kotlin:mockito-kotlin:$testing_kotlin_mockito_version"
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
testImplementation "com.jraska.livedata:testing-ktx:$testing_livedata_version"
testImplementation "org.koin:koin-test:$koin_version"
testImplementation "io.insert-koin:koin-test-junit5:$koin_version"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$testing_junit5_version"
// robolectric specific
@ -130,7 +127,7 @@ dependencies {
testRuntimeOnly "org.junit.vintage:junit-vintage-engine:$testing_junit5_version"
androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
androidTestImplementation "org.koin:koin-test:$koin_version"
androidTestImplementation "io.insert-koin:koin-test-junit4:$koin_version"
androidTestImplementation "junit:junit:$testing_junit4_version"
androidTestImplementation "androidx.test:core:$testing_androidx_code_version"
androidTestImplementation "androidx.test:runner:$testing_androidx_code_version"

View file

@ -22,7 +22,7 @@ object AndroidTestServerTypeConfiguration : ServerTypeConfiguration, KoinTest {
.build()
loadKoinModules(
module {
single(qualifier = sessionless, override = true) { okHttpClientWithCertificate }
single(qualifier = sessionless) { okHttpClientWithCertificate }
}
)
}

View file

@ -1,12 +1,16 @@
package org.fnives.test.showcase.favourite
import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.take
import kotlinx.coroutines.flow.toList
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.TestCoroutineScope
import kotlinx.coroutines.test.runBlockingTest
import org.fnives.test.showcase.core.storage.content.FavouriteContentLocalStorage
import org.fnives.test.showcase.model.content.ContentId
import org.fnives.test.showcase.storage.database.DatabaseInitialization
@ -20,6 +24,7 @@ import org.koin.test.KoinTest
import org.koin.test.inject
@Suppress("TestFunctionName")
@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(AndroidJUnit4::class)
internal class FavouriteContentLocalStorageImplTest : KoinTest {
@ -63,6 +68,7 @@ internal class FavouriteContentLocalStorageImplTest : KoinTest {
runBlocking<Unit> {
val expected = listOf(listOf(), listOf(ContentId("a")))
val testDispatcher = TestCoroutineDispatcher()
val actual = async(testDispatcher) {
sut.observeFavourites().take(2).toList()
}
@ -79,6 +85,7 @@ internal class FavouriteContentLocalStorageImplTest : KoinTest {
val expected = listOf(listOf(ContentId("a")), listOf())
sut.markAsFavourite(ContentId("a"))
val testDispatcher = TestCoroutineDispatcher()
val actual = async(testDispatcher) {
sut.observeFavourites().take(2).toList()
}

View file

@ -4,11 +4,13 @@ import org.fnives.test.showcase.core.login.LoginUseCase
import org.fnives.test.showcase.testutils.InstantExecutorExtension
import org.fnives.test.showcase.testutils.TestMainDispatcher
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.kotlin.mock
@Disabled("CodeKata")
@ExtendWith(InstantExecutorExtension::class, TestMainDispatcher::class)
class CodeKataAuthViewModel {

View file

@ -5,6 +5,7 @@ import org.fnives.test.showcase.testutils.InstantExecutorExtension
import org.fnives.test.showcase.testutils.TestMainDispatcher
import org.fnives.test.showcase.ui.shared.Event
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
@ -12,6 +13,7 @@ import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
@Disabled("CodeKata")
internal class CodeKataSplashViewModelTest {
@BeforeEach

View file

@ -1,2 +1,3 @@
sdk=28
shadows=org.fnives.test.showcase.testutils.shadow.ShadowSnackbar
instrumentedPackages=androidx.loader.content

View file

@ -1,11 +1,11 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.4.32"
ext.kotlin_version = "1.5.30"
ext.detekt_version = "1.16.0"
repositories {
mavenCentral()
google()
maven { url "https://plugins.gradle.org/m2/" }
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.3"
@ -47,8 +47,8 @@ detekt {
allprojects {
repositories {
mavenCentral()
google()
jcenter()
}
}

View file

@ -17,14 +17,19 @@ test {
}
}
compileKotlin {
kotlinOptions {
freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
}
}
dependencies {
api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
api project(":model")
implementation project(":network")
testImplementation "org.koin:koin-test:$koin_version"
testImplementation "io.insert-koin:koin-test-junit5:$koin_version"
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
testImplementation "org.mockito.kotlin:mockito-kotlin:$testing_kotlin_mockito_version"
testImplementation "org.junit.jupiter:junit-jupiter-engine:$testing_junit5_version"

View file

@ -1,5 +1,6 @@
package org.fnives.test.showcase.core.content
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.distinctUntilChanged
@ -24,6 +25,8 @@ internal class ContentRepository(private val contentRemoteSource: ContentRemoteS
}
emit(response)
}
@OptIn(ExperimentalCoroutinesApi::class)
val contents: Flow<Resource<List<Content>>> = mutableContentFlow.flatMapLatest {
if (it.item != null) flowOf(Resource.Success(it.item)) else requestFlow
}

View file

@ -37,7 +37,7 @@ fun createCoreModule(
.plus(repositoryModule())
fun repositoryModule() = module {
single(override = true) { ContentRepository(get()) }
single { ContentRepository(get()) }
}
fun useCaseModule() = module {

View file

@ -12,10 +12,7 @@ import org.fnives.test.showcase.model.content.ContentId
import org.fnives.test.showcase.model.content.ImageUrl
import org.fnives.test.showcase.model.shared.Resource
import org.fnives.test.showcase.network.content.ContentRemoteSource
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.*
import org.mockito.kotlin.doAnswer
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.doSuspendableAnswer
@ -26,6 +23,7 @@ import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.whenever
@Disabled("CodeKata")
class CodeKataContentRepositoryTest {
@BeforeEach

View file

@ -1,5 +1,6 @@
package org.fnives.test.showcase.core.content
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.async
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.take
@ -20,6 +21,7 @@ import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
@Suppress("TestFunctionName")
@OptIn(ExperimentalCoroutinesApi::class)
internal class GetAllContentUseCaseTest {
private lateinit var sut: GetAllContentUseCase
@ -36,13 +38,16 @@ internal class GetAllContentUseCaseTest {
mockContentRepository = mock()
favouriteContentIdFlow = MutableStateFlow(emptyList())
contentFlow = MutableStateFlow(Resource.Loading())
whenever(mockFavouriteContentLocalStorage.observeFavourites()).doReturn(favouriteContentIdFlow)
whenever(mockFavouriteContentLocalStorage.observeFavourites()).doReturn(
favouriteContentIdFlow
)
whenever(mockContentRepository.contents).doReturn(contentFlow)
sut = GetAllContentUseCase(mockContentRepository, mockFavouriteContentLocalStorage)
}
@Test
fun GIVEN_loading_AND_empty_favourite_WHEN_observed_THEN_loading_is_shown() = runBlockingTest(testDispatcher) {
fun GIVEN_loading_AND_empty_favourite_WHEN_observed_THEN_loading_is_shown() =
runBlockingTest(testDispatcher) {
favouriteContentIdFlow.value = emptyList()
contentFlow.value = Resource.Loading()
val expected = Resource.Loading<List<FavouriteContent>>()
@ -53,7 +58,8 @@ internal class GetAllContentUseCaseTest {
}
@Test
fun GIVEN_loading_AND_listOfFavourite_WHEN_observed_THEN_loading_is_shown() = runBlockingTest(testDispatcher) {
fun GIVEN_loading_AND_listOfFavourite_WHEN_observed_THEN_loading_is_shown() =
runBlockingTest(testDispatcher) {
favouriteContentIdFlow.value = listOf(ContentId("a"))
contentFlow.value = Resource.Loading()
val expected = Resource.Loading<List<FavouriteContent>>()
@ -64,7 +70,8 @@ internal class GetAllContentUseCaseTest {
}
@Test
fun GIVEN_error_AND_empty_favourite_WHEN_observed_THEN_error_is_shown() = runBlockingTest(testDispatcher) {
fun GIVEN_error_AND_empty_favourite_WHEN_observed_THEN_error_is_shown() =
runBlockingTest(testDispatcher) {
favouriteContentIdFlow.value = emptyList()
val exception = Throwable()
contentFlow.value = Resource.Error(exception)
@ -76,7 +83,8 @@ internal class GetAllContentUseCaseTest {
}
@Test
fun GIVEN_error_AND_listOfFavourite_WHEN_observed_THEN_error_is_shown() = runBlockingTest(testDispatcher) {
fun GIVEN_error_AND_listOfFavourite_WHEN_observed_THEN_error_is_shown() =
runBlockingTest(testDispatcher) {
favouriteContentIdFlow.value = listOf(ContentId("b"))
val exception = Throwable()
contentFlow.value = Resource.Error(exception)
@ -88,7 +96,8 @@ internal class GetAllContentUseCaseTest {
}
@Test
fun GIVEN_listOfContent_AND_empty_favourite_WHEN_observed_THEN_favourites_are_returned() = runBlockingTest(testDispatcher) {
fun GIVEN_listOfContent_AND_empty_favourite_WHEN_observed_THEN_favourites_are_returned() =
runBlockingTest(testDispatcher) {
favouriteContentIdFlow.value = emptyList()
val content = Content(ContentId("a"), "b", "c", ImageUrl("d"))
contentFlow.value = Resource.Success(listOf(content))

View file

@ -9,12 +9,10 @@ import org.fnives.test.showcase.model.session.Session
import org.fnives.test.showcase.model.shared.Answer
import org.fnives.test.showcase.network.auth.LoginRemoteSource
import org.fnives.test.showcase.network.auth.model.LoginStatusResponses
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.*
import org.mockito.kotlin.*
@Disabled("CodeKata")
class CodeKataSecondLoginUseCaseTest {
@BeforeEach

View file

@ -1,10 +1,12 @@
package org.fnives.test.showcase.core.session
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.mockito.kotlin.*
@Disabled("CodeKata")
class CodeKataFirstSessionExpirationAdapterTest {
}

View file

@ -1 +1 @@
#mock-maker-inline
mock-maker-inline

View file

@ -17,5 +17,6 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
android.jetifier.blacklist=bcprov-jdk15on
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official

View file

@ -1,28 +1,28 @@
project.ext {
androidx_core_version = "1.3.2"
androidx_appcompat_version = "1.2.0"
androidx_material_version = "1.3.0"
androidx_constraintlayout_version = "2.0.4"
androidx_core_version = "1.6.0"
androidx_appcompat_version = "1.3.1"
androidx_material_version = "1.4.0"
androidx_constraintlayout_version = "2.1.0"
androidx_livedata_version = "2.3.1"
androidx_swiperefreshlayout_version = "1.1.0"
androidx_room_version = "2.2.6"
androidx_room_version = "2.3.0"
coroutines_version = "1.4.3"
koin_version = "2.2.2"
koin_version = "3.1.2"
coil_version = "1.1.1"
retrofit_version = "2.9.0"
okhttp_version = "4.9.1"
moshi_version = "1.11.0"
moshi_version = "1.12.0"
testing_androidx_code_version = "1.3.0"
testing_androidx_junit_version = "1.1.2"
testing_androidx_code_version = "1.4.0"
testing_androidx_junit_version = "1.1.3"
testing_androidx_arch_core_version = "2.1.0"
testing_livedata_version = "1.1.2"
testing_livedata_version = "1.2.0"
testing_kotlin_mockito_version = "3.1.0"
testing_junit5_version = "5.7.0"
testing_json_assert_version = "1.5.0"
testing_junit4_version = "4.13.2"
testing_robolectric_version = "4.5.1"
testing_espresso_version = "3.3.0"
testing_robolectric_version = "4.6.1"
testing_espresso_version = "3.4.0"
testing_okhttp3_idling_resource_version = "1.0.0"
}

View file

@ -9,8 +9,6 @@ java {
}
dependencies {
api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
api project(":model")
api "com.squareup.okhttp3:mockwebserver:$okhttp_version"

View file

@ -70,7 +70,7 @@ class MockServerScenarioSetup internal constructor(
companion object {
const val PORT: Int = 7335
val HTTP_BASE_URL get() = "http://${InetAddress.getLocalHost().hostName}"
val HTTP_BASE_URL get() = "http://${InetAddress.getLocalHost().canonicalHostName}"
val HTTPS_BASE_URL get() = "https://localhost"
private fun MockWebServer.useHttps(): HandshakeCertificates {

View file

@ -10,10 +10,6 @@ java {
compileKotlin {
kotlinOptions {
freeCompilerArgs = ["-Xinline-classes"]
freeCompilerArgs += "-Xinline-classes"
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

View file

@ -1,3 +1,4 @@
package org.fnives.test.showcase.model.content
inline class ContentId(val id: String)
@JvmInline
value class ContentId(val id: String)

View file

@ -1,3 +1,4 @@
package org.fnives.test.showcase.model.content
inline class ImageUrl(val url: String)
@JvmInline
value class ImageUrl(val url: String)

View file

@ -1,3 +1,4 @@
package org.fnives.test.showcase.model.network
inline class BaseUrl(val baseUrl: String)
@JvmInline
value class BaseUrl(val baseUrl: String)

View file

@ -19,7 +19,6 @@ test {
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
@ -27,15 +26,15 @@ dependencies {
implementation "com.squareup.moshi:moshi:$moshi_version"
kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
api "org.koin:koin-core:$koin_version"
api "io.insert-koin:koin-core:$koin_version"
api project(":model")
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
testImplementation "org.mockito.kotlin:mockito-kotlin:$testing_kotlin_mockito_version"
testImplementation "org.junit.jupiter:junit-jupiter-engine:5.7.0"
testImplementation "org.junit.jupiter:junit-jupiter-engine:$testing_junit5_version"
testImplementation project(':mockserver')
testImplementation "org.koin:koin-test:$koin_version"
testImplementation "io.insert-koin:koin-test-junit5:$koin_version"
testImplementation "org.skyscreamer:jsonassert:$testing_json_assert_version"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$testing_junit5_version"
}

View file

@ -50,7 +50,7 @@ private fun contentModule() = module {
private fun sessionlessNetworkingModule(baseUrl: BaseUrl, enableLogging: Boolean) = module {
factory { MoshiConverterFactory.create() }
single(qualifier = sessionless, override = true) {
single(qualifier = sessionless) {
OkHttpClient.Builder()
.addInterceptor(PlatformInterceptor())
.setupLogging(enableLogging)

View file

@ -22,6 +22,7 @@ import org.skyscreamer.jsonassert.JSONCompareMode
import java.io.BufferedReader
import java.io.InputStreamReader
@Disabled("CodeKata")
class CodeKataLoginRemoteSourceTest {
@BeforeEach

View file

@ -17,6 +17,7 @@ import org.koin.test.KoinTest
import org.koin.test.inject
import org.mockito.kotlin.*
@Disabled("CodeKata")
class CodeKataSessionExpirationTest : KoinTest {
private val sut by inject<ContentRemoteSource>()