Skip to content

Commit 65a0f67

Browse files
committed
chore: refactoring to add test setup
1 parent fbc5c10 commit 65a0f67

File tree

19 files changed

+185
-60
lines changed

19 files changed

+185
-60
lines changed

backend/jvm/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,9 @@ dependencies {
225225
testImplementation(libs.testcontainers.junit5)
226226
testImplementation(libs.testcontainers.postgresql)
227227
testImplementation(libs.testcontainers.k3s)
228+
testImplementation(libs.okhttp.tls)
229+
testImplementation(libs.wiremock.standalone)
230+
testImplementation(libs.wiremock.kotlin)
228231
testImplementation(libs.kubernetes.client)
229232
testImplementation(libs.konsist)
230233

backend/jvm/src/test/kotlin/dev/suresh/AppTests.kt

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import com.lemonappdev.konsist.api.ext.list.enumConstants
55
import com.lemonappdev.konsist.api.ext.list.modifierprovider.withEnumModifier
66
import com.lemonappdev.konsist.api.ext.list.withAnnotationOf
77
import com.lemonappdev.konsist.api.verify.assertTrue
8-
import io.ktor.client.*
9-
import io.ktor.client.engine.java.*
8+
import dev.suresh.http.testHttpClient
109
import io.ktor.client.request.*
1110
import io.ktor.client.statement.*
1211
import io.ktor.http.*
@@ -27,7 +26,6 @@ import kotlinx.coroutines.test.runTest
2726
import kotlinx.coroutines.withContext
2827
import kotlinx.serialization.SerialName
2928
import kotlinx.serialization.Serializable
30-
import nl.altindag.ssl.SSLFactory
3129
import org.junit.jupiter.api.condition.EnabledIfSystemProperty
3230
import org.slf4j.LoggerFactory
3331
import org.slf4j.MDC
@@ -173,16 +171,7 @@ class AppTests {
173171
nginx.use {
174172
it.start()
175173
val endPoint = "https://${it.host}:${it.getMappedPort(tlsPort)}/"
176-
val client =
177-
HttpClient(Java) {
178-
engine {
179-
config {
180-
sslContext(SSLFactory.builder().withUnsafeTrustMaterial().build().sslContext)
181-
}
182-
}
183-
}
184-
185-
val statusCode = client.get(endPoint).status
174+
val statusCode = testHttpClient.get(endPoint).status
186175
assertTrue(statusCode.value == 200)
187176
}
188177
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package dev.suresh
2+
3+
import com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig
4+
import com.github.tomakehurst.wiremock.junit5.WireMockExtension
5+
import com.marcinziolo.kotlin.wiremock.get
6+
import com.marcinziolo.kotlin.wiremock.like
7+
import com.marcinziolo.kotlin.wiremock.returns
8+
import dev.suresh.http.testHttpClient
9+
import io.ktor.client.plugins.defaultRequest
10+
import io.ktor.client.request.get
11+
import io.ktor.client.statement.bodyAsText
12+
import java.net.InetAddress
13+
import kotlin.test.Test
14+
import kotlin.test.assertEquals
15+
import kotlinx.coroutines.test.runTest
16+
import org.junit.jupiter.api.condition.EnabledIfSystemProperty
17+
import org.junit.jupiter.api.extension.RegisterExtension
18+
19+
@EnabledIfSystemProperty(named = "jdk.net.hosts.file", matches = "true")
20+
class DnsTest {
21+
22+
companion object {
23+
24+
@JvmField
25+
@RegisterExtension
26+
val wireMock =
27+
WireMockExtension.newInstance()
28+
.options(
29+
wireMockConfig().httpDisabled(true).httpsPort(8888)
30+
// .keystorePath("src/test/resources/keystore.jks")
31+
// .keystorePassword("changeit")
32+
// .keyManagerPassword("changeit")
33+
// .keystoreType("PKCS12")
34+
// .trustStorePath("src/test/resources/truststore.jks")
35+
// .trustStorePassword("changeit")
36+
// .trustStoreType("PKCS12")
37+
// .needClientAuth(true)
38+
)
39+
.build()
40+
}
41+
42+
@Test
43+
fun hostFileTest() = runTest {
44+
val addr = InetAddress.getByName("test.dev")
45+
assertEquals("127.0.0.1", addr.hostAddress, "Address should be 127.0.0.1")
46+
}
47+
48+
@Test
49+
fun wireMockTest() = runTest {
50+
wireMock.get { url like "/users/.*" } returns
51+
{
52+
header = "Content-Type" to "application/json"
53+
statusCode = 200
54+
body =
55+
"""
56+
{
57+
"id": 1,
58+
"name": "Suresh"
59+
}
60+
"""
61+
}
62+
63+
val client = testHttpClient.config { defaultRequest { url(wireMock.baseUrl()) } }
64+
println(client.get("/users/1").bodyAsText())
65+
}
66+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package dev.suresh.http
2+
3+
import io.ktor.client.HttpClient
4+
import io.ktor.client.engine.java.Java
5+
import nl.altindag.ssl.SSLFactory
6+
7+
val testSSLFactory by lazy { SSLFactory.builder().withUnsafeTrustMaterial().build() }
8+
9+
val testHttpClient by lazy {
10+
HttpClient(Java) { engine { config { sslContext(testSSLFactory.sslContext) } } }
11+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
127.0.0.1 test.dev www.test.dev

compose/cmp/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ kotlin {
3131
// implementation(compose.materialIconsExtended)
3232
implementation(libs.compose.navigation)
3333
implementation(libs.compose.lifecycle.viewmodel)
34+
implementation(libs.compose.kottie)
3435
// project.dependencies.detektPlugins(libs.detekt.compose.rules)
3536
}
3637

compose/cmp/src/commonMain/composeResources/files/lottie/anim.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

compose/cmp/src/commonMain/kotlin/ui/home/HomeScreen.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import org.jetbrains.compose.resources.painterResource
2626
import org.jetbrains.compose.resources.vectorResource
2727
import org.jetbrains.compose.ui.tooling.preview.Preview
2828
import ui.debug
29+
import ui.lottie.lottie
2930

3031
@Composable
3132
@Preview
@@ -77,10 +78,14 @@ fun Home(navToFile: () -> Unit, navToImage: () -> Unit) {
7778
}
7879

7980
AnimatedVisibility(visible = showImage) {
80-
Image(
81-
modifier = Modifier.size(100.dp),
82-
imageVector = vectorResource(Res.drawable.compose_multiplatform),
83-
contentDescription = "Logo")
81+
Row {
82+
Image(
83+
modifier = Modifier.size(100.dp),
84+
imageVector = vectorResource(Res.drawable.compose_multiplatform),
85+
contentDescription = "Logo")
86+
87+
lottie()
88+
}
8489
}
8590

8691
Row {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package ui.lottie
2+
3+
import KottieAnimation
4+
import androidx.compose.runtime.*
5+
import androidx.compose.runtime.Composable
6+
import androidx.compose.runtime.mutableStateOf
7+
import androidx.compose.ui.Modifier
8+
import dev.suresh.compose.res.Res
9+
import kottieComposition.KottieCompositionSpec
10+
import kottieComposition.animateKottieCompositionAsState
11+
import kottieComposition.rememberKottieComposition
12+
import org.jetbrains.compose.resources.ExperimentalResourceApi
13+
14+
@OptIn(ExperimentalResourceApi::class)
15+
@Composable
16+
fun lottie(modifier: Modifier = Modifier, res: String = "files/lottie/anim.json") {
17+
var afterEffectAnim by remember { mutableStateOf("") }
18+
19+
LaunchedEffect(Unit) { afterEffectAnim = Res.readBytes(res).decodeToString() }
20+
21+
val composition = rememberKottieComposition(spec = KottieCompositionSpec.File(afterEffectAnim))
22+
val animationState by
23+
animateKottieCompositionAsState(
24+
composition = composition,
25+
isPlaying = true,
26+
)
27+
28+
KottieAnimation(
29+
modifier = modifier,
30+
composition = composition,
31+
progress = { animationState.progress },
32+
)
33+
}

compose/cmp/src/jvmMain/kotlin/ui/crash/CrashDialog.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,7 @@ import javax.swing.JScrollPane
1414
import javax.swing.JTextArea
1515
import kotlin.system.exitProcess
1616

17-
private const val FONT_SIZE = 10
18-
private const val MSG_WIDTH = 640
19-
private const val MSG_HEIGHT = 480
20-
2117
fun showCrashDialog(logDirectory: File, exception: Throwable) {
22-
val title = "App failed unexpectedly"
2318
val text = buildString {
2419
appendLine("Log directory:")
2520
appendLine(logDirectory)
@@ -31,14 +26,14 @@ fun showCrashDialog(logDirectory: File, exception: Throwable) {
3126
null,
3227
JScrollPane(
3328
JTextArea(text).apply {
34-
font = Font(Font.MONOSPACED, Font.PLAIN, FONT_SIZE)
29+
font = Font(Font.MONOSPACED, Font.PLAIN, 10)
3530
lineWrap = false
3631
},
3732
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
3833
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS,
3934
)
40-
.apply { preferredSize = Dimension(MSG_WIDTH, MSG_HEIGHT) },
41-
title,
35+
.apply { preferredSize = Dimension(640, 480) },
36+
"App failed unexpectedly",
4237
JOptionPane.ERROR_MESSAGE,
4338
)
4439
}

0 commit comments

Comments
 (0)