Skip to content

Commit

Permalink
chore: tests
Browse files Browse the repository at this point in the history
  • Loading branch information
alvr committed Apr 22, 2024
1 parent 1f5ba84 commit f5e8dec
Show file tree
Hide file tree
Showing 23 changed files with 211 additions and 349 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import dev.alvr.katana.core.tests.koinExtension
import io.kotest.core.spec.style.FreeSpec
import io.kotest.core.test.TestCase
import io.kotest.matchers.equals.shouldBeEqual
import kotlin.time.Duration.Companion.milliseconds
import org.koin.test.KoinTest
import org.koin.test.inject

Expand All @@ -22,7 +21,7 @@ internal class SessionDataStoreTest : FreeSpec(), KoinTest {

init {
"initial session should equal to the Session class" {
dataStore.data.test(100.milliseconds) {
dataStore.data.test {
awaitItem() shouldBeEqual Session()
cancelAndConsumeRemainingEvents()
}
Expand All @@ -37,7 +36,7 @@ internal class SessionDataStoreTest : FreeSpec(), KoinTest {
)
}

data.test(100.milliseconds) {
data.test {
awaitItem() shouldBeEqual Session(
anilistToken = AnilistToken("token"),
isSessionActive = true,
Expand All @@ -48,7 +47,7 @@ internal class SessionDataStoreTest : FreeSpec(), KoinTest {
}

"corrupted dataStore should recreate again the file with initial values" {
corruptedDataStore.data.test(100.milliseconds) {
corruptedDataStore.data.test {
awaitItem() shouldBeEqual Session(anilistToken = AnilistToken("recreated"))
cancelAndConsumeRemainingEvents()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import dev.mokkery.mock
import dev.mokkery.verify
import dev.mokkery.verifySuspend
import io.kotest.core.spec.style.FreeSpec
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.flow.flowOf

internal class SessionRepositoryTest : FreeSpec() {
Expand All @@ -37,7 +36,7 @@ internal class SessionRepositoryTest : FreeSpec() {
false.right(),
)

repo.sessionActive.test(100.milliseconds) {
repo.sessionActive.test {
awaitItem().shouldBeRight(true)
awaitItem().shouldBeRight(true)
awaitItem().shouldBeRight(false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import dev.mokkery.mock
import dev.mokkery.verify
import dev.mokkery.verifySuspend
import io.kotest.core.spec.style.FreeSpec
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.flow.flowOf

internal class SessionLocalSourceTest : FreeSpec() {
Expand Down Expand Up @@ -80,7 +79,7 @@ internal class SessionLocalSourceTest : FreeSpec() {
"checking session active for ${session.anilistToken} and ${session.isSessionActive}" {
every { store.data } returns flowOf(session)

source.sessionActive.test(100.milliseconds) {
source.sessionActive.test {
awaitItem().shouldBeRight((session.anilistToken == null && session.isSessionActive).not())
cancelAndIgnoreRemainingEvents()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import dev.mokkery.mock
import dev.mokkery.verify
import io.kotest.core.spec.style.FreeSpec
import io.kotest.core.test.TestCase
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.flow.flowOf
import org.koin.test.KoinTest
import org.koin.test.inject
Expand All @@ -41,7 +40,7 @@ internal class ObserveActiveSessionUseCaseTest : FreeSpec(), KoinTest {

useCase()

useCase.flow.test(100.milliseconds) {
useCase.flow.test {
awaitItem().shouldBeRight(false)
awaitItem().shouldBeRight(true)
awaitItem().shouldBeRight(false)
Expand All @@ -58,7 +57,7 @@ internal class ObserveActiveSessionUseCaseTest : FreeSpec(), KoinTest {

useCase()

useCase.flow.test(100.milliseconds) {
useCase.flow.test {
awaitItem().shouldBeLeft(SessionFailure.CheckingActiveSession)
cancelAndConsumeRemainingEvents()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ internal class ApolloUserIdManagerTest : FreeSpec() {
"retrieving the authenticated user" - {
"the first time should make a HTTP request" {
val query = UserIdQuery.Data {
this["viewer"] = buildUser {
this["id"] = 12345
viewer = buildUser {
id = 12345
}
}

Expand All @@ -39,8 +39,8 @@ internal class ApolloUserIdManagerTest : FreeSpec() {

"the second onwards it should be read from cache" {
val query = UserIdQuery.Data {
this["viewer"] = buildUser {
this["id"] = 12345
viewer = buildUser {
id = 12345
}
}

Expand All @@ -55,8 +55,8 @@ internal class ApolloUserIdManagerTest : FreeSpec() {

"clearing the database" {
val query = UserIdQuery.Data {
this["viewer"] = buildUser {
this["id"] = 12345
viewer = buildUser {
id = 12345
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,10 @@ package dev.alvr.katana.common.user.data.mappers.responses

import dev.alvr.katana.common.user.data.UserIdQuery
import io.kotest.assertions.throwables.shouldNotThrowExactlyUnit
import io.kotest.assertions.throwables.shouldThrowExactlyUnit
import io.kotest.core.spec.style.FreeSpec
import io.kotest.matchers.ints.shouldBeExactly
import io.kotest.matchers.throwable.shouldHaveMessage

internal class UserIdMapperTest : FreeSpec({
"null UserIdQuery Data" {
shouldThrowExactlyUnit<IllegalStateException> {
val userId: UserIdQuery.Data? = null
userId()
} shouldHaveMessage "ViewerId is required."
}

"UserIdQuery with null viewer" {
shouldThrowExactlyUnit<IllegalStateException> {
val userId = UserIdQuery.Data(viewer = null)
userId()
} shouldHaveMessage "ViewerId is required."
}

"an UserIdQuery with a viewer should have same id" {
shouldNotThrowExactlyUnit<IllegalStateException> {
UserIdQuery.Data(viewer = UserIdQuery.Viewer(37_384))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import dev.mokkery.mock
import dev.mokkery.verify
import dev.mokkery.verifySuspend
import io.kotest.core.spec.style.FreeSpec
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.flow.emptyFlow

internal class UserRepositoryTest : FreeSpec() {
Expand Down Expand Up @@ -68,7 +67,7 @@ internal class UserRepositoryTest : FreeSpec() {
"observing userInfo" - {
"the server returns no data" {
every { userInfoSource.userInfo } returns emptyFlow()
repo.userInfo.test(100.milliseconds) { awaitComplete() }
repo.userInfo.test { awaitComplete() }
verify { userInfoSource.userInfo }
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package dev.alvr.katana.common.user.data.sources.id

import com.apollographql.apollo3.ApolloClient
import com.apollographql.apollo3.annotations.ApolloExperimental
import com.apollographql.apollo3.exception.JsonDataException
import com.apollographql.apollo3.testing.QueueTestNetworkTransport
import com.apollographql.apollo3.testing.enqueueTestResponse
import dev.alvr.katana.common.user.data.UserIdQuery
Expand All @@ -10,6 +11,7 @@ import dev.alvr.katana.core.domain.failures.Failure
import dev.alvr.katana.core.remote.type.buildUser
import dev.alvr.katana.core.tests.shouldBeLeft
import dev.alvr.katana.core.tests.shouldBeRight
import io.kotest.assertions.throwables.shouldThrowExactlyUnit
import io.kotest.core.spec.style.FreeSpec

@OptIn(ApolloExperimental::class)
Expand All @@ -25,21 +27,23 @@ internal class UserIdRemoteSourceTest : FreeSpec() {
}

"the server returns an empty userId" {
val query = UserIdQuery.Data { this["viewer"] = null }
client.enqueueTestResponse(UserIdQuery(), query)
source.getUserId().shouldBeLeft(Failure.Unknown)
shouldThrowExactlyUnit<JsonDataException> {
val query = UserIdQuery.Data { this["Viewer"] = null }
client.enqueueTestResponse(UserIdQuery(), query)
source.getUserId()
}
}

"the server returns a valid id" {
val query = UserIdQuery.Data { this["viewer"] = buildUser { this["id"] = 37_384 } }
val query = UserIdQuery.Data { this["Viewer"] = buildUser { id = 37_384 } }
client.enqueueTestResponse(UserIdQuery(), query)
source.getUserId().shouldBeRight(UserId(37_384))
}
}

"saving" - {
"is successful" {
val query = UserIdQuery.Data { this["viewer"] = buildUser { this["id"] = 37_384 } }
val query = UserIdQuery.Data { this["viewer"] = buildUser { id = 37_384 } }
client.enqueueTestResponse(UserIdQuery(), query)
source.saveUserId().shouldBeRight()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,11 @@ import com.apollographql.apollo3.testing.registerTestResponse
import dev.alvr.katana.common.user.data.UserInfoQuery
import dev.alvr.katana.common.user.domain.failures.UserFailure
import dev.alvr.katana.common.user.domain.models.UserInfo
import dev.alvr.katana.core.common.empty
import dev.alvr.katana.core.remote.type.buildUser
import dev.alvr.katana.core.remote.type.buildUserAvatar
import dev.alvr.katana.core.tests.shouldBeLeft
import dev.alvr.katana.core.tests.shouldBeRight
import io.kotest.core.spec.style.FreeSpec
import kotlin.time.Duration.Companion.milliseconds

@OptIn(ApolloExperimental::class)
internal class UserInfoRemoteSourceTest : FreeSpec() {
Expand All @@ -26,25 +24,16 @@ internal class UserInfoRemoteSourceTest : FreeSpec() {
"observing the user info" - {
"the server returns no data" {
client.registerTestResponse(UserInfoQuery())
source.userInfo.test(100.milliseconds) {
awaitItem().shouldBeRight(userInfoNoData)
cancelAndIgnoreRemainingEvents()
}
}

"the server returns an empty user" {
val query = UserInfoQuery.Data { this["user"] = null }
client.registerTestResponse(UserInfoQuery(), query)
source.userInfo.test(100.milliseconds) {
awaitItem().shouldBeRight(userInfoNoData)
source.userInfo.test {
awaitItem().shouldBeLeft(UserFailure.GettingUserInfo)
cancelAndIgnoreRemainingEvents()
}
}

validUserInfoData.map { (query, userInfo) ->
"the server returns valid user info ($query)" {
client.registerTestResponse(UserInfoQuery(), query)
source.userInfo.test(100.milliseconds) {
source.userInfo.test {
awaitItem().shouldBeRight(userInfo)
cancelAndIgnoreRemainingEvents()
}
Expand All @@ -53,7 +42,7 @@ internal class UserInfoRemoteSourceTest : FreeSpec() {

"there is a problem with the server" {
client.registerTestNetworkError(UserInfoQuery())
source.userInfo.test(100.milliseconds) {
source.userInfo.test {
awaitItem().shouldBeLeft(UserFailure.GettingUserInfo)
cancelAndIgnoreRemainingEvents()
}
Expand All @@ -66,34 +55,21 @@ internal class UserInfoRemoteSourceTest : FreeSpec() {
const val AVATAR = "https://s4.anilist.co/file/anilistcdn/user/avatar/large/b37384-xJE9aA4X20Yr.png"
const val BANNER = "https://s4.anilist.co/file/anilistcdn/user/banner/37384-jtds8dpQIGVG.jpg"

val userInfoNoData = UserInfo(
username = String.empty,
avatar = String.empty,
banner = String.empty,
)

val validUserInfoData = listOf(
UserInfoQuery.Data {
this["user"] = buildUser {
this["name"] = USER_NAME
this["avatar"] = buildUserAvatar { this["medium"] = AVATAR }
this["bannerImage"] = BANNER
this["Viewer"] = buildUser {
name = USER_NAME
avatar = buildUserAvatar { large = AVATAR }
bannerImage = BANNER
}
} to UserInfo(username = USER_NAME, avatar = AVATAR, banner = BANNER),
UserInfoQuery.Data {
this["user"] = buildUser {
this["name"] = USER_NAME
this["avatar"] = buildUserAvatar { this["medium"] = null }
this["bannerImage"] = BANNER
}
} to UserInfo(username = USER_NAME, avatar = String.empty, banner = BANNER),
UserInfoQuery.Data {
this["user"] = buildUser {
this["name"] = USER_NAME
this["avatar"] = null
this["bannerImage"] = BANNER
this["Viewer"] = buildUser {
name = USER_NAME
avatar = buildUserAvatar { large = AVATAR }
bannerImage = null
}
} to UserInfo(username = USER_NAME, avatar = String.empty, banner = BANNER),
} to UserInfo(username = USER_NAME, avatar = AVATAR, banner = null),
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import dev.mokkery.mock
import dev.mokkery.verify
import io.kotest.core.spec.style.FreeSpec
import io.kotest.core.test.TestCase
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.flow.flowOf
import org.koin.test.KoinTest
import org.koin.test.inject
Expand All @@ -35,7 +34,7 @@ internal class ObserveUserInfoUseCaseTest : FreeSpec(), KoinTest {

useCase()

useCase.flow.test(100.milliseconds) {
useCase.flow.test {
awaitItem().shouldBeRight(userInfoMock)
cancelAndConsumeRemainingEvents()
}
Expand All @@ -48,7 +47,7 @@ internal class ObserveUserInfoUseCaseTest : FreeSpec(), KoinTest {

useCase()

useCase.flow.test(100.milliseconds) {
useCase.flow.test {
awaitItem().shouldBeLeft(UserFailure.GettingUserInfo)
cancelAndConsumeRemainingEvents()
}
Expand Down
Loading

0 comments on commit f5e8dec

Please sign in to comment.