diff --git a/api/build.gradle.kts b/api/build.gradle.kts index c136d2b4..45d4cfe2 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { api(libs.retrofit.lib) api(libs.eithernet) implementation(libs.kotlinx.serialization.core) + testImplementation(testFixtures(libs.eithernet)) testImplementation(libs.kotlinx.coroutines.core) testImplementation(kotlin("test-junit")) testImplementation(libs.kotlinx.serialization.json) diff --git a/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiTest.kt b/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiTest.kt index e73dd01d..73bc68f7 100644 --- a/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiTest.kt +++ b/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiTest.kt @@ -1,52 +1,46 @@ package dev.msfjarvis.claw.api +import com.slack.eithernet.ApiResult.Success +import com.slack.eithernet.test.newEitherNetController +import dev.msfjarvis.claw.model.LobstersPost +import dev.msfjarvis.claw.model.LobstersPostDetails +import dev.msfjarvis.claw.model.User import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertIs import kotlinx.coroutines.runBlocking -import retrofit2.Retrofit -import retrofit2.mock.MockRetrofit -import retrofit2.mock.NetworkBehavior -import retrofit2.mock.create class ApiTest { - private val retrofit = Retrofit.Builder().baseUrl(LobstersApi.BASE_URL).build() - private val networkBehaviour = createNetworkBehaviour() - private val api = - MockRetrofit.Builder(retrofit) - .networkBehavior(networkBehaviour) - .build() - .create() - .let(::FakeApi) - - private fun createNetworkBehaviour(): NetworkBehavior { - val behaviour = NetworkBehavior.create() - behaviour.setFailurePercent(0) - behaviour.setErrorPercent(0) - return behaviour - } + private val wrapper = ApiWrapper(newEitherNetController()) + private val api + get() = wrapper.api @Test fun `api gets correct number of items`() = runBlocking { val posts = api.getHottestPosts(1) - assertEquals(25, posts.size) + assertIs>>(posts) + assertEquals(25, posts.value.size) } @Test fun `posts with no urls`() = runBlocking { val posts = api.getHottestPosts(1) - val commentsOnlyPosts = posts.asSequence().filter { it.url.isEmpty() }.toSet() + assertIs>>(posts) + val commentsOnlyPosts = posts.value.asSequence().filter { it.url.isEmpty() }.toSet() assertEquals(2, commentsOnlyPosts.size) } @Test fun `post details with comments`() = runBlocking { val postDetails = api.getPostDetails("tdfoqh") - assertEquals(7, postDetails.comments.size) + assertIs>(postDetails) + assertEquals(7, postDetails.value.comments.size) } @Test fun `get user details`() = runBlocking { val user = api.getUser("msfjarvis") - assertEquals("msfjarvis", user.username) + assertIs>(user) + assertEquals("msfjarvis", user.value.username) } } diff --git a/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiWrapper.kt b/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiWrapper.kt new file mode 100644 index 00000000..ba14c904 --- /dev/null +++ b/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiWrapper.kt @@ -0,0 +1,28 @@ +package dev.msfjarvis.claw.api + +import com.slack.eithernet.ApiResult.Companion.success +import com.slack.eithernet.test.EitherNetController +import com.slack.eithernet.test.enqueue +import dev.msfjarvis.claw.model.LobstersPost +import dev.msfjarvis.claw.model.LobstersPostDetails +import dev.msfjarvis.claw.model.User +import dev.msfjarvis.claw.util.TestUtils.getJson +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json + +class ApiWrapper(controller: EitherNetController) { + private val json = Json { ignoreUnknownKeys = true } + private val hottest: List = json.decodeFromString(getJson("hottest.json")) + private val postDetails: LobstersPostDetails = + json.decodeFromString(getJson("post_details_tdfoqh.json")) + private val user: User = json.decodeFromString(getJson("msfjarvis.json")) + + val api = controller.api + + init { + controller.enqueue(LobstersApi::getHottestPosts) { success(hottest) } + controller.enqueue(LobstersApi::getNewestPosts) { success(hottest) } + controller.enqueue(LobstersApi::getPostDetails) { success(postDetails) } + controller.enqueue(LobstersApi::getUser) { success(user) } + } +} diff --git a/api/src/test/kotlin/dev/msfjarvis/claw/api/FakeApi.kt b/api/src/test/kotlin/dev/msfjarvis/claw/api/FakeApi.kt deleted file mode 100644 index c7b1fd33..00000000 --- a/api/src/test/kotlin/dev/msfjarvis/claw/api/FakeApi.kt +++ /dev/null @@ -1,33 +0,0 @@ -package dev.msfjarvis.claw.api - -import dev.msfjarvis.claw.model.LobstersPost -import dev.msfjarvis.claw.model.LobstersPostDetails -import dev.msfjarvis.claw.model.User -import dev.msfjarvis.claw.util.TestUtils.getJson -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.Json -import retrofit2.mock.BehaviorDelegate - -class FakeApi(private val delegate: BehaviorDelegate) : LobstersApi { - private val json = Json { ignoreUnknownKeys = true } - private val hottest: List = json.decodeFromString(getJson("hottest.json")) - private val postDetails: LobstersPostDetails = - json.decodeFromString(getJson("post_details_tdfoqh.json")) - private val user: User = json.decodeFromString(getJson("msfjarvis.json")) - - override suspend fun getHottestPosts(page: Int): List { - return delegate.returningResponse(hottest).getHottestPosts(page) - } - - override suspend fun getNewestPosts(page: Int): List { - TODO("Not yet implemented") - } - - override suspend fun getPostDetails(postId: String): LobstersPostDetails { - return delegate.returningResponse(postDetails).getPostDetails(postId) - } - - override suspend fun getUser(username: String): User { - return delegate.returningResponse(user).getUser(username) - } -}