Skip to content

Commit 8a45649

Browse files
committed
refactor: Move tests to :ychat-core
1 parent 0093669 commit 8a45649

File tree

14 files changed

+99
-56
lines changed

14 files changed

+99
-56
lines changed

ychat/src/commonTest/kotlin/co/yml/ychat/data/infrastructure/ApiExecutorTest.kt renamed to ychat-core/src/commonTest/kotlin/co/yml/ychat/core/network/infrastructure/ApiExecutorTest.kt

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
package co.yml.ychat.data.infrastructure
1+
package co.yml.ychat.core.network.infrastructure
22

3-
import io.ktor.client.HttpClient
43
import io.ktor.client.engine.mock.MockEngine
54
import io.ktor.client.engine.mock.respond
65
import io.ktor.http.HttpHeaders
@@ -29,7 +28,7 @@ class ApiExecutorTest {
2928
headers = headersOf(HttpHeaders.ContentType, "application/json")
3029
)
3130
}
32-
val httpClient = HttpClient(mockEngine)
31+
val httpClient = MockHttpClient(mockEngine)
3332
val apiExecutor = ApiExecutor(httpClient)
3433

3534
// act
@@ -46,6 +45,39 @@ class ApiExecutorTest {
4645
assertEquals("This is a test", result.body)
4746
}
4847

48+
@Test
49+
fun `on execute when request is multipart type then content type should be multipart type`() = runBlocking {
50+
// arrange
51+
var endpoint = ""
52+
var httpMethod = ""
53+
var contentType: String? = null
54+
val mockEngine = MockEngine { request ->
55+
endpoint = request.url.toString().decodeURLPart()
56+
httpMethod = request.method.value
57+
contentType = request.body.contentType?.contentType
58+
respond(
59+
content = "This is a test",
60+
status = HttpStatusCode.OK,
61+
headers = headersOf(HttpHeaders.ContentType, "application/json")
62+
)
63+
}
64+
val httpClient = MockHttpClient(mockEngine)
65+
val apiExecutor = ApiExecutor(httpClient)
66+
67+
// act
68+
apiExecutor
69+
.setEndpoint("api/test")
70+
.setHttpMethod(HttpMethod.Post)
71+
.addFormPart("key1", "value1")
72+
.addFormPart("key1", "file_mock", ByteArray(100))
73+
.execute<String>()
74+
75+
// assert
76+
assertEquals("http://localhost/api/test", endpoint)
77+
assertEquals("POST", httpMethod)
78+
assertEquals("multipart", contentType)
79+
}
80+
4981
@Test
5082
fun `on execute when occurs api error then should return error as expected`() = runBlocking {
5183
// arrange
@@ -56,7 +88,7 @@ class ApiExecutorTest {
5688
headers = headersOf(HttpHeaders.ContentType, "application/json")
5789
)
5890
}
59-
val httpClient = HttpClient(mockEngine)
91+
val httpClient = MockHttpClient(mockEngine)
6092
val apiExecutor = ApiExecutor(httpClient)
6193

