From 5d1bed5f221953fdf1cecb4162317d4b57db5c18 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Tue, 1 Oct 2019 13:57:05 +0200 Subject: [PATCH] Improve test "the response should contain object" --- .../kotlin/feature/KtorServerRequestSteps.kt | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/test/kotlin/feature/KtorServerRequestSteps.kt b/src/test/kotlin/feature/KtorServerRequestSteps.kt index 8f880ea..1751cbc 100644 --- a/src/test/kotlin/feature/KtorServerRequestSteps.kt +++ b/src/test/kotlin/feature/KtorServerRequestSteps.kt @@ -1,6 +1,8 @@ package feature +import com.google.gson.JsonElement import com.google.gson.JsonParser +import com.google.gson.JsonPrimitive import io.cucumber.datatable.DataTable import io.cucumber.java8.En import io.ktor.http.ContentType @@ -10,10 +12,8 @@ import io.ktor.http.HttpStatusCode import io.ktor.server.testing.setBody import io.ktor.util.KtorExperimentalAPI import kotlinx.serialization.ImplicitReflectionSerializer -import org.junit.jupiter.api.Assertions -import org.opentest4j.AssertionFailedError import kotlin.test.assertEquals -import kotlin.test.assertTrue +import kotlin.test.fail @ImplicitReflectionSerializer @KtorExperimentalAPI @@ -48,12 +48,9 @@ class KtorServerRequestSteps : En { } Then("the response should contain object:") { expected: DataTable -> - val call = KtorServerContext.defaultServer.call ?: throw AssertionFailedError("No call") - val response = JsonParser().parse(call.response.content).getAsJsonObject() - expected.asMap(String::class.java, String::class.java).forEach { (key, valueExpected) -> - assertTrue(response.has(key)) - Assertions.assertEquals(valueExpected, response.get(key).asString) + val jsonPrimitive = findJsonElement(key) as? JsonPrimitive ?: fail("\"$key\" element isn't json primitive") + assertEquals(jsonPrimitive.asString, valueExpected) } } @@ -61,4 +58,28 @@ class KtorServerRequestSteps : En { print(KtorServerContext.defaultServer.call?.response?.content) } } + + private fun findJsonElement(node: String): JsonElement { + var jsonElement: JsonElement = responseJsonElement + val elements = node.split("].", "[", ".") + + elements + .filter { it.trim().isNotBlank() } + .map { it.trim() } + .forEach { + val asArrayIndex = """^\d+$""".toRegex().find(it) + + jsonElement = if (asArrayIndex != null) { + val index = asArrayIndex.groups.first()!! + jsonElement.asJsonArray.get(index.value.toInt()) + } else { + jsonElement.asJsonObject.get(it) ?: throw AssertionError("\"$node\" element not found on json response") + } + } + + return jsonElement + } + + private val responseJsonElement: JsonElement + get() = JsonParser().parse(KtorServerContext.defaultServer.call?.response?.content).getAsJsonObject() ?: fail("The response isn't valid JSON") }