diff --git a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt index d5939d5a191..7588e1f7619 100644 --- a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt +++ b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt @@ -85,6 +85,7 @@ class OpenApiGeneratorPlugin : Plugin { inputSpec.set(validate.inputSpec) recommend.set(validate.recommend) + treatWarningsAsErrors.set(validate.treatWarningsAsErrors) } register("openApiGenerate", GenerateTask::class.java).configure { diff --git a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorValidateExtension.kt b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorValidateExtension.kt index fb72552ee6e..3eaff1b7859 100644 --- a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorValidateExtension.kt +++ b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorValidateExtension.kt @@ -34,4 +34,9 @@ open class OpenApiGeneratorValidateExtension(project: Project) { * Whether to offer recommendations related to the validated specification document. */ val recommend = project.objects.property().convention(true) + + /** + * Whether to treat warnings as errors and fail the task. + */ + val treatWarningsAsErrors = project.objects.property().convention(false) } \ No newline at end of file diff --git a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/ValidateTask.kt b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/ValidateTask.kt index f379e6c45d2..7852b68a2fc 100644 --- a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/ValidateTask.kt +++ b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/ValidateTask.kt @@ -60,6 +60,10 @@ open class ValidateTask : DefaultTask() { @Input val recommend = project.objects.property().convention(true) + @Optional + @Input + val treatWarningsAsErrors = project.objects.property().convention(false) + @get:Internal @set:Option(option = "input", description = "The input specification.") var input: String? = null @@ -73,6 +77,7 @@ open class ValidateTask : DefaultTask() { val spec = inputSpec.get() val recommendations = recommend.get() + val failOnWarnings = treatWarningsAsErrors.get() logger.quiet("Validating spec $spec") @@ -117,10 +122,16 @@ open class ValidateTask : DefaultTask() { } throw GradleException("Validation failed.") - } else { - out.withStyle(StyledTextOutput.Style.Success) - logger.debug("No error validations from swagger-parser or internal validations.") - out.println("Spec is valid.") } + + if (failOnWarnings && validationResult.warnings.isNotEmpty()) { + out.withStyle(StyledTextOutput.Style.Error) + out.println("\nWarnings found in the spec and 'treatWarningsAsErrors' is enabled.\nFailing validation.\n") + throw GradleException("Validation failed due to warnings (treatWarningsAsErrors = true).") + } + + out.withStyle(StyledTextOutput.Style.Success) + logger.debug("No error validations from swagger-parser or internal validations.") + out.println("Spec is valid.") } } diff --git a/modules/openapi-generator-gradle-plugin/src/test/kotlin/ValidateTaskDslTest.kt b/modules/openapi-generator-gradle-plugin/src/test/kotlin/ValidateTaskDslTest.kt index c6687bd69a0..a7a5220d997 100644 --- a/modules/openapi-generator-gradle-plugin/src/test/kotlin/ValidateTaskDslTest.kt +++ b/modules/openapi-generator-gradle-plugin/src/test/kotlin/ValidateTaskDslTest.kt @@ -308,6 +308,48 @@ class ValidateTaskDslTest : TestBase() { ) } + @Test(dataProvider = "gradle_version_provider") + fun `openApiValidate should fail with treatWarningsAsErrors on valid spec with warnings`(gradleVersion: String?) { + // Arrange + val projectFiles = mapOf( + "spec.yaml" to javaClass.classLoader.getResourceAsStream("specs/petstore-v3.0-recommend.yaml") + ) + + withProject( + """ + | plugins { + | id 'org.openapi.generator' + | } + | + | openApiValidate { + | inputSpec = file("spec.yaml").absolutePath + | treatWarningsAsErrors = true + | } + """.trimMargin(), projectFiles + ) + + // Act + val result = getGradleRunner(gradleVersion) + .withProjectDir(temp) + .withArguments("openApiValidate") + .withPluginClasspath() + .buildAndFail() + + // Assert + assertTrue( + result.output.contains("Spec has issues or recommendations."), + "Unexpected/no message presented to the user for a valid spec." + ) + assertTrue( + result.output.contains("Failing validation."), + "Expected validation to fail due to warnings, but no failure message was found." + ) + assertEquals( + FAILED, result.task(":openApiValidate")?.outcome, + "Expected a failed run, but found ${result.task(":openApiValidate")?.outcome}" + ) + } + @Test(dataProvider = "gradle_version_provider") fun `openApiValidate should succeed without recommendations on valid spec`(gradleVersion: String?) { // Arrange