1
+ package org.springdoc.openapi.gradle.plugin
2
+
3
+ import com.beust.klaxon.JsonObject
4
+ import com.beust.klaxon.Klaxon
5
+ import com.beust.klaxon.Parser
6
+ import org.gradle.internal.impldep.org.apache.commons.lang.RandomStringUtils
7
+ import org.gradle.testkit.runner.BuildResult
8
+ import org.gradle.testkit.runner.BuildTask
9
+ import org.gradle.testkit.runner.GradleRunner
10
+ import org.gradle.testkit.runner.TaskOutcome
11
+ import org.gradle.testkit.runner.internal.FeatureCheckBuildResult
12
+ import org.junit.Assert.assertEquals
13
+ import org.junit.Assert.assertTrue
14
+ import org.junit.Before
15
+ import org.junit.Rule
16
+ import org.junit.Test
17
+ import org.junit.rules.TemporaryFolder
18
+ import java.io.File
19
+ import java.io.FileReader
20
+
21
+ class OpenApiGradlePluginTest {
22
+ @Rule
23
+ @JvmField
24
+ var testProjectDir: TemporaryFolder = TemporaryFolder ()
25
+
26
+ private lateinit var projectTestDir: File
27
+ private lateinit var buildFile: File
28
+ private lateinit var projectBuildDir: File
29
+
30
+ private var baseBuildGradle = """ plugins {
31
+ id 'org.springframework.boot' version '2.2.0.RELEASE'
32
+ id 'io.spring.dependency-management' version '1.0.9.RELEASE'
33
+ id 'java'
34
+ id "com.github.johnrengelman.processes" version "0.5.0"
35
+ id("org.springdoc.openapi-gradle-plugin")
36
+ }
37
+
38
+ group = 'com.example'
39
+ version = '0.0.1-SNAPSHOT'
40
+ sourceCompatibility = '8'
41
+
42
+ repositories {
43
+ mavenCentral()
44
+ }
45
+
46
+ dependencies {
47
+ implementation 'org.springframework.boot:spring-boot-starter-web'
48
+ implementation group: 'org.springdoc', name: 'springdoc-openapi-webmvc-core', version: '1.4.0'
49
+ }
50
+ """ .trimIndent()
51
+
52
+ @Before
53
+ fun setup () {
54
+ val acceptanceTestProject = File (this .javaClass.classLoader.getResource(" acceptance-project" )!! .path)
55
+ projectTestDir = File (testProjectDir.newFolder(), " acceptence-project" )
56
+
57
+ acceptanceTestProject.copyRecursively(projectTestDir)
58
+ buildFile = File (projectTestDir, " build.gradle" )
59
+
60
+ projectBuildDir = File (projectTestDir, " build" )
61
+ println (" !!!!! $projectBuildDir !!!!!!!" )
62
+ }
63
+
64
+ @Test
65
+ fun `default build no options` () {
66
+ buildFile.writeText(baseBuildGradle)
67
+
68
+ val result = GradleRunner .create()
69
+ .withProjectDir(projectTestDir)
70
+ .withArguments(" clean" , " generateOpenApiDocs" )
71
+ .withPluginClasspath()
72
+ .build()
73
+
74
+ assertEquals(TaskOutcome .SUCCESS , getTaskByName(result, " generateOpenApiDocs" )?.outcome)
75
+
76
+ val openApiJsonFile = File (projectBuildDir, DEFAULT_OPEN_API_FILE_NAME )
77
+ assertOpenApiJsonFileIsAsExpected(openApiJsonFile, 1 )
78
+ }
79
+
80
+ @Test
81
+ fun `different output dir` () {
82
+ var specialOutputDir = File (projectTestDir, " specialDir" )
83
+ specialOutputDir.mkdirs()
84
+
85
+ buildFile.writeText(""" $baseBuildGradle
86
+ openApi{
87
+ outputDir = file("${specialOutputDir.path} ")
88
+ }
89
+ """ .trimMargin())
90
+
91
+ val result = GradleRunner .create()
92
+ .withProjectDir(projectTestDir)
93
+ .withArguments(" clean" , " generateOpenApiDocs" )
94
+ .withPluginClasspath()
95
+ .build()
96
+
97
+ assertEquals(TaskOutcome .SUCCESS , getTaskByName(result, " generateOpenApiDocs" )?.outcome)
98
+
99
+ val openApiJsonFile = File (specialOutputDir, DEFAULT_OPEN_API_FILE_NAME )
100
+ assertOpenApiJsonFileIsAsExpected(openApiJsonFile, 1 )
101
+ }
102
+
103
+ @Test
104
+ fun `different output file name` () {
105
+ var specialOutputJsonFileName = RandomStringUtils .randomAlphanumeric(15 )
106
+
107
+ buildFile.writeText(""" $baseBuildGradle
108
+ openApi{
109
+ outputFileName = "$specialOutputJsonFileName "
110
+ }
111
+ """ .trimMargin())
112
+
113
+ val result = GradleRunner .create()
114
+ .withProjectDir(projectTestDir)
115
+ .withArguments(" clean" , " generateOpenApiDocs" )
116
+ .withPluginClasspath()
117
+ .build()
118
+
119
+ assertEquals(TaskOutcome .SUCCESS , getTaskByName(result, " generateOpenApiDocs" )?.outcome)
120
+
121
+ val openApiJsonFile = File (projectBuildDir, specialOutputJsonFileName)
122
+ assertOpenApiJsonFileIsAsExpected(openApiJsonFile, 1 )
123
+ }
124
+
125
+ @Test
126
+ fun `using forked properties` () {
127
+ buildFile.writeText(""" $baseBuildGradle
128
+ openApi{
129
+ forkProperties = "-Dspring.profiles.active=multiple-endpoints"
130
+ }
131
+ """ .trimMargin())
132
+
133
+ val result = GradleRunner .create()
134
+ .withProjectDir(projectTestDir)
135
+ .withArguments(" clean" , " generateOpenApiDocs" )
136
+ .withPluginClasspath()
137
+ .build()
138
+
139
+ assertEquals(TaskOutcome .SUCCESS , getTaskByName(result, " generateOpenApiDocs" )?.outcome)
140
+
141
+ val openApiJsonFile = File (projectBuildDir, DEFAULT_OPEN_API_FILE_NAME )
142
+ assertOpenApiJsonFileIsAsExpected(openApiJsonFile, 2 )
143
+ }
144
+
145
+ @Test
146
+ fun `using forked properties via System properties` () {
147
+ buildFile.writeText(""" $baseBuildGradle
148
+ openApi{
149
+ forkProperties = System.properties
150
+ }
151
+ """ .trimMargin())
152
+
153
+ val result = GradleRunner .create()
154
+ .withProjectDir(projectTestDir)
155
+ .withArguments(" clean" , " generateOpenApiDocs" , " -Dspring.profiles.active=multiple-endpoints" )
156
+ .withPluginClasspath()
157
+ .build()
158
+
159
+ assertEquals(TaskOutcome .SUCCESS , getTaskByName(result, " generateOpenApiDocs" )?.outcome)
160
+
161
+ val openApiJsonFile = File (projectBuildDir, DEFAULT_OPEN_API_FILE_NAME )
162
+ assertOpenApiJsonFileIsAsExpected(openApiJsonFile, 2 )
163
+ }
164
+
165
+ @Test
166
+ fun `configurable wait time` () {
167
+ buildFile.writeText(""" $baseBuildGradle
168
+ openApi{
169
+ forkProperties = "-Dspring.profiles.active=slower"
170
+ waitTimeInSeconds = 60
171
+ }
172
+ """ .trimMargin())
173
+
174
+ val result = GradleRunner .create()
175
+ .withProjectDir(projectTestDir)
176
+ .withArguments(" clean" , " generateOpenApiDocs" )
177
+ .withPluginClasspath()
178
+ .build()
179
+
180
+ assertEquals(TaskOutcome .SUCCESS , getTaskByName(result, " generateOpenApiDocs" )?.outcome)
181
+
182
+ val openApiJsonFile = File (projectBuildDir, DEFAULT_OPEN_API_FILE_NAME )
183
+ assertOpenApiJsonFileIsAsExpected(openApiJsonFile, 1 )
184
+ }
185
+
186
+ @Test
187
+ fun `using different api url` () {
188
+ buildFile.writeText(""" $baseBuildGradle
189
+ openApi{
190
+ apiDocsUrl = "http://localhost:8080/secret-api-docs"
191
+ forkProperties = "-Dspring.profiles.active=different-url"
192
+ }
193
+ """ .trimMargin())
194
+
195
+ val result = GradleRunner .create()
196
+ .withProjectDir(projectTestDir)
197
+ .withArguments(" clean" , " generateOpenApiDocs" )
198
+ .withPluginClasspath()
199
+ .build()
200
+
201
+ assertEquals(TaskOutcome .SUCCESS , getTaskByName(result, " generateOpenApiDocs" )?.outcome)
202
+
203
+ val openApiJsonFile = File (projectBuildDir, DEFAULT_OPEN_API_FILE_NAME )
204
+ assertOpenApiJsonFileIsAsExpected(openApiJsonFile, 1 )
205
+ }
206
+
207
+ private fun assertOpenApiJsonFileIsAsExpected (openApiJsonFile : File , expectedNumberOfPaths : Int ) {
208
+ val openApiJson = getOpenApiJsonAtLocation(openApiJsonFile)
209
+ assertEquals(" 3.0.1" , openApiJson!! .string(" openapi" ))
210
+ assertEquals(expectedNumberOfPaths, openApiJson.obj(" paths" )!! .size)
211
+ }
212
+
213
+ private fun getOpenApiJsonAtLocation (path : File ): JsonObject ? {
214
+ return Parser .default().parse(FileReader (path)) as JsonObject
215
+ }
216
+
217
+ private fun getTaskByName (result : BuildResult , name : String ): BuildTask ? {
218
+ return result.tasks.find { it.path.contains(name) }
219
+ }
220
+ }
0 commit comments