Skip to content

Commit ec59334

Browse files
authored
Fix ValidateTask failure if recommend is not assigned (#16580)
* spec for recommend test * add ValidateTask test for custom defined tasks * add ValidateTask test for recommend option * ValidateTask recommend default value is true
1 parent 82e3590 commit ec59334

4 files changed

Lines changed: 273 additions & 9 deletions

File tree

modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorValidateExtension.kt

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,5 @@ open class OpenApiGeneratorValidateExtension(project: Project) {
3333
/**
3434
* Whether to offer recommendations related to the validated specification document.
3535
*/
36-
val recommend = project.objects.property<Boolean?>()
37-
38-
init {
39-
applyDefaults()
40-
}
41-
42-
@Suppress("MemberVisibilityCanBePrivate")
43-
fun applyDefaults() = recommend.set(true)
36+
val recommend = project.objects.property<Boolean>().convention(true)
4437
}

modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/ValidateTask.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ open class ValidateTask : DefaultTask() {
5858

5959
@Optional
6060
@Input
61-
val recommend = project.objects.property<Boolean?>()
61+
val recommend = project.objects.property<Boolean>().convention(true)
6262

6363
@get:Internal
6464
@set:Option(option = "input", description = "The input specification.")

modules/openapi-generator-gradle-plugin/src/test/kotlin/ValidateTaskDslTest.kt

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,161 @@ class ValidateTaskDslTest : TestBase() {
144144
"Expected a failed run, but found ${result.task(":openApiValidate")?.outcome}"
145145
)
146146
}
147+
148+
@Test(dataProvider = "gradle_version_provider")
149+
fun `validateGoodSpec as defined task should succeed on valid spec`(gradleVersion: String?) {
150+
// Arrange
151+
val projectFiles = mapOf(
152+
"spec.yaml" to javaClass.classLoader.getResourceAsStream("specs/petstore-v3.0.yaml")
153+
)
154+
155+
withProject(
156+
"""
157+
| plugins {
158+
| id 'org.openapi.generator'
159+
| }
160+
|
161+
| task validateGoodSpec(type: org.openapitools.generator.gradle.plugin.tasks.ValidateTask) {
162+
| inputSpec.set(file("spec.yaml").absolutePath)
163+
| }
164+
""".trimMargin(), projectFiles
165+
)
166+
167+
// Act
168+
val result = getGradleRunner(gradleVersion)
169+
.withProjectDir(temp)
170+
.withArguments("validateGoodSpec")
171+
.withPluginClasspath()
172+
.build()
173+
174+
// Assert
175+
assertTrue(
176+
result.output.contains("Spec is valid."),
177+
"Unexpected/no message presented to the user for a valid spec."
178+
)
179+
assertEquals(
180+
SUCCESS, result.task(":validateGoodSpec")?.outcome,
181+
"Expected a successful run, but found ${result.task(":validateGoodSpec")?.outcome}"
182+
)
183+
}
184+
185+
@Test(dataProvider = "gradle_version_provider")
186+
fun `validateBadSpec as defined task should fail on invalid spec`(gradleVersion: String?) {
187+
// Arrange
188+
val projectFiles = mapOf(
189+
"spec.yaml" to javaClass.classLoader.getResourceAsStream("specs/petstore-v3.0-invalid.yaml")
190+
)
191+
withProject(
192+
"""
193+
| plugins {
194+
| id 'org.openapi.generator'
195+
| }
196+
|
197+
| task validateBadSpec(type: org.openapitools.generator.gradle.plugin.tasks.ValidateTask) {
198+
| inputSpec.set(file("spec.yaml").absolutePath)
199+
| }
200+
""".trimMargin(), projectFiles
201+
)
202+
203+
// Act
204+
val result = getGradleRunner(gradleVersion)
205+
.withProjectDir(temp)
206+
.withArguments("validateBadSpec")
207+
.withPluginClasspath()
208+
.buildAndFail()
209+
210+
// Assert
211+
assertTrue(
212+
result.output.contains("Spec is invalid."),
213+
"Unexpected/no message presented to the user for an invalid spec."
214+
)
215+
assertEquals(
216+
FAILED, result.task(":validateBadSpec")?.outcome,
217+
"Expected a failed run, but found ${result.task(":validateBadSpec")?.outcome}"
218+
)
219+
}
220+
221+
@Test(dataProvider = "gradle_version_provider")
222+
fun `openApiValidate should succeed with recommendations on valid spec`(gradleVersion: String?) {
223+
// Arrange
224+
val projectFiles = mapOf(
225+
"spec.yaml" to javaClass.classLoader.getResourceAsStream("specs/petstore-v3.0-recommend.yaml")
226+
)
227+
228+
// recommend = true is the default
229+
withProject(
230+
"""
231+
| plugins {
232+
| id 'org.openapi.generator'
233+
| }
234+
|
235+
| openApiValidate {
236+
| inputSpec = file("spec.yaml").absolutePath
237+
| }
238+
""".trimMargin(), projectFiles
239+
)
240+
241+
// Act
242+
val result = getGradleRunner(gradleVersion)
243+
.withProjectDir(temp)
244+
.withArguments("openApiValidate")
245+
.withPluginClasspath()
246+
.build()
247+
248+
// Assert
249+
assertTrue(
250+
result.output.contains("Spec is valid."),
251+
"Unexpected/no message presented to the user for a valid spec."
252+
)
253+
assertTrue(
254+
result.output.contains("Spec has issues or recommendations."),
255+
"Unexpected/no recommendations message presented to the user for a valid spec."
256+
)
257+
assertEquals(
258+
SUCCESS, result.task(":openApiValidate")?.outcome,
259+
"Expected a successful run, but found ${result.task(":openApiValidate")?.outcome}"
260+
)
261+
}
262+
263+
@Test(dataProvider = "gradle_version_provider")
264+
fun `openApiValidate should succeed without recommendations on valid spec`(gradleVersion: String?) {
265+
// Arrange
266+
val projectFiles = mapOf(
267+
"spec.yaml" to javaClass.classLoader.getResourceAsStream("specs/petstore-v3.0-recommend.yaml")
268+
)
269+
270+
withProject(
271+
"""
272+
| plugins {
273+
| id 'org.openapi.generator'
274+
| }
275+
|
276+
| openApiValidate {
277+
| inputSpec = file("spec.yaml").absolutePath
278+
| recommend = false
279+
| }
280+
""".trimMargin(), projectFiles
281+
)
282+
283+
// Act
284+
val result = getGradleRunner(gradleVersion)
285+
.withProjectDir(temp)
286+
.withArguments("openApiValidate")
287+
.withPluginClasspath()
288+
.build()
289+
290+
// Assert
291+
assertTrue(
292+
result.output.contains("Spec is valid."),
293+
"Unexpected/no message presented to the user for a valid spec."
294+
)
295+
assertTrue(
296+
result.output.contains("Spec has issues or recommendations.").not(),
297+
"Unexpected/recommendations message presented to the user for a valid spec"
298+
)
299+
assertEquals(
300+
SUCCESS, result.task(":openApiValidate")?.outcome,
301+
"Expected a successful run, but found ${result.task(":openApiValidate")?.outcome}"
302+
)
303+
}
147304
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
openapi: "3.0.0"
2+
info:
3+
version: 1.0.0
4+
title: Swagger Petstore
5+
license:
6+
name: MIT
7+
servers:
8+
- url: http://petstore.swagger.io/v1
9+
paths:
10+
/pets:
11+
get:
12+
summary: List all pets
13+
operationId: listPets
14+
tags:
15+
- pets
16+
parameters:
17+
- name: limit
18+
in: query
19+
description: How many items to return at one time (max 100)
20+
required: false
21+
schema:
22+
type: integer
23+
format: int32
24+
requestBody: # warning `API GET/HEAD defined with request body`
25+
content:
26+
application/json:
27+
schema:
28+
$ref: "#/components/schemas/Pets"
29+
responses:
30+
'200':
31+
description: A paged array of pets
32+
headers:
33+
x-next:
34+
description: A link to the next page of responses
35+
schema:
36+
type: string
37+
content:
38+
application/json:
39+
schema:
40+
$ref: "#/components/schemas/Pets"
41+
default:
42+
description: unexpected error
43+
content:
44+
application/json:
45+
schema:
46+
$ref: "#/components/schemas/Error"
47+
post:
48+
summary: Create a pet
49+
operationId: createPets
50+
tags:
51+
- pets
52+
responses:
53+
'201':
54+
description: Null response
55+
default:
56+
description: unexpected error
57+
content:
58+
application/json:
59+
schema:
60+
$ref: "#/components/schemas/Error"
61+
/pets/{petId}:
62+
get:
63+
summary: Info for a specific pet
64+
operationId: showPetById
65+
tags:
66+
- pets
67+
parameters:
68+
- name: petId
69+
in: path
70+
required: true
71+
description: The id of the pet to retrieve
72+
schema:
73+
type: string
74+
responses:
75+
'200':
76+
description: Expected response to a valid request
77+
content:
78+
application/json:
79+
schema:
80+
$ref: "#/components/schemas/Pets"
81+
default:
82+
description: unexpected error
83+
content:
84+
application/json:
85+
schema:
86+
$ref: "#/components/schemas/Error"
87+
components:
88+
schemas:
89+
Pet:
90+
required:
91+
- id
92+
- name
93+
properties:
94+
id:
95+
type: integer
96+
format: int64
97+
name:
98+
type: string
99+
tag:
100+
type: string
101+
Pets:
102+
type: array
103+
items:
104+
$ref: "#/components/schemas/Pet"
105+
Error:
106+
required:
107+
- code
108+
- message
109+
properties:
110+
code:
111+
type: integer
112+
format: int32
113+
message:
114+
type: string

0 commit comments

Comments
 (0)