Skip to content

Commit

Permalink
#714 prefer literal YAML OAS in tests vs building from POJOs
Browse files Browse the repository at this point in the history
  • Loading branch information
David Dufour-Boivin committed Jul 2, 2018
1 parent a060208 commit 0eef626
Showing 1 changed file with 49 additions and 35 deletions.
Expand Up @@ -7,14 +7,8 @@ import de.zalando.zally.rule.api.Violation
import de.zalando.zally.util.PatternUtil.isApplicationJsonOrProblemJson
import de.zalando.zally.util.PatternUtil.isCustomMediaTypeWithVersioning
import io.swagger.v3.oas.models.OpenAPI
import io.swagger.v3.oas.models.Operation
import io.swagger.v3.oas.models.PathItem
import io.swagger.v3.oas.models.Paths
import io.swagger.v3.oas.models.media.Content
import io.swagger.v3.oas.models.media.MediaType
import io.swagger.v3.oas.models.responses.ApiResponse
import io.swagger.v3.oas.models.responses.ApiResponses
import org.assertj.core.api.Assertions.assertThat
import org.intellij.lang.annotations.Language
import org.junit.Test

class MediaTypesRuleTest {
Expand Down Expand Up @@ -57,29 +51,66 @@ class MediaTypesRuleTest {

@Test
fun `versioned custom media type causes no violation`() {
val context = contextWithMediaTypes(
"/shipment-order/{shipment_order_id}" to listOf(
"application/x.zalando.contract+json;v=123",
"application/vnd.api+json;version=3"))
@Language("YAML")
val context = Context.createOpenApiContext("""
openapi: 3.0.0
paths:
"/shipment-order/{shipment_order_id}":
get:
responses:
200:
content:
"application/x.zalando.contract+json;v=123": {}
"application/vnd.api+json;version=3": {}
""".trimIndent())!!
assertThat(rule.validate(context)).isEmpty()
}

@Test
fun `custom media type without versioning causes violation`() {
val path = "/shipment-order/{shipment_order_id}"
val context = contextWithMediaTypes(path to listOf("application/json", "application/vnd.api+json"))
@Language("YAML")
val context = Context.createOpenApiContext("""
openapi: 3.0.0
paths:
"/shipment-order/{shipment_order_id}":
get:
responses:
200:
content:
"application/json": {}
"application/vnd.api+json": {}
""".trimIndent())!!
assertThat(rule.validate(context)).hasSameElementsAs(listOf(
v("/paths/~1shipment-order~1{shipment_order_id}/get/responses/200/content/application~1vnd.api+json")
))
}

@Test
fun `only some of multiple paths without versioning causes violation`() {
val context = contextWithMediaTypes(
"/path1" to listOf("application/json", "application/vnd.api+json"),
"/path2" to listOf("application/x.zalando.contract+json"),
"/path3" to listOf("application/x.zalando.contract+json;v=123")
)
@Language("YAML")
val context = Context.createOpenApiContext("""
openapi: 3.0.0
paths:
"/path1":
get:
responses:
200:
content:
"application/json": {}
"application/vnd.api+json": {}
"/path2":
get:
responses:
200:
content:
"application/x.zalando.contract+json": {}
"/path3":
get:
responses:
200:
content:
"application/x.zalando.contract+json;v=123": {}
""".trimIndent())!!
val result = rule.validate(context)
assertThat(result).hasSameElementsAs(listOf(
v("/paths/~1path1/get/responses/200/content/application~1vnd.api+json"),
Expand Down Expand Up @@ -112,23 +143,6 @@ class MediaTypesRuleTest {

private val rule = MediaTypesRule()

private fun contextWithMediaTypes(vararg pathToMedia: Pair<String, List<String>>): Context =
Context(OpenAPI().apply {
paths = pathToMedia.fold(Paths()) { paths, (path, types) ->
paths.addPathItem(path, PathItem().apply {
get = Operation().apply {
responses = ApiResponses().apply {
addApiResponse("200", ApiResponse().apply {
content = types.fold(Content()) { content, type ->
content.addMediaType(type, MediaType())
}
})
}
}
})
}
})

private fun v(pointer: String) = Violation(
description = "Custom media types should only be used for versioning",
pointer = JsonPointer.compile(pointer)
Expand Down

0 comments on commit 0eef626

Please sign in to comment.