|
5 | 5 | import io.swagger.v3.oas.models.info.Info; |
6 | 6 | import io.swagger.v3.oas.models.servers.Server; |
7 | 7 | import io.swagger.v3.parser.core.models.ParseOptions; |
| 8 | +import java.util.HashMap; |
| 9 | +import java.util.function.Consumer; |
8 | 10 | import org.apache.commons.io.FileUtils; |
9 | 11 | import org.assertj.core.api.Assertions; |
10 | 12 | import org.jetbrains.annotations.NotNull; |
11 | 13 | import org.openapitools.codegen.ClientOptInput; |
12 | 14 | import org.openapitools.codegen.CodegenConstants; |
13 | 15 | import org.openapitools.codegen.DefaultGenerator; |
14 | 16 | import org.openapitools.codegen.TestUtils; |
| 17 | +import org.openapitools.codegen.config.CodegenConfigurator; |
| 18 | +import org.openapitools.codegen.java.assertions.JavaFileAssert; |
15 | 19 | import org.openapitools.codegen.kotlin.KotlinTestUtils; |
16 | 20 | import org.openapitools.codegen.languages.KotlinSpringServerCodegen; |
17 | 21 | import org.openapitools.codegen.languages.features.CXFServerFeatures; |
|
31 | 35 | import java.util.function.Function; |
32 | 36 | import java.util.stream.Collectors; |
33 | 37 |
|
| 38 | +import static org.assertj.core.api.Assertions.assertThat; |
34 | 39 | import static org.openapitools.codegen.TestUtils.assertFileContains; |
35 | 40 | import static org.openapitools.codegen.TestUtils.assertFileNotContains; |
| 41 | +import static org.openapitools.codegen.languages.SpringCodegen.SPRING_BOOT; |
36 | 42 | import static org.openapitools.codegen.languages.features.DocumentationProviderFeatures.ANNOTATION_LIBRARY; |
37 | 43 | import static org.openapitools.codegen.languages.features.DocumentationProviderFeatures.DOCUMENTATION_PROVIDER; |
38 | 44 |
|
@@ -748,6 +754,49 @@ public void useBeanValidationGenerateAnnotationsForRequestBody() throws IOExcept |
748 | 754 | ); |
749 | 755 | } |
750 | 756 |
|
| 757 | + @Test |
| 758 | + public void contractWithoutEnumDoesNotContainEnumConverter() throws IOException { |
| 759 | + Map<String, File> output = generateFromContract("src/test/resources/3_0/generic.yaml"); |
| 760 | + |
| 761 | + assertThat(output).doesNotContainKey("EnumConverterConfiguration.kt"); |
| 762 | + } |
| 763 | + |
| 764 | + @Test |
| 765 | + public void contractWithEnumContainsEnumConverter() throws IOException { |
| 766 | + Map<String, File> output = generateFromContract("src/test/resources/3_0/enum.yaml"); |
| 767 | + |
| 768 | + File enumConverterFile = output.get("EnumConverterConfiguration.kt"); |
| 769 | + assertThat(enumConverterFile).isNotNull(); |
| 770 | + assertFileContains(enumConverterFile.toPath(), "fun typeConverter(): Converter<kotlin.String, Type> {"); |
| 771 | + assertFileContains(enumConverterFile.toPath(), "return object: Converter<kotlin.String, Type> {"); |
| 772 | + assertFileContains(enumConverterFile.toPath(), "override fun convert(source: kotlin.String): Type = Type.forValue(source)"); |
| 773 | + } |
| 774 | + |
| 775 | + @Test |
| 776 | + public void contractWithResolvedInnerEnumContainsEnumConverter() throws IOException { |
| 777 | + File output = Files.createTempDirectory("test").toFile(); |
| 778 | + output.deleteOnExit(); |
| 779 | + |
| 780 | + final CodegenConfigurator configurator = new CodegenConfigurator() |
| 781 | + .setGeneratorName("kotlin-spring") |
| 782 | + .setInputSpec("src/test/resources/3_0/inner_enum.yaml") |
| 783 | + .addInlineSchemaOption("RESOLVE_INLINE_ENUMS", "true") |
| 784 | + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); |
| 785 | + |
| 786 | + final ClientOptInput clientOptInput = configurator.toClientOptInput(); |
| 787 | + DefaultGenerator generator = new DefaultGenerator(); |
| 788 | + generator.setGenerateMetadata(false); |
| 789 | + |
| 790 | + Map<String, File> files = generator.opts(clientOptInput).generate().stream() |
| 791 | + .collect(Collectors.toMap(File::getName, Function.identity())); |
| 792 | + |
| 793 | + File enumConverterFile = files.get("EnumConverterConfiguration.kt"); |
| 794 | + assertThat(enumConverterFile).isNotNull(); |
| 795 | + assertFileContains(enumConverterFile.toPath(), "fun ponyTypeConverter(): Converter<kotlin.String, PonyType> {"); |
| 796 | + assertFileContains(enumConverterFile.toPath(), "return object: Converter<kotlin.String, PonyType> {"); |
| 797 | + assertFileContains(enumConverterFile.toPath(), "override fun convert(source: kotlin.String): PonyType = PonyType.forValue(source)"); |
| 798 | + } |
| 799 | + |
751 | 800 | @Test |
752 | 801 | public void givenMultipartFormArray_whenGenerateDelegateAndService_thenParameterIsCreatedAsListOfMultipartFile() throws IOException { |
753 | 802 | File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); |
@@ -1192,4 +1241,55 @@ public void testValidationsInQueryParams_issue21238_Api_Delegate() throws IOExce |
1192 | 1241 | "@NotNull", "@Valid", "@Pattern(regexp=\"^[a-zA-Z0-9]+[a-zA-Z0-9\\\\.\\\\-_]*[a-zA-Z0-9]+$\")"); |
1193 | 1242 | } |
1194 | 1243 |
|
| 1244 | + |
| 1245 | + private Map<String, File> generateFromContract(String url) throws IOException { |
| 1246 | + return generateFromContract(url, new HashMap<>(), new HashMap<>()); |
| 1247 | + } |
| 1248 | + |
| 1249 | + private Map<String, File> generateFromContract(String url, Map<String, Object> additionalProperties) throws IOException { |
| 1250 | + return generateFromContract(url, additionalProperties, new HashMap<>()); |
| 1251 | + } |
| 1252 | + |
| 1253 | + private Map<String, File> generateFromContract( |
| 1254 | + String url, |
| 1255 | + Map<String, Object> additionalProperties, |
| 1256 | + Map<String, String> generatorPropertyDefaults |
| 1257 | + ) throws IOException { |
| 1258 | + return generateFromContract(url, additionalProperties, generatorPropertyDefaults, codegen -> { |
| 1259 | + }); |
| 1260 | + } |
| 1261 | + |
| 1262 | + /** |
| 1263 | + * Generate the contract with additional configuration. |
| 1264 | + * <p> |
| 1265 | + * use CodegenConfigurator instead of CodegenConfig for easier configuration like in JavaClientCodeGenTest |
| 1266 | + */ |
| 1267 | + private Map<String, File> generateFromContract( |
| 1268 | + String url, |
| 1269 | + Map<String, Object> additionalProperties, |
| 1270 | + Map<String, String> generatorPropertyDefaults, |
| 1271 | + Consumer<CodegenConfigurator> consumer |
| 1272 | + ) throws IOException { |
| 1273 | + |
| 1274 | + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); |
| 1275 | + output.deleteOnExit(); |
| 1276 | + |
| 1277 | + final CodegenConfigurator configurator = new CodegenConfigurator() |
| 1278 | + .setGeneratorName("kotlin-spring") |
| 1279 | + .setAdditionalProperties(additionalProperties) |
| 1280 | + .setValidateSpec(false) |
| 1281 | + .setInputSpec(url) |
| 1282 | + .setLibrary(SPRING_BOOT) |
| 1283 | + .setOutputDir(output.getAbsolutePath()); |
| 1284 | + |
| 1285 | + consumer.accept(configurator); |
| 1286 | + |
| 1287 | + ClientOptInput input = configurator.toClientOptInput(); |
| 1288 | + DefaultGenerator generator = new DefaultGenerator(); |
| 1289 | + generator.setGenerateMetadata(false); |
| 1290 | + generatorPropertyDefaults.forEach(generator::setGeneratorPropertyDefault); |
| 1291 | + |
| 1292 | + return generator.opts(input).generate().stream() |
| 1293 | + .collect(Collectors.toMap(File::getName, Function.identity())); |
| 1294 | + } |
1195 | 1295 | } |
0 commit comments