Skip to content

Commit 8e105ce

Browse files
committed
test: Add unit test
1 parent 08c4e9c commit 8e105ce

File tree

5 files changed

+114
-0
lines changed

5 files changed

+114
-0
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import co.yml.ychat.data.api.ChatGptApi
44
import co.yml.ychat.data.infrastructure.ApiExecutor
55
import co.yml.ychat.data.storage.ChatLogStorage
66
import co.yml.ychat.di.module.LibraryModule
7+
import co.yml.ychat.domain.usecases.AudioUseCase
78
import co.yml.ychat.domain.usecases.ChatCompletionsUseCase
89
import co.yml.ychat.domain.usecases.CompletionUseCase
910
import co.yml.ychat.domain.usecases.EditsUseCase
1011
import co.yml.ychat.domain.usecases.ImageGenerationsUseCase
1112
import co.yml.ychat.domain.usecases.ListModelsUseCase
13+
import co.yml.ychat.entrypoint.features.AudioTranscriptions
1214
import co.yml.ychat.entrypoint.features.ChatCompletions
1315
import co.yml.ychat.entrypoint.features.Completion
1416
import co.yml.ychat.entrypoint.features.Edits
@@ -42,6 +44,7 @@ class LibraryModuleTest : KoinTest {
4244
get<ImageGenerations>()
4345
get<Edits>()
4446
get<ListModels>()
47+
get<AudioTranscriptions>()
4548
}
4649

4750
@Test
@@ -51,6 +54,7 @@ class LibraryModuleTest : KoinTest {
5154
get<ChatCompletionsUseCase>()
5255
get<ImageGenerationsUseCase>()
5356
get<EditsUseCase>()
57+
get<AudioUseCase>()
5458
}
5559

5660
@Test
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package co.yml.ychat.domain.model
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
6+
class AudioParamsTest {
7+
8+
@Test
9+
fun `on AudioParams verify default values`() {
10+
// arrange
11+
val params = AudioParams()
12+
13+
// assert
14+
assertEquals("whisper-1", params.model)
15+
assertEquals("", params.prompt)
16+
assertEquals("json", params.responseFormat)
17+
assertEquals(0.0, params.temperature)
18+
assertEquals("en", params.language)
19+
}
20+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package co.yml.ychat.domain.usecases
2+
3+
import co.yml.ychat.data.api.ChatGptApi
4+
import co.yml.ychat.data.dto.AudioResultDto
5+
import co.yml.ychat.data.exception.ChatGptException
6+
import co.yml.ychat.data.infrastructure.ApiResult
7+
import co.yml.ychat.domain.model.AudioParams
8+
import co.yml.ychat.domain.model.FileBytes
9+
import io.mockk.coEvery
10+
import io.mockk.mockk
11+
import kotlin.test.BeforeTest
12+
import kotlin.test.Test
13+
import kotlin.test.assertEquals
14+
import kotlinx.coroutines.runBlocking
15+
16+
class AudioUseCaseTest {
17+
18+
private lateinit var useCase: AudioUseCase
19+
20+
private val chatGptApiMock = mockk<ChatGptApi>()
21+
22+
@BeforeTest
23+
fun setup() {
24+
useCase = AudioUseCase(chatGptApiMock)
25+
}
26+
27+
@Test
28+
fun `on requestAudioTranscription when request succeed then should return formatted result`() {
29+
// arrange
30+
val fileName = "audio-test.m4a"
31+
val audioFile = ByteArray(1024) as FileBytes
32+
val audioParams = AudioParams()
33+
val audioResultDto = AudioResultDto("this is a test.")
34+
val apiResult = ApiResult(body = audioResultDto)
35+
coEvery { chatGptApiMock.audioTranscriptions(any()) } returns apiResult
36+
37+
// act
38+
val result = runBlocking { useCase.requestAudioTranscription(fileName, audioFile, audioParams) }
39+
40+
// assert
41+
assertEquals("this is a test.", result)
42+
}
43+
44+
@Test
45+
fun `on requestAudioTranscription when not request succeed then should throw an exception`() {
46+
// arrange
47+
val fileName = "audio-test.m4a"
48+
val audioFile = ByteArray(1024) as FileBytes
49+
val audioParams = AudioParams()
50+
val apiResult = ApiResult<AudioResultDto>(exception = ChatGptException())
51+
coEvery { chatGptApiMock.audioTranscriptions(any()) } returns apiResult
52+
53+
// act
54+
val result = runCatching {
55+
runBlocking { useCase.requestAudioTranscription(fileName, audioFile, audioParams) }
56+
}
57+
58+
// assert
59+
assertEquals(true, result.exceptionOrNull() is ChatGptException)
60+
}
61+
}

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package co.yml.ychat.entrypoint
22

33
import co.yml.ychat.YChat
4+
import co.yml.ychat.domain.model.FileBytes
45
import co.yml.ychat.entrypoint.impl.YChatImpl
56
import infrastructure.MockStorage
67
import io.ktor.client.engine.HttpClientEngine
@@ -143,6 +144,28 @@ class YChatTest {
143144
assertEquals(expectedResult, result.id)
144145
}
145146

147+
@Test
148+
fun `on audioTranscriptions execute method should return result successfully`() {
149+
// arrange
150+
val expectedResult = "This is a test."
151+
val imageGenerationsSuccessResult =
152+
MockStorage.audioTranscriptionsSuccessResult(expectedResult)
153+
val audioFile = ByteArray(1024) as FileBytes
154+
mockHttpEngine(imageGenerationsSuccessResult)
155+
156+
// act
157+
val result = runBlocking {
158+
yChat.audioTranscriptions()
159+
.setTemperature(0.0)
160+
.setModel("model-1")
161+
.setPrompt("Test")
162+
.execute("file.mp4", audioFile)
163+
}
164+
165+
// assert
166+
assertEquals(expectedResult, result)
167+
}
168+
146169
private fun mockHttpEngine(result: String) {
147170
val httpEngine = MockEngine {
148171
respond(

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,10 @@ object MockStorage {
135135
"parent": null
136136
}
137137
"""
138+
139+
fun audioTranscriptionsSuccessResult(text: String) = """
140+
{
141+
"text": "$text"
142+
}
143+
"""
138144
}

0 commit comments

Comments
 (0)