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

View file

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

View file

@ -1,12 +1,16 @@
package org.fnives.test.showcase.favourite package org.fnives.test.showcase.favourite
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.take import kotlinx.coroutines.flow.take
import kotlinx.coroutines.flow.toList import kotlinx.coroutines.flow.toList
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.TestCoroutineDispatcher 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.core.storage.content.FavouriteContentLocalStorage
import org.fnives.test.showcase.model.content.ContentId import org.fnives.test.showcase.model.content.ContentId
import org.fnives.test.showcase.storage.database.DatabaseInitialization import org.fnives.test.showcase.storage.database.DatabaseInitialization
@ -20,6 +24,7 @@ import org.koin.test.KoinTest
import org.koin.test.inject import org.koin.test.inject
@Suppress("TestFunctionName") @Suppress("TestFunctionName")
@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
internal class FavouriteContentLocalStorageImplTest : KoinTest { internal class FavouriteContentLocalStorageImplTest : KoinTest {
@ -39,12 +44,12 @@ internal class FavouriteContentLocalStorageImplTest : KoinTest {
@Test @Test
fun GIVEN_content_id_WHEN_added_to_Favourite_THEN_it_can_be_read_out() = runBlocking { fun GIVEN_content_id_WHEN_added_to_Favourite_THEN_it_can_be_read_out() = runBlocking {
val expected = listOf(ContentId("a")) val expected = listOf(ContentId("a"))
sut.markAsFavourite(ContentId("a")) sut.markAsFavourite(ContentId("a"))
val actual = sut.observeFavourites().first() val actual = sut.observeFavourites().first()
Assert.assertEquals(expected, actual) Assert.assertEquals(expected, actual)
} }
@Test @Test
@ -63,6 +68,7 @@ internal class FavouriteContentLocalStorageImplTest : KoinTest {
runBlocking<Unit> { runBlocking<Unit> {
val expected = listOf(listOf(), listOf(ContentId("a"))) val expected = listOf(listOf(), listOf(ContentId("a")))
val testDispatcher = TestCoroutineDispatcher()
val actual = async(testDispatcher) { val actual = async(testDispatcher) {
sut.observeFavourites().take(2).toList() sut.observeFavourites().take(2).toList()
} }
@ -79,6 +85,7 @@ internal class FavouriteContentLocalStorageImplTest : KoinTest {
val expected = listOf(listOf(ContentId("a")), listOf()) val expected = listOf(listOf(ContentId("a")), listOf())
sut.markAsFavourite(ContentId("a")) sut.markAsFavourite(ContentId("a"))
val testDispatcher = TestCoroutineDispatcher()
val actual = async(testDispatcher) { val actual = async(testDispatcher) {
sut.observeFavourites().take(2).toList() 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.InstantExecutorExtension
import org.fnives.test.showcase.testutils.TestMainDispatcher import org.fnives.test.showcase.testutils.TestMainDispatcher
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
@Disabled("CodeKata")
@ExtendWith(InstantExecutorExtension::class, TestMainDispatcher::class) @ExtendWith(InstantExecutorExtension::class, TestMainDispatcher::class)
class CodeKataAuthViewModel { 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.testutils.TestMainDispatcher
import org.fnives.test.showcase.ui.shared.Event import org.fnives.test.showcase.ui.shared.Event
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith 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.mock
import org.mockito.kotlin.whenever import org.mockito.kotlin.whenever
@Disabled("CodeKata")
internal class CodeKataSplashViewModelTest { internal class CodeKataSplashViewModelTest {
@BeforeEach @BeforeEach

View file

@ -1,2 +1,3 @@
sdk=28 sdk=28
shadows=org.fnives.test.showcase.testutils.shadow.ShadowSnackbar 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. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = "1.4.32" ext.kotlin_version = "1.5.30"
ext.detekt_version = "1.16.0" ext.detekt_version = "1.16.0"
repositories { repositories {
mavenCentral()
google() google()
maven { url "https://plugins.gradle.org/m2/" } maven { url "https://plugins.gradle.org/m2/" }
jcenter()
} }
dependencies { dependencies {
classpath "com.android.tools.build:gradle:4.1.3" classpath "com.android.tools.build:gradle:4.1.3"
@ -47,8 +47,8 @@ detekt {
allprojects { allprojects {
repositories { repositories {
mavenCentral()
google() google()
jcenter()
} }
} }

View file

@ -17,14 +17,19 @@ test {
} }
} }
compileKotlin {
kotlinOptions {
freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
}
}
dependencies { dependencies {
api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
api project(":model") api project(":model")
implementation project(":network") 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.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
testImplementation "org.mockito.kotlin:mockito-kotlin:$testing_kotlin_mockito_version" testImplementation "org.mockito.kotlin:mockito-kotlin:$testing_kotlin_mockito_version"
testImplementation "org.junit.jupiter:junit-jupiter-engine:$testing_junit5_version" testImplementation "org.junit.jupiter:junit-jupiter-engine:$testing_junit5_version"

View file

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

View file

@ -37,7 +37,7 @@ fun createCoreModule(
.plus(repositoryModule()) .plus(repositoryModule())
fun repositoryModule() = module { fun repositoryModule() = module {
single(override = true) { ContentRepository(get()) } single { ContentRepository(get()) }
} }
fun useCaseModule() = module { 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.content.ImageUrl
import org.fnives.test.showcase.model.shared.Resource import org.fnives.test.showcase.model.shared.Resource
import org.fnives.test.showcase.network.content.ContentRemoteSource import org.fnives.test.showcase.network.content.ContentRemoteSource
import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.mockito.kotlin.doAnswer import org.mockito.kotlin.doAnswer
import org.mockito.kotlin.doReturn import org.mockito.kotlin.doReturn
import org.mockito.kotlin.doSuspendableAnswer import org.mockito.kotlin.doSuspendableAnswer
@ -26,6 +23,7 @@ import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.whenever import org.mockito.kotlin.whenever
@Disabled("CodeKata")
class CodeKataContentRepositoryTest { class CodeKataContentRepositoryTest {
@BeforeEach @BeforeEach

View file

@ -1,5 +1,6 @@
package org.fnives.test.showcase.core.content package org.fnives.test.showcase.core.content
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.take import kotlinx.coroutines.flow.take
@ -20,6 +21,7 @@ import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever import org.mockito.kotlin.whenever
@Suppress("TestFunctionName") @Suppress("TestFunctionName")
@OptIn(ExperimentalCoroutinesApi::class)
internal class GetAllContentUseCaseTest { internal class GetAllContentUseCaseTest {
private lateinit var sut: GetAllContentUseCase private lateinit var sut: GetAllContentUseCase
@ -36,71 +38,78 @@ internal class GetAllContentUseCaseTest {
mockContentRepository = mock() mockContentRepository = mock()
favouriteContentIdFlow = MutableStateFlow(emptyList()) favouriteContentIdFlow = MutableStateFlow(emptyList())
contentFlow = MutableStateFlow(Resource.Loading()) contentFlow = MutableStateFlow(Resource.Loading())
whenever(mockFavouriteContentLocalStorage.observeFavourites()).doReturn(favouriteContentIdFlow) whenever(mockFavouriteContentLocalStorage.observeFavourites()).doReturn(
favouriteContentIdFlow
)
whenever(mockContentRepository.contents).doReturn(contentFlow) whenever(mockContentRepository.contents).doReturn(contentFlow)
sut = GetAllContentUseCase(mockContentRepository, mockFavouriteContentLocalStorage) sut = GetAllContentUseCase(mockContentRepository, mockFavouriteContentLocalStorage)
} }
@Test @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() =
favouriteContentIdFlow.value = emptyList() runBlockingTest(testDispatcher) {
contentFlow.value = Resource.Loading() favouriteContentIdFlow.value = emptyList()
val expected = Resource.Loading<List<FavouriteContent>>() contentFlow.value = Resource.Loading()
val expected = Resource.Loading<List<FavouriteContent>>()
val actual = sut.get().take(1).toList() val actual = sut.get().take(1).toList()
Assertions.assertEquals(listOf(expected), actual) Assertions.assertEquals(listOf(expected), actual)
} }
@Test @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() =
favouriteContentIdFlow.value = listOf(ContentId("a")) runBlockingTest(testDispatcher) {
contentFlow.value = Resource.Loading() favouriteContentIdFlow.value = listOf(ContentId("a"))
val expected = Resource.Loading<List<FavouriteContent>>() contentFlow.value = Resource.Loading()
val expected = Resource.Loading<List<FavouriteContent>>()
val actual = sut.get().take(1).toList() val actual = sut.get().take(1).toList()
Assertions.assertEquals(listOf(expected), actual) Assertions.assertEquals(listOf(expected), actual)
} }
@Test @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() =
favouriteContentIdFlow.value = emptyList() runBlockingTest(testDispatcher) {
val exception = Throwable() favouriteContentIdFlow.value = emptyList()
contentFlow.value = Resource.Error(exception) val exception = Throwable()
val expected = Resource.Error<List<FavouriteContent>>(exception) contentFlow.value = Resource.Error(exception)
val expected = Resource.Error<List<FavouriteContent>>(exception)
val actual = sut.get().take(1).toList() val actual = sut.get().take(1).toList()
Assertions.assertEquals(listOf(expected), actual) Assertions.assertEquals(listOf(expected), actual)
} }
@Test @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() =
favouriteContentIdFlow.value = listOf(ContentId("b")) runBlockingTest(testDispatcher) {
val exception = Throwable() favouriteContentIdFlow.value = listOf(ContentId("b"))
contentFlow.value = Resource.Error(exception) val exception = Throwable()
val expected = Resource.Error<List<FavouriteContent>>(exception) contentFlow.value = Resource.Error(exception)
val expected = Resource.Error<List<FavouriteContent>>(exception)
val actual = sut.get().take(1).toList() val actual = sut.get().take(1).toList()
Assertions.assertEquals(listOf(expected), actual) Assertions.assertEquals(listOf(expected), actual)
} }
@Test @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() =
favouriteContentIdFlow.value = emptyList() runBlockingTest(testDispatcher) {
val content = Content(ContentId("a"), "b", "c", ImageUrl("d")) favouriteContentIdFlow.value = emptyList()
contentFlow.value = Resource.Success(listOf(content)) val content = Content(ContentId("a"), "b", "c", ImageUrl("d"))
val items = listOf( contentFlow.value = Resource.Success(listOf(content))
FavouriteContent(content, false) val items = listOf(
) FavouriteContent(content, false)
val expected = Resource.Success(items) )
val expected = Resource.Success(items)
val actual = sut.get().take(1).toList() val actual = sut.get().take(1).toList()
Assertions.assertEquals(listOf(expected), actual) Assertions.assertEquals(listOf(expected), actual)
} }
@Test @Test
fun GIVEN_listOfContent_AND_other_favourite_id_WHEN_observed_THEN_favourites_are_returned() = fun GIVEN_listOfContent_AND_other_favourite_id_WHEN_observed_THEN_favourites_are_returned() =

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.model.shared.Answer
import org.fnives.test.showcase.network.auth.LoginRemoteSource import org.fnives.test.showcase.network.auth.LoginRemoteSource
import org.fnives.test.showcase.network.auth.model.LoginStatusResponses import org.fnives.test.showcase.network.auth.model.LoginStatusResponses
import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.mockito.kotlin.* import org.mockito.kotlin.*
@Disabled("CodeKata")
class CodeKataSecondLoginUseCaseTest { class CodeKataSecondLoginUseCaseTest {
@BeforeEach @BeforeEach

View file

@ -1,10 +1,12 @@
package org.fnives.test.showcase.core.session package org.fnives.test.showcase.core.session
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.mockito.kotlin.* import org.mockito.kotlin.*
@Disabled("CodeKata")
class CodeKataFirstSessionExpirationAdapterTest { 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 android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX # Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true android.enableJetifier=true
android.jetifier.blacklist=bcprov-jdk15on
# Kotlin code style for this project: "official" or "obsolete": # Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official kotlin.code.style=official

View file

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

View file

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

View file

@ -70,7 +70,7 @@ class MockServerScenarioSetup internal constructor(
companion object { companion object {
const val PORT: Int = 7335 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" val HTTPS_BASE_URL get() = "https://localhost"
private fun MockWebServer.useHttps(): HandshakeCertificates { private fun MockWebServer.useHttps(): HandshakeCertificates {

View file

@ -10,10 +10,6 @@ java {
compileKotlin { compileKotlin {
kotlinOptions { 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 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 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 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 { dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
@ -27,15 +26,15 @@ dependencies {
implementation "com.squareup.moshi:moshi:$moshi_version" implementation "com.squareup.moshi:moshi:$moshi_version"
kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version" kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_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") api project(":model")
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version" testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
testImplementation "org.mockito.kotlin:mockito-kotlin:$testing_kotlin_mockito_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 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" testImplementation "org.skyscreamer:jsonassert:$testing_json_assert_version"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$testing_junit5_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 { private fun sessionlessNetworkingModule(baseUrl: BaseUrl, enableLogging: Boolean) = module {
factory { MoshiConverterFactory.create() } factory { MoshiConverterFactory.create() }
single(qualifier = sessionless, override = true) { single(qualifier = sessionless) {
OkHttpClient.Builder() OkHttpClient.Builder()
.addInterceptor(PlatformInterceptor()) .addInterceptor(PlatformInterceptor())
.setupLogging(enableLogging) .setupLogging(enableLogging)

View file

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

View file

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