Improve test "the response should contain object"

This commit is contained in:
2019-10-01 13:57:05 +02:00
parent 70c69bd626
commit 5d1bed5f22

View File

@@ -1,6 +1,8 @@
package feature package feature
import com.google.gson.JsonElement
import com.google.gson.JsonParser import com.google.gson.JsonParser
import com.google.gson.JsonPrimitive
import io.cucumber.datatable.DataTable import io.cucumber.datatable.DataTable
import io.cucumber.java8.En import io.cucumber.java8.En
import io.ktor.http.ContentType import io.ktor.http.ContentType
@@ -10,10 +12,8 @@ import io.ktor.http.HttpStatusCode
import io.ktor.server.testing.setBody import io.ktor.server.testing.setBody
import io.ktor.util.KtorExperimentalAPI import io.ktor.util.KtorExperimentalAPI
import kotlinx.serialization.ImplicitReflectionSerializer import kotlinx.serialization.ImplicitReflectionSerializer
import org.junit.jupiter.api.Assertions
import org.opentest4j.AssertionFailedError
import kotlin.test.assertEquals import kotlin.test.assertEquals
import kotlin.test.assertTrue import kotlin.test.fail
@ImplicitReflectionSerializer @ImplicitReflectionSerializer
@KtorExperimentalAPI @KtorExperimentalAPI
@@ -48,12 +48,9 @@ class KtorServerRequestSteps : En {
} }
Then("the response should contain object:") { expected: DataTable -> 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, String>(String::class.java, String::class.java).forEach { (key, valueExpected) -> expected.asMap<String, String>(String::class.java, String::class.java).forEach { (key, valueExpected) ->
assertTrue(response.has(key)) val jsonPrimitive = findJsonElement(key) as? JsonPrimitive ?: fail("\"$key\" element isn't json primitive")
Assertions.assertEquals(valueExpected, response.get(key).asString) assertEquals(jsonPrimitive.asString, valueExpected)
} }
} }
@@ -61,4 +58,28 @@ class KtorServerRequestSteps : En {
print(KtorServerContext.defaultServer.call?.response?.content) 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")
} }