6294
// act
@@ -75,7 +107,7 @@ class ApiExecutorTest {
75107
val mockEngine = MockEngine {
76108
throw IOException("Error")
77109
}
78-
val httpClient = HttpClient(mockEngine)
110+
val httpClient = MockHttpClient(mockEngine)
79111
val apiExecutor = ApiExecutor(httpClient)
80112

81113
// act

ychat/src/commonTest/kotlin/co/yml/ychat/data/infrastructure/ApiResultTest.kt renamed to ychat-core/src/commonTest/kotlin/co/yml/ychat/core/network/infrastructure/ApiResultTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package co.yml.ychat.data.infrastructure
1+
package co.yml.ychat.core.network.infrastructure
22

3-
import co.yml.ychat.data.exception.ChatGptException
3+
import co.yml.ychat.core.exceptions.YChatException
44
import kotlin.test.Test
55
import kotlin.test.assertEquals
66

@@ -21,7 +21,7 @@ class ApiResultTest {
2121
@Test
2222
fun `on isSuccessful when has exception then should return false`() {
2323
// arrange
24-
val apiResult = ApiResult<String>(exception = ChatGptException())
24+
val apiResult = ApiResult<String>(exception = YChatException())
2525

2626
// act
2727
val result = apiResult.isSuccessful
@@ -57,7 +57,7 @@ class ApiResultTest {
5757
@Test
5858
fun `on ensureSuccess when is not successful should throw an exception`() {
5959
// arrange
60-
val apiResult = ApiResult<String>(exception = ChatGptException())
60+
val apiResult = ApiResult<String>(exception = YChatException())
6161

6262
// act
6363
val result = runCatching { apiResult.ensureSuccess() }.exceptionOrNull()
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package co.yml.ychat.core.network.infrastructure
2+
3+
import co.yml.ychat.core.network.factories.HttpClientFactory
4+
import io.ktor.client.HttpClient
5+
import io.ktor.client.engine.mock.MockEngine
6+
7+
class MockHttpClient(private val mockEngine: MockEngine) : HttpClientFactory {
8+
override fun getHttpClient(): HttpClient {
9+
return HttpClient(mockEngine)
10+
}
11+
}

ychat/src/commonTest/kotlin/co/yml/ychat/data/storage/ChatLogStorageTest.kt renamed to ychat-core/src/commonTest/kotlin/co/yml/ychat/core/storage/ChatLogStorageTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package co.yml.ychat.data.storage
1+
package co.yml.ychat.core.storage
22

33
import kotlin.test.BeforeTest
44
import kotlin.test.Test

ychat/src/commonTest/kotlin/co/yml/ychat/di/NetworkProviderTest.kt renamed to ychat/src/commonTest/kotlin/co/yml/ychat/data/infrastructure/OpenAiHttpClientTest.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
package co.yml.ychat.di
1+
package co.yml.ychat.data.infrastructure
22

3-
import co.yml.ychat.di.provider.NetworkProvider
43
import io.ktor.client.engine.mock.MockEngine
54
import io.ktor.client.engine.mock.respond
65
import io.ktor.client.request.request
@@ -12,7 +11,7 @@ import kotlin.test.Test
1211
import kotlin.test.assertEquals
1312
import kotlinx.coroutines.runBlocking
1413

15-
class NetworkProviderTest {
14+
class OpenAiHttpClientTest {
1615

1716
@Test
1817
fun `on provideHttpClient should assert default request`() {
@@ -31,7 +30,7 @@ class NetworkProviderTest {
3130
}
3231

3332
// act
34-
runBlocking { NetworkProvider.provideHttpClient(mockEngine, apiKey).request() }
33+
runBlocking { OpenAiHttpClient(apiKey, mockEngine).getHttpClient().request() }
3534

3635
// assert
3736
assertEquals("https://api.openai.com", baseUrl)

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package co.yml.ychat.di
22

3+
import co.yml.ychat.core.network.factories.HttpClientFactory
4+
import co.yml.ychat.core.network.infrastructure.ApiExecutor
5+
import co.yml.ychat.core.storage.ChatLogStorage
36
import co.yml.ychat.data.api.ChatGptApi
4-
import co.yml.ychat.data.infrastructure.ApiExecutor
5-
import co.yml.ychat.data.storage.ChatLogStorage
67
import co.yml.ychat.di.module.LibraryModule
78
import co.yml.ychat.domain.usecases.AudioUseCase
89
import co.yml.ychat.domain.usecases.ChatCompletionsUseCase
@@ -16,7 +17,6 @@ import co.yml.ychat.entrypoint.features.Completion
1617
import co.yml.ychat.entrypoint.features.Edits
1718
import co.yml.ychat.entrypoint.features.ImageGenerations
1819
import co.yml.ychat.entrypoint.features.ListModels
19-
import io.ktor.client.HttpClient
2020
import kotlin.test.AfterTest
2121
import kotlin.test.BeforeTest
2222
import kotlin.test.Test
@@ -59,7 +59,7 @@ class LibraryModuleTest : KoinTest {
5959

6060
@Test
6161
fun `should inject all data modules without throwing exception`() {
62-
get<HttpClient>()
62+
get<HttpClientFactory>()
6363
get<ChatLogStorage>()
6464
get<ApiExecutor>()
6565
get<ChatGptApi>()

ychat/src/commonTest/kotlin/co/yml/ychat/domain/usecases/AudioUseCaseTest.kt

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

3+
import co.yml.ychat.core.exceptions.YChatException
4+
import co.yml.ychat.core.model.FileBytes
5+
import co.yml.ychat.core.network.infrastructure.ApiResult
36
import co.yml.ychat.data.api.ChatGptApi
47
import co.yml.ychat.data.dto.AudioResultDto
5-
import co.yml.ychat.data.exception.ChatGptException
6-
import co.yml.ychat.data.infrastructure.ApiResult
78
import co.yml.ychat.domain.model.AudioParams
8-
import co.yml.ychat.domain.model.FileBytes
99
import io.mockk.coEvery
1010
import io.mockk.mockk
1111
import kotlin.test.BeforeTest
@@ -47,7 +47,7 @@ class AudioUseCaseTest {
4747
val fileName = "audio-test.m4a"
4848
val audioFile = ByteArray(1024) as FileBytes
4949
val audioParams = AudioParams()
50-
val apiResult = ApiResult<AudioResultDto>(exception = ChatGptException())
50+
val apiResult = ApiResult<AudioResultDto>(exception = YChatException())
5151
coEvery { chatGptApiMock.audioTranscriptions(any()) } returns apiResult
5252

5353
// act
@@ -56,7 +56,7 @@ class AudioUseCaseTest {
5656
}
5757

5858
// assert
59-
assertEquals(true, result.exceptionOrNull() is ChatGptException)
59+
assertEquals(true, result.exceptionOrNull() is YChatException)
6060
}
6161

6262
@Test
@@ -82,7 +82,7 @@ class AudioUseCaseTest {
8282
val fileName = "audio-test.m4a"
8383
val audioFile = ByteArray(1024) as FileBytes
8484
val audioParams = AudioParams()
85-
val apiResult = ApiResult<AudioResultDto>(exception = ChatGptException())
85+
val apiResult = ApiResult<AudioResultDto>(exception = YChatException())
8686
coEvery { chatGptApiMock.audioTranslations(any()) } returns apiResult
8787

8888
// act
@@ -91,6 +91,6 @@ class AudioUseCaseTest {
9191
}
9292

9393
// assert
94-
assertEquals(true, result.exceptionOrNull() is ChatGptException)
94+
assertEquals(true, result.exceptionOrNull() is YChatException)
9595
}
9696
}

ychat/src/commonTest/kotlin/co/yml/ychat/domain/usecases/ChatCompletionsUseCaseTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package co.yml.ychat.domain.usecases
22

3+
import co.yml.ychat.core.exceptions.YChatException
4+
import co.yml.ychat.core.network.infrastructure.ApiResult
35
import co.yml.ychat.data.api.ChatGptApi
46
import co.yml.ychat.data.dto.ChatCompletionsChoiceDto
57
import co.yml.ychat.data.dto.ChatCompletionsDto
68
import co.yml.ychat.data.dto.ChatMessageDto
79
import co.yml.ychat.data.dto.UsageDto
8-
import co.yml.ychat.data.exception.ChatGptException
9-
import co.yml.ychat.data.infrastructure.ApiResult
1010
import co.yml.ychat.domain.model.ChatCompletionsParams
1111
import co.yml.ychat.domain.model.ChatMessage
1212
import io.mockk.coEvery
@@ -48,15 +48,15 @@ class ChatCompletionsUseCaseTest {
4848
// arrange
4949
val messages = arrayListOf(ChatMessage("user", "Say this is a test."))
5050
val params = ChatCompletionsParams(messages)
51-
val apiResult = ApiResult<ChatCompletionsDto>(exception = ChatGptException())
51+
val apiResult = ApiResult<ChatCompletionsDto>(exception = YChatException())
5252
coEvery { chatGptApiMock.chatCompletions(any()) } returns apiResult
5353

5454
// act
5555
val result =
5656
runCatching { runBlocking { chatCompletionsUseCase.requestChatCompletions(params) } }
5757

5858
// assert
59-
assertEquals(true, result.exceptionOrNull() is ChatGptException)
59+
assertEquals(true, result.exceptionOrNull() is YChatException)
6060
}
6161

6262
private fun buildChatCompletionsDto(answer: String): ChatCompletionsDto {

ychat/src/commonTest/kotlin/co/yml/ychat/domain/usecases/CompletionUseCaseTest.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package co.yml.ychat.domain.usecases
22

3+
import co.yml.ychat.core.exceptions.YChatException
4+
import co.yml.ychat.core.network.infrastructure.ApiResult
5+
import co.yml.ychat.core.storage.ChatLogStorage
36
import co.yml.ychat.data.api.ChatGptApi
47
import co.yml.ychat.data.dto.ChoiceDto
58
import co.yml.ychat.data.dto.CompletionDto
69
import co.yml.ychat.data.dto.UsageDto
7-
import co.yml.ychat.data.exception.ChatGptException
8-
import co.yml.ychat.data.infrastructure.ApiResult
9-
import co.yml.ychat.data.storage.ChatLogStorage
1010
import co.yml.ychat.domain.model.CompletionParams
1111
import io.mockk.coEvery
1212
import io.mockk.every
@@ -36,7 +36,7 @@ class CompletionUseCaseTest {
3636
fun `on completion when request not succeed then should remove last appended input and throw exception`() {
3737
// arrange
3838
val input = "Say this is a test."
39-
val apiResult = ApiResult<CompletionDto>(exception = ChatGptException())
39+
val apiResult = ApiResult<CompletionDto>(exception = YChatException())
4040
val completionParams = CompletionParams(prompt = input, enableChatStorage = true)
4141
every { chatLogStorageMock.buildChatInput(input) } returns input
4242
every { chatLogStorageMock.removeLastAppendedInput() } just runs
@@ -48,7 +48,7 @@ class CompletionUseCaseTest {
4848

4949
// assert
5050
verify(exactly = 1) { chatLogStorageMock.removeLastAppendedInput() }
51-
assertEquals(true, result.exceptionOrNull() is ChatGptException)
51+
assertEquals(true, result.exceptionOrNull() is YChatException)
5252
}
5353

5454
@Test

ychat/src/commonTest/kotlin/co/yml/ychat/domain/usecases/EditsUseCaseTest.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
package co.yml.ychat.domain.usecases
22

3+
import co.yml.ychat.core.exceptions.YChatException
4+
import co.yml.ychat.core.network.infrastructure.ApiResult
35
import co.yml.ychat.data.api.ChatGptApi
46
import co.yml.ychat.data.dto.EditsChoiceDto
57
import co.yml.ychat.data.dto.EditsDto
68
import co.yml.ychat.data.dto.UsageDto
7-
import co.yml.ychat.data.exception.ChatGptException
8-
import co.yml.ychat.data.infrastructure.ApiResult
99
import co.yml.ychat.domain.model.EditsParams
1010
import io.mockk.coEvery
1111
import io.mockk.mockk
12-
import kotlinx.coroutines.runBlocking
1312
import kotlin.test.BeforeTest
1413
import kotlin.test.Test
1514
import kotlin.test.assertEquals
15+
import kotlinx.coroutines.runBlocking
1616

1717
class EditsUseCaseTest {
1818

@@ -46,15 +46,15 @@ class EditsUseCaseTest {
4646
// arrange
4747
val prompt = "text"
4848
val params = EditsParams(input = prompt)
49-
val apiResult = ApiResult<EditsDto>(exception = ChatGptException())
49+
val apiResult = ApiResult<EditsDto>(exception = YChatException())
5050
coEvery { chatGptApiMock.edits(any()) } returns apiResult
5151

5252
// act
5353
val result =
5454
runCatching { runBlocking { editsUseCase.requestEdits(params) } }
5555

5656
// assert
57-
assertEquals(true, result.exceptionOrNull() is ChatGptException)
57+
assertEquals(true, result.exceptionOrNull() is YChatException)
5858
}
5959

6060
private fun buildEditsDto(texts: List<String>): EditsDto {

0 commit comments

Comments
 (0)