From eba5d649981cdfa41906ffc07232a9864cabee47 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Wed, 30 Nov 2022 01:47:17 +0530 Subject: [PATCH] refactor: migrate all tests to kotest --- api/build.gradle.kts | 4 +- .../kotlin/dev/msfjarvis/claw/api/ApiTest.kt | 56 +++-- .../dev/msfjarvis/claw/api/ApiWrapper.kt | 2 +- .../aps/gradle/KotlinCommonPlugin.kt | 1 + database/build.gradle.kts | 5 +- .../database/local/SqlDelightQueriesTest.kt | 201 ++++++++---------- 6 files changed, 125 insertions(+), 144 deletions(-) diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 94b0aa3e..751c065d 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -25,8 +25,8 @@ dependencies { implementation(libs.dagger) implementation(libs.javax.inject) testImplementation(testFixtures(libs.eithernet)) - testImplementation(kotlin("test-junit")) - testImplementation(libs.kotlinx.coroutines.core) + testImplementation(libs.kotest.assertions.core) + testImplementation(libs.kotest.runner.junit5) testImplementation(libs.kotlinx.serialization.json) testImplementation(libs.retrofit.kotlinxSerializationConverter) } 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 3ec8a0dd..66eb3f52 100644 --- a/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiTest.kt +++ b/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiTest.kt @@ -11,42 +11,40 @@ 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 io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.shouldBe +import io.kotest.matchers.types.shouldBeTypeOf -class ApiTest { +class ApiTest : FunSpec() { 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) - assertIs>>(posts) - assertEquals(25, posts.value.size) - } + init { + test("api gets correct number of items") { + val posts = api.getHottestPosts(1) + posts.shouldBeTypeOf>>() + posts.value shouldHaveSize 25 + } - @Test - fun `posts with no urls`() = runBlocking { - val posts = api.getHottestPosts(1) - assertIs>>(posts) - val commentsOnlyPosts = posts.value.asSequence().filter { it.url.isEmpty() }.toSet() - assertEquals(2, commentsOnlyPosts.size) - } + test("posts with no urls") { + val posts = api.getHottestPosts(1) + posts.shouldBeTypeOf>>() + val commentsOnlyPosts = posts.value.asSequence().filter { it.url.isEmpty() }.toSet() + commentsOnlyPosts shouldHaveSize 2 + } - @Test - fun `post details with comments`() = runBlocking { - val postDetails = api.getPostDetails("tdfoqh") - assertIs>(postDetails) - assertEquals(7, postDetails.value.comments.size) - } + test("post details with comments") { + val postDetails = api.getPostDetails("tdfoqh") + postDetails.shouldBeTypeOf>() + postDetails.value.comments shouldHaveSize 7 + } - @Test - fun `get user details`() = runBlocking { - val user = api.getUser("msfjarvis") - assertIs>(user) - assertEquals("msfjarvis", user.value.username) + test("get user details") { + val user = api.getUser("msfjarvis") + user.shouldBeTypeOf>() + user.value.username shouldBe "msfjarvis" + } } } diff --git a/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiWrapper.kt b/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiWrapper.kt index e42bb2d7..992514d6 100644 --- a/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiWrapper.kt +++ b/api/src/test/kotlin/dev/msfjarvis/claw/api/ApiWrapper.kt @@ -27,7 +27,7 @@ class ApiWrapper(controller: EitherNetController) { init { controller.enqueue(LobstersApi::getHottestPosts) { success(hottest) } - controller.enqueue(LobstersApi::getNewestPosts) { success(hottest) } + controller.enqueue(LobstersApi::getHottestPosts) { success(hottest) } controller.enqueue(LobstersApi::getPostDetails) { success(postDetails) } controller.enqueue(LobstersApi::getUser) { success(user) } } diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinCommonPlugin.kt b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinCommonPlugin.kt index 28687085..01c5ffa5 100644 --- a/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinCommonPlugin.kt +++ b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinCommonPlugin.kt @@ -37,6 +37,7 @@ class KotlinCommonPlugin : Plugin { withType().configureEach { maxParallelForks = Runtime.getRuntime().availableProcessors() * 2 testLogging { events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) } + useJUnitPlatform() } } } diff --git a/database/build.gradle.kts b/database/build.gradle.kts index cf76e0a9..1e04d11a 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -33,7 +33,8 @@ dependencies { implementation(projects.core) implementation(libs.sqldelight.androidDriver) implementation(libs.sqldelight.primitiveAdapters) - testImplementation(libs.sqldelight.jvmDriver) + testImplementation(libs.kotest.assertions.core) + testImplementation(libs.kotest.runner.junit5) testImplementation(libs.kotlinx.coroutines.core) - testImplementation(kotlin("test-junit")) + testImplementation(libs.sqldelight.jvmDriver) } diff --git a/database/src/test/kotlin/dev/msfjarvis/claw/database/local/SqlDelightQueriesTest.kt b/database/src/test/kotlin/dev/msfjarvis/claw/database/local/SqlDelightQueriesTest.kt index 7d273026..ea7adb87 100644 --- a/database/src/test/kotlin/dev/msfjarvis/claw/database/local/SqlDelightQueriesTest.kt +++ b/database/src/test/kotlin/dev/msfjarvis/claw/database/local/SqlDelightQueriesTest.kt @@ -10,129 +10,110 @@ import app.cash.sqldelight.adapter.primitive.IntColumnAdapter import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver import dev.msfjarvis.claw.database.LobstersDatabase import dev.msfjarvis.claw.database.model.TagsAdapter -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlinx.coroutines.runBlocking -import org.junit.Before +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.collections.shouldBeEmpty +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.shouldBe -class SqlDelightQueriesTest { +class SqlDelightQueriesTest : FunSpec() { private lateinit var postQueries: SavedPostQueries - @Before - fun setUp() { - val driver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY) - LobstersDatabase.Schema.create(driver) - val database = - LobstersDatabase( - driver, - SavedPost.Adapter(IntColumnAdapter, TagsAdapter()), - ) - postQueries = database.savedPostQueries - } - - @Test - fun selectCount() = runBlocking { - val posts = createTestData(5) - - posts.forEach { postQueries.insertOrReplacePost(it) } - - val postCount = postQueries.selectCount().executeAsOne() - assertEquals(5, postCount) - } - - @Test - fun insertIntoDatabase() = runBlocking { - // Get 5 posts - val posts = createTestData(5) - - // Insert posts into DB - posts.forEach { postQueries.insertOrReplacePost(it) } - - // Check post count - val postsCount = postQueries.selectCount().executeAsOne() - assertEquals(5, postsCount) - } - - @Test - fun replaceFromDatabase() = runBlocking { - // Get 1 post - val post = createTestData(1)[0] - - // Insert post into DB - postQueries.insertOrReplacePost(post) - - // Create a new post and try replacing it - val newPost = post.copy(submitterName = "Fake name") - postQueries.insertOrReplacePost(newPost) - - // Check post count - val postsCount = postQueries.selectCount().executeAsOne() - assertEquals(1, postsCount) - - // Check if post is updated - val postFromDb = postQueries.selectPost(post.shortId).executeAsOne() - assertEquals("Fake name", postFromDb.submitterName) - } - - @Test - fun selectPost() = runBlocking { - // Get 1 post - val post = createTestData(1)[0] - - // Insert post into DB - postQueries.insertOrReplacePost(post) - - val postFromDb = postQueries.selectAllPosts().executeAsOne() - assertEquals("test_id_1", postFromDb.shortId) - } - - @Test - fun selectAllPosts() = runBlocking { - // Get 5 post - val posts = createTestData(5) - - // Insert posts into DB - posts.forEach { postQueries.insertOrReplacePost(it) } - - val postsFromDb = postQueries.selectAllPosts().executeAsList() - - // Check if all posts have correct shortId - for (i in 1..5) { - assertEquals("test_id_$i", postsFromDb[i - 1].shortId) + init { + beforeEach { + val driver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY) + LobstersDatabase.Schema.create(driver) + val database = + LobstersDatabase( + driver, + SavedPost.Adapter(IntColumnAdapter, TagsAdapter()), + ) + postQueries = database.savedPostQueries } - } - @Test - fun deletePost() = runBlocking { - // Create 3 posts and insert them to DB - val posts = createTestData(3) - posts.forEach { postQueries.insertOrReplacePost(it) } + test("add and count posts") { + val posts = createTestData(5) - // Delete 2nd post - postQueries.deletePost("test_id_2") + posts.forEach { postQueries.insertOrReplacePost(it) } - val postsFromDB = postQueries.selectAllPosts().executeAsList() + val postCount = postQueries.selectCount().executeAsOne() - // Check if size is 2, and only the correct post is deleted - assertEquals(2, postsFromDB.size) - assertEquals("test_id_1", postsFromDB[0].shortId) - assertEquals("test_id_3", postsFromDB[1].shortId) - } + postCount shouldBe 5 + } + + test("update post in database") { + // Get 1 post + val post = createTestData(1)[0] + + // Insert post into DB + postQueries.insertOrReplacePost(post) + + // Create a new post and try replacing it + val newPost = post.copy(submitterName = "Fake name") + postQueries.insertOrReplacePost(newPost) + + // Check post count + val postsCount = postQueries.selectCount().executeAsOne() + postsCount shouldBe 1 + + // Check if post is updated + val postFromDb = postQueries.selectPost(post.shortId).executeAsOne() + + postFromDb.submitterName shouldBe "Fake name" + } + + test("get post from db") { + // Get 1 post + val post = createTestData(1)[0] + + // Insert post into DB + postQueries.insertOrReplacePost(post) + + val postFromDb = postQueries.selectAllPosts().executeAsOne() + postFromDb.shortId shouldBe "test_id_1" + } - @Test - fun deleteAllPost() = runBlocking { - // Create 5 posts and insert them to DB - val posts = createTestData(5) - posts.forEach { postQueries.insertOrReplacePost(it) } + test("get multiple posts from db") { + // Get 5 post + val posts = createTestData(5) - // Delete all posts - postQueries.deleteAllPosts() + // Insert posts into DB + posts.forEach { postQueries.insertOrReplacePost(it) } - val postsCount = postQueries.selectCount().executeAsOne() + val postsFromDb = postQueries.selectAllPosts().executeAsList() - // Check if db is empty - assertEquals(0, postsCount) + // Check if all posts have correct shortId + postsFromDb.forEachIndexed { index, post -> post.shortId shouldBe "test_id_${index.inc()}" } + } + + test("delete post") { + // Create 3 posts and insert them to DB + val posts = createTestData(3) + posts.forEach { postQueries.insertOrReplacePost(it) } + + // Delete 2nd post + postQueries.deletePost("test_id_2") + + val postsFromDB = postQueries.selectAllPosts().executeAsList() + + // Check if size is 2, and only the correct post is deleted + postsFromDB shouldHaveSize 2 + postsFromDB[0].shortId shouldBe "test_id_1" + postsFromDB[1].shortId shouldBe "test_id_3" + } + + test("delete all posts") { + // Create 5 posts and insert them to DB + val posts = createTestData(5) + posts.forEach { postQueries.insertOrReplacePost(it) } + + // Delete all posts + postQueries.deleteAllPosts() + + val dbPosts = postQueries.selectAllPosts().executeAsList() + + dbPosts.shouldBeEmpty() + } } private fun createTestData(count: Int): ArrayList {