Skip to content

Commit be7f998

Browse files
committed
test: use ktor test support for running a model-server in TypedModelQLTest
The previous solution with this `ci.sh` script starting a model server process is terrible for debugging. Have to migrate all the other tests as well, but this one I just had to debug.
1 parent e5c9d05 commit be7f998

File tree

4 files changed

+53
-48
lines changed

4 files changed

+53
-48
lines changed

model-api-gen-gradle-test/kotlin-generation/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ dependencies {
2626
testImplementation(libs.ktor.server.websockets)
2727
testImplementation(libs.ktor.server.test.host)
2828
testImplementation(libs.logback.classic)
29+
testImplementation("org.modelix:model-server")
2930
}
3031

3132
tasks.test {

model-api-gen-gradle-test/kotlin-generation/src/test/kotlin/org/modelix/modelql/typed/TypedModelQLTest.kt

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.modelix.modelql.typed
22

3+
import io.ktor.server.testing.ApplicationTestBuilder
4+
import io.ktor.server.testing.testApplication
35
import jetbrains.mps.baseLanguage.C_ClassConcept
46
import jetbrains.mps.baseLanguage.C_IntegerType
57
import jetbrains.mps.baseLanguage.C_MinusExpression
@@ -17,19 +19,24 @@ import jetbrains.mps.core.xml.C_XmlDocument
1719
import jetbrains.mps.core.xml.C_XmlFile
1820
import jetbrains.mps.lang.editor.imageGen.C_ImageGenerator
1921
import jetbrains.mps.lang.editor.imageGen.ImageGenerator
20-
import kotlinx.coroutines.runBlocking
2122
import org.junit.jupiter.api.TestInstance
2223
import org.modelix.apigen.test.ApigenTestLanguages
2324
import org.modelix.metamodel.instanceOf
2425
import org.modelix.metamodel.typed
2526
import org.modelix.metamodel.untyped
27+
import org.modelix.metamodel.untypedConcept
2628
import org.modelix.model.ModelFacade
2729
import org.modelix.model.api.INode
2830
import org.modelix.model.api.remove
2931
import org.modelix.model.api.resolve
3032
import org.modelix.model.client2.ModelClientV2
3133
import org.modelix.model.client2.runWrite
3234
import org.modelix.model.lazy.RepositoryId
35+
import org.modelix.model.server.handlers.IdsApiImpl
36+
import org.modelix.model.server.handlers.ModelReplicationServer
37+
import org.modelix.model.server.handlers.RepositoriesManager
38+
import org.modelix.model.server.installDefaultServerPlugins
39+
import org.modelix.model.server.store.InMemoryStoreClient
3340
import org.modelix.modelql.client.ModelQLClient
3441
import org.modelix.modelql.core.asMono
3542
import org.modelix.modelql.core.count
@@ -60,7 +67,6 @@ import org.modelix.modelql.gen.jetbrains.mps.lang.editor.imageGen.setNode
6067
import org.modelix.modelql.untyped.children
6168
import org.modelix.modelql.untyped.conceptReference
6269
import org.modelix.modelql.untyped.descendants
63-
import kotlin.test.BeforeTest
6470
import kotlin.test.Test
6571
import kotlin.test.assertEquals
6672
import kotlin.test.assertNotEquals
@@ -71,33 +77,40 @@ import kotlin.test.assertTrue
7177
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
7278
class TypedModelQLTest {
7379

74-
private var testRun = 0
75-
private val modelClient = ModelClientV2.builder().url("http://localhost:28102/v2/").build().also { runBlocking { it.init() } }
7680
private val branchRef
77-
get() = ModelFacade.createBranchReference(RepositoryId("modelql-test$testRun"), "master")
81+
get() = ModelFacade.createBranchReference(RepositoryId("modelql-test"), "master")
82+
83+
private fun runTest(block: suspend ApplicationTestBuilder.(ModelQLClient) -> Unit) = testApplication {
84+
application {
85+
try {
86+
installDefaultServerPlugins()
87+
val repoManager = RepositoriesManager(InMemoryStoreClient())
88+
ModelReplicationServer(repoManager).init(this)
89+
IdsApiImpl(repoManager).init(this)
90+
} catch (ex: Throwable) {
91+
ex.printStackTrace()
92+
}
93+
}
7894

79-
private fun runTest(block: suspend (ModelQLClient) -> Unit) {
95+
val modelClient = ModelClientV2.builder()
96+
.client(client)
97+
.url("http://localhost/v2/")
98+
.build()
99+
.also { it.init() }
100+
modelClient.runWrite(branchRef) {
101+
createTestData(it)
102+
}
80103
val modelQlClient = ModelQLClient.builder()
81-
.url("http://localhost:28102/v2/repositories/${branchRef.repositoryId.id}/branches/${branchRef.branchName}/query")
104+
.httpClient(client)
105+
.url("http://localhost/v2/repositories/${branchRef.repositoryId.id}/branches/${branchRef.branchName}/query")
82106
.build()
83-
84-
runBlocking { block(modelQlClient) }
107+
block(modelQlClient)
85108
}
86109

87110
init {
88111
ApigenTestLanguages.registerAll()
89112
}
90113

91-
@BeforeTest
92-
fun setup() {
93-
testRun++
94-
runBlocking {
95-
modelClient.runWrite(branchRef) {
96-
createTestData(it)
97-
}
98-
}
99-
}
100-
101114
protected fun createTestData(rootNode: INode) {
102115
rootNode.allChildren.forEach { it.remove() }
103116
val cls1 = rootNode.addNewChild("classes", -1, C_ClassConcept.untyped()).typed<ClassConcept>()
@@ -362,7 +375,7 @@ class TypedModelQLTest {
362375
root.descendants().ofConcept(C_ReturnStatement).first().expression
363376
}
364377
assertNotNull(actual)
365-
assertTrue(actual.instanceOf(C_MinusExpression))
378+
assertTrue(actual.instanceOf(C_MinusExpression), actual.untypedConcept().getLongName())
366379
}
367380

368381
@Test

model-server/src/main/kotlin/org/modelix/model/server/Main.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import io.ktor.serialization.kotlinx.json.json
99
import io.ktor.server.application.Application
1010
import io.ktor.server.application.ApplicationCall
1111
import io.ktor.server.application.install
12+
import io.ktor.server.application.pluginOrNull
1213
import io.ktor.server.engine.connector
1314
import io.ktor.server.engine.embeddedServer
1415
import io.ktor.server.http.content.staticResources
@@ -31,13 +32,13 @@ import io.ktor.server.routing.routing
3132
import io.ktor.server.websocket.WebSockets
3233
import io.ktor.server.websocket.pingPeriod
3334
import io.ktor.server.websocket.timeout
34-
import kotlinx.serialization.encodeToString
3535
import kotlinx.serialization.json.Json
3636
import org.apache.commons.io.FileUtils
3737
import org.apache.ignite.Ignition
3838
import org.modelix.authorization.ModelixAuthorization
3939
import org.modelix.authorization.NoPermissionException
4040
import org.modelix.authorization.NotLoggedInException
41+
import org.modelix.model.server.Main.installStatusPages
4142
import org.modelix.model.server.handlers.AboutApiImpl
4243
import org.modelix.model.server.handlers.HealthApiImpl
4344
import org.modelix.model.server.handlers.HttpException
@@ -345,3 +346,20 @@ object Main {
345346
},
346347
)
347348
}
349+
350+
fun Application.installDefaultServerPlugins(unitTestMode: Boolean = true) {
351+
install(WebSockets)
352+
install(ContentNegotiation) {
353+
json()
354+
registerJsonTypes()
355+
}
356+
install(Resources)
357+
install(IgnoreTrailingSlash)
358+
installStatusPages()
359+
if (pluginOrNull(ModelixAuthorization) == null) {
360+
install(ModelixAuthorization) {
361+
if (unitTestMode) configureForUnitTests()
362+
permissionSchema = ModelServerPermissionSchema.SCHEMA
363+
}
364+
}
365+
}

model-server/src/test/kotlin/org/modelix/model/server/ModelServerTestUtil.kt

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,20 @@
11
package org.modelix.model.server
22

3-
import io.ktor.serialization.kotlinx.json.json
43
import io.ktor.server.application.Application
5-
import io.ktor.server.application.install
6-
import io.ktor.server.application.pluginOrNull
74
import io.ktor.server.engine.EmbeddedServer
85
import io.ktor.server.engine.connector
96
import io.ktor.server.engine.embeddedServer
107
import io.ktor.server.netty.Netty
118
import io.ktor.server.netty.NettyApplicationEngine
12-
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
13-
import io.ktor.server.resources.Resources
14-
import io.ktor.server.routing.IgnoreTrailingSlash
159
import io.ktor.server.testing.ApplicationTestBuilder
16-
import io.ktor.server.websocket.WebSockets
1710
import kotlinx.coroutines.runBlocking
18-
import org.modelix.authorization.ModelixAuthorization
1911
import org.modelix.model.client2.ModelClientV2
20-
import org.modelix.model.server.Main.installStatusPages
21-
import org.modelix.model.server.handlers.Paths.registerJsonTypes
2212

2313
suspend fun ApplicationTestBuilder.createModelClient(): ModelClientV2 {
2414
val url = "http://localhost/v2"
2515
return ModelClientV2.builder().url(url).client(client).build().also { it.init() }
2616
}
2717

28-
fun Application.installDefaultServerPlugins(unitTestMode: Boolean = true) {
29-
install(WebSockets)
30-
install(ContentNegotiation) {
31-
json()
32-
registerJsonTypes()
33-
}
34-
install(Resources)
35-
install(IgnoreTrailingSlash)
36-
installStatusPages()
37-
if (pluginOrNull(ModelixAuthorization) == null) {
38-
install(ModelixAuthorization) {
39-
if (unitTestMode) configureForUnitTests()
40-
permissionSchema = ModelServerPermissionSchema.SCHEMA
41-
}
42-
}
43-
}
44-
4518
/**
4619
* Allow running a model server for test with Netty.
4720
*

0 commit comments

Comments
 (0)