From 4fd5f328f0fdb906f25e9c5b36c136df2f059a80 Mon Sep 17 00:00:00 2001 From: benfonty Date: Fri, 8 Apr 2022 08:08:10 +0200 Subject: [PATCH] fix: #76 yaml group export --- build.gradle.kts | 2 + .../gradle/plugin/OpenApiGeneratorTask.kt | 2 +- .../gradle/plugin/OpenApiGradlePluginTest.kt | 63 ++++++++++++++++++- 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 1867ae3..574ab66 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -56,6 +56,8 @@ dependencies { testImplementation(platform("org.junit:junit-bom:5.7.1")) testImplementation("org.junit.jupiter:junit-jupiter") testImplementation("com.beust:klaxon:5.5") + testImplementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.2") + testImplementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2") detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.16.0") } diff --git a/src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGeneratorTask.kt b/src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGeneratorTask.kt index c2d7389..19ab113 100644 --- a/src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGeneratorTask.kt +++ b/src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGeneratorTask.kt @@ -74,7 +74,7 @@ open class OpenApiGeneratorTask : DefaultTask() { logger.info("Generating OpenApi Docs..") val response: Response = khttp.get(url) - val isYaml = url.toLowerCase().matches(Regex(".+[./]yaml$")) + val isYaml = url.toLowerCase().matches(Regex(".+[./]yaml(/.+)*")) val apiDocs = if (isYaml) response.text else prettifyJson(response) val outputFile = outputDir.file(fileName).get().asFile diff --git a/src/test/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGradlePluginTest.kt b/src/test/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGradlePluginTest.kt index 0e454a6..bd1e82d 100644 --- a/src/test/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGradlePluginTest.kt +++ b/src/test/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGradlePluginTest.kt @@ -2,6 +2,10 @@ package org.springdoc.openapi.gradle.plugin import com.beust.klaxon.JsonObject import com.beust.klaxon.Parser +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.node.TextNode +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory +import com.fasterxml.jackson.module.kotlin.KotlinModule import org.gradle.internal.impldep.org.apache.commons.lang.RandomStringUtils import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner @@ -20,6 +24,9 @@ class OpenApiGradlePluginTest { private val buildFile = File(projectTestDir, "build.gradle") private val projectBuildDir = File(projectTestDir, "build") + private val pathsField = "paths" + private val openapiField = "openapi" + private val baseBuildGradle = """plugins { id 'java' id 'org.springframework.boot' version '2.4.5' @@ -149,6 +156,24 @@ class OpenApiGradlePluginTest { assertOpenApiJsonFile(1) } + @Test + fun `yaml generation`() { + val outputYamlFileName = "openapi.yaml" + + buildFile.writeText( + """$baseBuildGradle + + openApi{ + apiDocsUrl = "http://localhost:8080/v3/api-docs.yaml" + outputFileName = "$outputYamlFileName" + } + """.trimMargin() + ) + + assertEquals(TaskOutcome.SUCCESS, openApiDocsTask(runTheBuild()).outcome) + assertOpenApiYamlFile(1, outputYamlFileName) + } + @Test fun `using multiple grouped apis`() { val outputJsonFileNameGroupA = "openapi-groupA.json" @@ -171,6 +196,28 @@ class OpenApiGradlePluginTest { assertOpenApiJsonFile(2, outputJsonFileNameGroupB) } + @Test + fun `using multiple grouped apis with yaml`() { + val outputYamlFileNameGroupA = "openapi-groupA.yaml" + val outputYamlFileNameGroupB = "openapi-groupB.yaml" + + buildFile.writeText( + """$baseBuildGradle + bootRun { + args = ["--spring.profiles.active=multiple-grouped-apis"] + } + openApi{ + groupedApiMappings = ["http://localhost:8080/v3/api-docs.yaml/groupA": "$outputYamlFileNameGroupA", + "http://localhost:8080/v3/api-docs.yaml/groupB": "$outputYamlFileNameGroupB"] + } + """.trimMargin() + ) + + assertEquals(TaskOutcome.SUCCESS, openApiDocsTask(runTheBuild()).outcome) + assertOpenApiYamlFile(1, outputYamlFileNameGroupA) + assertOpenApiYamlFile(2, outputYamlFileNameGroupB) + } + @Test fun `using multiple grouped apis should ignore single api properties`() { val outputJsonFileNameSingleGroupA = "openapi-single-groupA.json" @@ -209,11 +256,23 @@ class OpenApiGradlePluginTest { buildDir: File = projectBuildDir ) { val openApiJson = getOpenApiJsonAtLocation(File(buildDir, outputJsonFileName)) - assertEquals("3.0.1", openApiJson.string("openapi")) - assertEquals(expectedPathCount, openApiJson.obj("paths")!!.size) + assertEquals("3.0.1", openApiJson.string(openapiField)) + assertEquals(expectedPathCount, openApiJson.obj(pathsField)!!.size) } private fun getOpenApiJsonAtLocation(path: File) = Parser.default().parse(FileReader(path)) as JsonObject + private fun assertOpenApiYamlFile( + expectedPathCount: Int, + outputJsonFileName: String = DEFAULT_OPEN_API_FILE_NAME, + buildDir: File = projectBuildDir + ) { + val mapper = ObjectMapper(YAMLFactory()) + mapper.registerModule(KotlinModule.Builder().build()) + val node = mapper.readTree(File(buildDir, outputJsonFileName)) + assertEquals("3.0.1", node.get(openapiField).asText()) + assertEquals(expectedPathCount, node.get(pathsField)!!.size()) + } + private fun openApiDocsTask(result: BuildResult) = result.tasks.find { it.path.contains("generateOpenApiDocs") }!! }