Skip to content

Commit 08ac62f

Browse files
committed
test: Add unit tests
1 parent 259a6a6 commit 08ac62f

File tree

4 files changed

+102
-7
lines changed

4 files changed

+102
-7
lines changed

ychat/src/commonTest/kotlin/co/yml/ychat/di/LibraryModuleTest.kt

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ import co.yml.ychat.data.storage.ChatLogStorage
66
import co.yml.ychat.di.module.LibraryModule
77
import co.yml.ychat.domain.usecases.ChatCompletionsUseCase
88
import co.yml.ychat.domain.usecases.CompletionUseCase
9+
import co.yml.ychat.domain.usecases.EditsUseCase
910
import co.yml.ychat.domain.usecases.ImageGenerationsUseCase
11+
import co.yml.ychat.domain.usecases.ListModelsUseCase
1012
import co.yml.ychat.entrypoint.features.ChatCompletions
1113
import co.yml.ychat.entrypoint.features.Completion
1214
import co.yml.ychat.entrypoint.features.Edits
1315
import co.yml.ychat.entrypoint.features.ImageGenerations
16+
import co.yml.ychat.entrypoint.features.ListModels
1417
import io.ktor.client.HttpClient
1518
import kotlin.test.AfterTest
1619
import kotlin.test.BeforeTest
@@ -33,17 +36,28 @@ class LibraryModuleTest : KoinTest {
3336
}
3437

3538
@Test
36-
fun `should inject all modules without throwing exception`() {
39+
fun `should inject all entrypoint modules without throwing exception`() {
3740
get<Completion>()
41+
get<ChatCompletions>()
42+
get<ImageGenerations>()
43+
get<Edits>()
44+
get<ListModels>()
45+
}
46+
47+
@Test
48+
fun `should inject all domain modules without throwing exception`() {
49+
get<ListModelsUseCase>()
50+
get<CompletionUseCase>()
51+
get<ChatCompletionsUseCase>()
52+
get<ImageGenerationsUseCase>()
53+
get<EditsUseCase>()
54+
}
55+
56+
@Test
57+
fun `should inject all data modules without throwing exception`() {
3858
get<HttpClient>()
3959
get<ChatLogStorage>()
4060
get<ApiExecutor>()
4161
get<ChatGptApi>()
42-
get<CompletionUseCase>()
43-
get<ChatCompletionsUseCase>()
44-
get<ChatCompletions>()
45-
get<ImageGenerationsUseCase>()
46-
get<ImageGenerations>()
47-
get<Edits>()
4862
}
4963
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package co.yml.ychat.domain.usecases
2+
3+
import co.yml.ychat.data.api.ChatGptApi
4+
import co.yml.ychat.data.dto.ModelDto
5+
import co.yml.ychat.data.dto.ModelListDto
6+
import co.yml.ychat.data.exception.ChatGptException
7+
import co.yml.ychat.data.infrastructure.ApiResult
8+
import io.mockk.coEvery
9+
import io.mockk.mockk
10+
import kotlin.test.BeforeTest
11+
import kotlin.test.Test
12+
import kotlin.test.assertEquals
13+
import kotlinx.coroutines.runBlocking
14+
15+
class ListModelsUseCaseTest {
16+
17+
private lateinit var useCase: ListModelsUseCase
18+
19+
private val chatGptApiMock = mockk<ChatGptApi>()
20+
21+
@BeforeTest
22+
fun setup() {
23+
useCase = ListModelsUseCase(chatGptApiMock)
24+
}
25+
26+
@Test
27+
fun `on getListModels when request succeed then should return formatted result`() {
28+
// arrange
29+
val expectedIds = listOf("model1", "model2")
30+
val modelListDto = buildModelListDto(expectedIds)
31+
val apiResult = ApiResult(body = modelListDto)
32+
coEvery { chatGptApiMock.models() } returns apiResult
33+
34+
// act
35+
val result = runBlocking { useCase.getListModels() }
36+
37+
// assert
38+
assertEquals("model1", result[0].id)
39+
assertEquals("model2", result[1].id)
40+
}
41+
42+
@Test
43+
fun `on getListModels when not request succeed then should throw an exception`() {
44+
// arrange
45+
val apiResult = ApiResult<ModelListDto>(exception = ChatGptException())
46+
coEvery { chatGptApiMock.models() } returns apiResult
47+
48+
// act
49+
val result = runCatching { runBlocking { useCase.getListModels() } }
50+
51+
// assert
52+
assertEquals(true, result.exceptionOrNull() is ChatGptException)
53+
}
54+
55+
private fun buildModelListDto(modelIds: List<String>): ModelListDto {
56+
return ModelListDto(modelIds.map { ModelDto(id = it, ownedBy = "", emptyList()) })
57+
}
58+
}

ychat/src/commonTest/kotlin/co/yml/ychat/entrypoint/YChatTest.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,20 @@ class YChatTest {
115115
assertEquals(expectedResult, result.first())
116116
}
117117

118+
@Test
119+
fun `on listModels execute method should return result successfully`() {
120+
// arrange
121+
val expectedResult = "model1"
122+
val listModelsSuccessResult = MockStorage.listModelsSuccessResult(expectedResult)
123+
mockHttpEngine(listModelsSuccessResult)
124+
125+
// act
126+
val result = runBlocking { yChat.listModels().execute() }
127+
128+
// assert
129+
assertEquals(expectedResult, result.first().id)
130+
}
131+
118132
private fun mockHttpEngine(result: String) {
119133
val httpEngine = MockEngine {
120134
respond(

ychat/src/commonTest/kotlin/infrastructure/MockStorage.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,13 @@ object MockStorage {
2020
fun editsSuccessResult(text: String) = "{\"object\":\"edit\",\"created\":1679072839," +
2121
"\"choices\":[{\"text\":\"$text\",\"index\":0}]," +
2222
"\"usage\":{\"prompt_tokens\":25,\"completion_tokens\":28,\"total_tokens\":53}}"
23+
24+
fun listModelsSuccessResult(id: String) =
25+
"{\"object\":\"list\",\"data\":[{\"id\":\"$id\",\"object\":\"model\"," +
26+
"\"created\":1649358449,\"owned_by\":\"openai\",\"permission\":" +
27+
"[{\"id\":\"modelperm-49FUp5v084tBB49tC4z8LPH5\",\"object\":\"model_permission\"," +
28+
"\"created\":1669085501,\"allow_create_engine\":false,\"allow_sampling\":true," +
29+
"\"allow_logprobs\":true,\"allow_search_indices\":false,\"allow_view\":true," +
30+
"\"allow_fine_tuning\":false,\"organization\":\"*\",\"group\":null,\"is_blocking" +
31+
"\":false}],\"root\":\"$id\",\"parent\":null}]}"
2332
}

0 commit comments

Comments
 (0)