diff --git a/core/build.gradle b/core/build.gradle index a66b8fc..5789c72 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -36,4 +36,6 @@ dependencies { testImplementation "org.mockito.kotlin:mockito-kotlin:$testing_kotlin_mockito_version" testImplementation "org.junit.jupiter:junit-jupiter-engine:$testing_junit5_version" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$testing_junit5_version" + kaptTest "com.google.dagger:dagger-compiler:$hilt_version" + testImplementation "com.squareup.retrofit2:retrofit:$retrofit_version" } \ No newline at end of file diff --git a/core/src/test/java/org/fnives/test/showcase/core/login/hilt/LogoutUseCaseTest.kt b/core/src/test/java/org/fnives/test/showcase/core/login/hilt/LogoutUseCaseTest.kt new file mode 100644 index 0000000..6e92568 --- /dev/null +++ b/core/src/test/java/org/fnives/test/showcase/core/login/hilt/LogoutUseCaseTest.kt @@ -0,0 +1,62 @@ +package org.fnives.test.showcase.core.login.hilt + +import kotlinx.coroutines.test.runBlockingTest +import org.fnives.test.showcase.core.content.ContentRepository +import org.fnives.test.showcase.core.di.koin.createCoreModule +import org.fnives.test.showcase.core.login.LogoutUseCase +import org.fnives.test.showcase.core.storage.UserDataLocalStorage +import org.fnives.test.showcase.model.network.BaseUrl +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.koin.core.context.startKoin +import org.koin.core.context.stopKoin +import org.koin.test.KoinTest +import org.mockito.kotlin.mock +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.verifyNoMoreInteractions +import org.mockito.kotlin.verifyZeroInteractions +import javax.inject.Inject + +@Suppress("TestFunctionName") +internal class LogoutUseCaseTest { + + @Inject + lateinit var sut: LogoutUseCase + private lateinit var mockUserDataLocalStorage: UserDataLocalStorage + private lateinit var testCoreComponent: TestCoreComponent + @Inject + lateinit var contentRepository: ContentRepository + + @BeforeEach + fun setUp() { + mockUserDataLocalStorage = mock() + testCoreComponent = DaggerTestCoreComponent.builder() + .setBaseUrl("https://a.b.com") + .setEnableLogging(true) + .setSessionExpirationListener(mock()) + .setUserDataLocalStorage(mockUserDataLocalStorage) + .build() + testCoreComponent.inject(this) + } + + @Test + fun WHEN_no_call_THEN_storage_is_not_interacted() { + verifyZeroInteractions(mockUserDataLocalStorage) + } + + @Test + fun WHEN_logout_invoked_THEN_storage_is_cleared() = runBlockingTest { + val repositoryBefore = contentRepository + + sut.invoke() + + testCoreComponent.inject(this@LogoutUseCaseTest) + val repositoryAfter = contentRepository + verify(mockUserDataLocalStorage, times(1)).session = null + verifyNoMoreInteractions(mockUserDataLocalStorage) + Assertions.assertNotSame(repositoryBefore, repositoryAfter) + } +} diff --git a/core/src/test/java/org/fnives/test/showcase/core/login/hilt/TestCoreComponent.kt b/core/src/test/java/org/fnives/test/showcase/core/login/hilt/TestCoreComponent.kt new file mode 100644 index 0000000..4b78373 --- /dev/null +++ b/core/src/test/java/org/fnives/test/showcase/core/login/hilt/TestCoreComponent.kt @@ -0,0 +1,36 @@ +package org.fnives.test.showcase.core.login.hilt + +import dagger.BindsInstance +import dagger.Component +import org.fnives.test.showcase.core.di.hilt.CoreModule +import org.fnives.test.showcase.core.di.hilt.ReloadLoggedInModuleInjectModuleImpl +import org.fnives.test.showcase.core.session.SessionExpirationListener +import org.fnives.test.showcase.core.storage.UserDataLocalStorage +import org.fnives.test.showcase.network.di.hilt.HiltNetworkModule +import javax.inject.Singleton + +@Singleton +@Component(modules = [CoreModule::class, HiltNetworkModule::class, ReloadLoggedInModuleInjectModuleImpl::class]) +internal interface TestCoreComponent { + + + @Component.Builder + interface Builder { + + @BindsInstance + fun setBaseUrl(baseUrl: String): Builder + + @BindsInstance + fun setEnableLogging(enableLogging: Boolean): Builder + + @BindsInstance + fun setSessionExpirationListener(listener: SessionExpirationListener): Builder + + @BindsInstance + fun setUserDataLocalStorage(storage: UserDataLocalStorage): Builder + + fun build(): TestCoreComponent + } + + fun inject(logoutUseCaseTest: LogoutUseCaseTest) +} \ No newline at end of file diff --git a/core/src/test/java/org/fnives/test/showcase/core/login/LogoutUseCaseTest.kt b/core/src/test/java/org/fnives/test/showcase/core/login/koin/LogoutUseCaseTest.kt similarity index 95% rename from core/src/test/java/org/fnives/test/showcase/core/login/LogoutUseCaseTest.kt rename to core/src/test/java/org/fnives/test/showcase/core/login/koin/LogoutUseCaseTest.kt index 5e75644..78574fe 100644 --- a/core/src/test/java/org/fnives/test/showcase/core/login/LogoutUseCaseTest.kt +++ b/core/src/test/java/org/fnives/test/showcase/core/login/koin/LogoutUseCaseTest.kt @@ -1,8 +1,9 @@ -package org.fnives.test.showcase.core.login +package org.fnives.test.showcase.core.login.koin import kotlinx.coroutines.test.runBlockingTest import org.fnives.test.showcase.core.content.ContentRepository import org.fnives.test.showcase.core.di.koin.createCoreModule +import org.fnives.test.showcase.core.login.LogoutUseCase import org.fnives.test.showcase.core.storage.UserDataLocalStorage import org.fnives.test.showcase.model.network.BaseUrl import org.junit.jupiter.api.AfterEach