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