From a3c19fca4727e2bcaa8034d0f0ccf98fb6aff163 Mon Sep 17 00:00:00 2001 From: dys Date: Wed, 13 Sep 2023 21:34:50 +0900 Subject: [PATCH 1/4] spec for recommend test --- .../specs/petstore-v3.0-recommend.yaml | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 modules/openapi-generator-gradle-plugin/src/test/resources/specs/petstore-v3.0-recommend.yaml diff --git a/modules/openapi-generator-gradle-plugin/src/test/resources/specs/petstore-v3.0-recommend.yaml b/modules/openapi-generator-gradle-plugin/src/test/resources/specs/petstore-v3.0-recommend.yaml new file mode 100644 index 000000000000..2319a08b2597 --- /dev/null +++ b/modules/openapi-generator-gradle-plugin/src/test/resources/specs/petstore-v3.0-recommend.yaml @@ -0,0 +1,114 @@ +openapi: "3.0.0" +info: + version: 1.0.0 + title: Swagger Petstore + license: + name: MIT +servers: + - url: http://petstore.swagger.io/v1 +paths: + /pets: + get: + summary: List all pets + operationId: listPets + tags: + - pets + parameters: + - name: limit + in: query + description: How many items to return at one time (max 100) + required: false + schema: + type: integer + format: int32 + requestBody: # warning `API GET/HEAD defined with request body` + content: + application/json: + schema: + $ref: "#/components/schemas/Pets" + responses: + '200': + description: A paged array of pets + headers: + x-next: + description: A link to the next page of responses + schema: + type: string + content: + application/json: + schema: + $ref: "#/components/schemas/Pets" + default: + description: unexpected error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + post: + summary: Create a pet + operationId: createPets + tags: + - pets + responses: + '201': + description: Null response + default: + description: unexpected error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /pets/{petId}: + get: + summary: Info for a specific pet + operationId: showPetById + tags: + - pets + parameters: + - name: petId + in: path + required: true + description: The id of the pet to retrieve + schema: + type: string + responses: + '200': + description: Expected response to a valid request + content: + application/json: + schema: + $ref: "#/components/schemas/Pets" + default: + description: unexpected error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" +components: + schemas: + Pet: + required: + - id + - name + properties: + id: + type: integer + format: int64 + name: + type: string + tag: + type: string + Pets: + type: array + items: + $ref: "#/components/schemas/Pet" + Error: + required: + - code + - message + properties: + code: + type: integer + format: int32 + message: + type: string From 7f00a5804d30130364244625db87ba86a4889716 Mon Sep 17 00:00:00 2001 From: dys Date: Wed, 13 Sep 2023 22:53:28 +0900 Subject: [PATCH 2/4] add ValidateTask test for custom defined tasks --- .../src/test/kotlin/ValidateTaskDslTest.kt | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) 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 ac457cda6431..110df71db1cc 100644 --- a/modules/openapi-generator-gradle-plugin/src/test/kotlin/ValidateTaskDslTest.kt +++ b/modules/openapi-generator-gradle-plugin/src/test/kotlin/ValidateTaskDslTest.kt @@ -144,4 +144,77 @@ class ValidateTaskDslTest : TestBase() { "Expected a failed run, but found ${result.task(":openApiValidate")?.outcome}" ) } + + @Test(dataProvider = "gradle_version_provider") + fun `validateGoodSpec as defined task should succeed on valid spec`(gradleVersion: String?) { + // Arrange + val projectFiles = mapOf( + "spec.yaml" to javaClass.classLoader.getResourceAsStream("specs/petstore-v3.0.yaml") + ) + + withProject( + """ + | plugins { + | id 'org.openapi.generator' + | } + | + | task validateGoodSpec(type: org.openapitools.generator.gradle.plugin.tasks.ValidateTask) { + | inputSpec.set(file("spec.yaml").absolutePath) + | } + """.trimMargin(), projectFiles + ) + + // Act + val result = getGradleRunner(gradleVersion) + .withProjectDir(temp) + .withArguments("validateGoodSpec") + .withPluginClasspath() + .build() + + // Assert + assertTrue( + result.output.contains("Spec is valid."), + "Unexpected/no message presented to the user for a valid spec." + ) + assertEquals( + SUCCESS, result.task(":validateGoodSpec")?.outcome, + "Expected a successful run, but found ${result.task(":validateGoodSpec")?.outcome}" + ) + } + + @Test(dataProvider = "gradle_version_provider") + fun `validateBadSpec as defined task should fail on invalid spec`(gradleVersion: String?) { + // Arrange + val projectFiles = mapOf( + "spec.yaml" to javaClass.classLoader.getResourceAsStream("specs/petstore-v3.0-invalid.yaml") + ) + withProject( + """ + | plugins { + | id 'org.openapi.generator' + | } + | + | task validateBadSpec(type: org.openapitools.generator.gradle.plugin.tasks.ValidateTask) { + | inputSpec.set(file("spec.yaml").absolutePath) + | } + """.trimMargin(), projectFiles + ) + + // Act + val result = getGradleRunner(gradleVersion) + .withProjectDir(temp) + .withArguments("validateBadSpec") + .withPluginClasspath() + .buildAndFail() + + // Assert + assertTrue( + result.output.contains("Spec is invalid."), + "Unexpected/no message presented to the user for an invalid spec." + ) + assertEquals( + FAILED, result.task(":validateBadSpec")?.outcome, + "Expected a failed run, but found ${result.task(":validateBadSpec")?.outcome}" + ) + } } From 3e12e55a0f1a6772e3c75c0cbd7eb52f729f53d7 Mon Sep 17 00:00:00 2001 From: dys Date: Wed, 13 Sep 2023 22:53:55 +0900 Subject: [PATCH 3/4] add ValidateTask test for recommend option --- .../src/test/kotlin/ValidateTaskDslTest.kt | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) 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 110df71db1cc..ff05a5784ca1 100644 --- a/modules/openapi-generator-gradle-plugin/src/test/kotlin/ValidateTaskDslTest.kt +++ b/modules/openapi-generator-gradle-plugin/src/test/kotlin/ValidateTaskDslTest.kt @@ -217,4 +217,88 @@ class ValidateTaskDslTest : TestBase() { "Expected a failed run, but found ${result.task(":validateBadSpec")?.outcome}" ) } + + @Test(dataProvider = "gradle_version_provider") + fun `openApiValidate should succeed with recommendations on valid spec`(gradleVersion: String?) { + // Arrange + val projectFiles = mapOf( + "spec.yaml" to javaClass.classLoader.getResourceAsStream("specs/petstore-v3.0-recommend.yaml") + ) + + // recommend = true is the default + withProject( + """ + | plugins { + | id 'org.openapi.generator' + | } + | + | openApiValidate { + | inputSpec = file("spec.yaml").absolutePath + | } + """.trimMargin(), projectFiles + ) + + // Act + val result = getGradleRunner(gradleVersion) + .withProjectDir(temp) + .withArguments("openApiValidate") + .withPluginClasspath() + .build() + + // Assert + assertTrue( + result.output.contains("Spec is valid."), + "Unexpected/no message presented to the user for a valid spec." + ) + assertTrue( + result.output.contains("Spec has issues or recommendations."), + "Unexpected/no recommendations message presented to the user for a valid spec." + ) + assertEquals( + SUCCESS, result.task(":openApiValidate")?.outcome, + "Expected a successful run, but found ${result.task(":openApiValidate")?.outcome}" + ) + } + + @Test(dataProvider = "gradle_version_provider") + fun `openApiValidate should succeed without recommendations on valid spec`(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 + | recommend = false + | } + """.trimMargin(), projectFiles + ) + + // Act + val result = getGradleRunner(gradleVersion) + .withProjectDir(temp) + .withArguments("openApiValidate") + .withPluginClasspath() + .build() + + // Assert + assertTrue( + result.output.contains("Spec is valid."), + "Unexpected/no message presented to the user for a valid spec." + ) + assertTrue( + result.output.contains("Spec has issues or recommendations.").not(), + "Unexpected/recommendations message presented to the user for a valid spec" + ) + assertEquals( + SUCCESS, result.task(":openApiValidate")?.outcome, + "Expected a successful run, but found ${result.task(":openApiValidate")?.outcome}" + ) + } } From e4249768c9eef433640163108056ea41d85f7831 Mon Sep 17 00:00:00 2001 From: dys Date: Wed, 13 Sep 2023 21:32:59 +0900 Subject: [PATCH 4/4] ValidateTask recommend default value is true --- .../extensions/OpenApiGeneratorValidateExtension.kt | 9 +-------- .../generator/gradle/plugin/tasks/ValidateTask.kt | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) 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 395481456b33..fb72552ee6e5 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 @@ -33,12 +33,5 @@ open class OpenApiGeneratorValidateExtension(project: Project) { /** * Whether to offer recommendations related to the validated specification document. */ - val recommend = project.objects.property() - - init { - applyDefaults() - } - - @Suppress("MemberVisibilityCanBePrivate") - fun applyDefaults() = recommend.set(true) + val recommend = project.objects.property().convention(true) } \ 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 da442383e0eb..f379e6c45d21 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 @@ -58,7 +58,7 @@ open class ValidateTask : DefaultTask() { @Optional @Input - val recommend = project.objects.property() + val recommend = project.objects.property().convention(true) @get:Internal @set:Option(option = "input", description = "The input specification.")