From 001f5ae50d96e9b69e377f136b7fab20e8feba85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bresson?= Date: Mon, 2 Jul 2018 17:38:07 +0200 Subject: [PATCH] Mock generator for tests (#429) Create MockDefaultGenerator class for tests --- .../codegen/DefaultGenerator.java | 25 +++-- .../codegen/MockDefaultGenerator.java | 94 +++++++++++++++++++ .../codegen/java/JavaClientCodegenTest.java | 94 ++++++++++++++++++- 3 files changed, 202 insertions(+), 11 deletions(-) create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/MockDefaultGenerator.java diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index 228d1ac59be..361f9c41cb2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -644,15 +644,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { if (in == null) { in = this.getClass().getClassLoader().getResourceAsStream(getCPResourcePath(templateFile)); } - File outputFile = new File(outputFilename); - OutputStream out = new FileOutputStream(outputFile, false); - if (in != null) { - LOGGER.info("writing file " + outputFile); - IOUtils.copy(in, out); - out.close(); - } else { - LOGGER.error("can't open " + templateFile + " for input"); - } + File outputFile = writeInputStreamToFile(outputFilename, in, templateFile); files.add(outputFile); } } else { @@ -710,6 +702,19 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } + protected File writeInputStreamToFile(String filename, InputStream in, String templateFile) throws FileNotFoundException, IOException { + File outputFile = new File(filename); + if (in != null) { + OutputStream out = new FileOutputStream(outputFile, false); + LOGGER.info("writing file " + outputFile); + IOUtils.copy(in, out); + out.close(); + } else { + LOGGER.error("can't open '" + templateFile + "' for input, can not write '" + filename + "'"); + } + return outputFile; + } + private Map buildSupportFileBundle(List allOperations, List allModels) { Map bundle = new HashMap(); @@ -793,7 +798,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } - private File processTemplateToFile(Map templateData, String templateName, String outputFilename) throws IOException { + protected File processTemplateToFile(Map templateData, String templateName, String outputFilename) throws IOException { String adjustedOutputFilename = outputFilename.replaceAll("//", "/").replace('/', File.separatorChar); if (ignoreProcessor.allowsFile(new File(adjustedOutputFilename))) { String templateFile = getFullTemplateFile(config, templateName); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/MockDefaultGenerator.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/MockDefaultGenerator.java new file mode 100644 index 00000000000..8ee454a700d --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/MockDefaultGenerator.java @@ -0,0 +1,94 @@ +/* + * Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openapitools.codegen; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MockDefaultGenerator extends DefaultGenerator { + public static final String INPUT_STREAM_CONTENT = "INPUT STREAM CONTENT"; + private List templateBasedFiles = new ArrayList<>(); + private Map files = new HashMap<>(); + + @Override + protected File processTemplateToFile(Map templateData, String templateName, String outputFilename) throws IOException { + templateBasedFiles.add(new WrittenTemplateBasedFile(templateData, templateName, normalizePath(outputFilename))); + return super.processTemplateToFile(templateData, templateName, outputFilename); + } + + @Override + protected File writeInputStreamToFile(String filename, InputStream in, String templateFile) throws FileNotFoundException, IOException { + files.put(normalizePath(filename), INPUT_STREAM_CONTENT + ": from template '" + templateFile + "'"); + return new File(filename); + } + + @Override + public File writeToFile(String filename, String contents) throws IOException { + files.put(normalizePath(filename), contents); + return new File(filename); + } + + private String normalizePath(String filename) { + return filename.replace("\\", "/").replace("//", "/"); + } + + public List getTemplateBasedFiles() { + return templateBasedFiles; + } + + public Map getFiles() { + return files; + } + + public static class WrittenTemplateBasedFile { + private Map templateData; + private String templateName; + private String outputFilename; + + public WrittenTemplateBasedFile(Map templateData, String templateName, String outputFilename) { + this.templateData = templateData; + this.templateName = templateName; + this.outputFilename = outputFilename; + } + + public Map getTemplateData() { + return templateData; + } + + public String getTemplateName() { + return templateName; + } + + public String getOutputFilename() { + return outputFilename; + } + + @Override + public String toString() { + return "WrittenTemplateBasedFile [" + + "outputFilename=" + outputFilename + ", " + + "templateName=" + templateName + ", " + + "templateData=" + templateData + "]"; + } + } +} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java index 6a5340cc8d3..72b8b11bf4f 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java @@ -34,12 +34,24 @@ import io.swagger.v3.oas.models.parameters.RequestBody; import io.swagger.v3.parser.core.models.ParseOptions; import io.swagger.v3.parser.util.SchemaTypeUtil; -import org.openapitools.codegen.*; +import org.openapitools.codegen.ClientOptInput; +import org.openapitools.codegen.CodegenConstants; +import org.openapitools.codegen.CodegenModel; +import org.openapitools.codegen.CodegenModelFactory; +import org.openapitools.codegen.CodegenModelType; +import org.openapitools.codegen.CodegenOperation; +import org.openapitools.codegen.CodegenParameter; +import org.openapitools.codegen.CodegenProperty; +import org.openapitools.codegen.MockDefaultGenerator; +import org.openapitools.codegen.MockDefaultGenerator.WrittenTemplateBasedFile; +import org.openapitools.codegen.config.CodegenConfigurator; import org.openapitools.codegen.languages.JavaClientCodegen; import org.openapitools.codegen.utils.ModelUtils; import org.testng.Assert; import org.testng.annotations.Test; +import java.io.File; +import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -47,6 +59,8 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; public class JavaClientCodegenTest { @@ -331,6 +345,84 @@ public class JavaClientCodegenTest { Assert.assertEquals(testedEnumVar.getOrDefault("value", ""), "1"); } + @Test + public void testGeneratePing() throws Exception { + Map properties = new HashMap<>(); + properties.put(JavaClientCodegen.JAVA8_MODE, true); + properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api"); + + File output = Files.createTempDirectory("test").toFile(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("java") + .setLibrary(JavaClientCodegen.OKHTTP_GSON) + .setAdditionalProperties(properties) + .setInputSpec("src/test/resources/3_0/ping.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + MockDefaultGenerator generator = new MockDefaultGenerator(); + generator.opts(clientOptInput).generate(); + + Map generatedFiles = generator.getFiles(); + Assert.assertEquals(generatedFiles.size(), 35); + ensureContainsFile(generatedFiles, output, ".gitignore"); + ensureContainsFile(generatedFiles, output, ".openapi-generator-ignore"); + ensureContainsFile(generatedFiles, output, ".openapi-generator/VERSION"); + ensureContainsFile(generatedFiles, output, ".travis.yml"); + ensureContainsFile(generatedFiles, output, "build.gradle"); + ensureContainsFile(generatedFiles, output, "build.sbt"); + ensureContainsFile(generatedFiles, output, "docs/DefaultApi.md"); + ensureContainsFile(generatedFiles, output, "git_push.sh"); + ensureContainsFile(generatedFiles, output, "gradle.properties"); + ensureContainsFile(generatedFiles, output, "gradle/wrapper/gradle-wrapper.jar"); + ensureContainsFile(generatedFiles, output, "gradle/wrapper/gradle-wrapper.properties"); + ensureContainsFile(generatedFiles, output, "gradlew.bat"); + ensureContainsFile(generatedFiles, output, "gradlew"); + ensureContainsFile(generatedFiles, output, "pom.xml"); + ensureContainsFile(generatedFiles, output, "README.md"); + ensureContainsFile(generatedFiles, output, "settings.gradle"); + ensureContainsFile(generatedFiles, output, "src/main/AndroidManifest.xml"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/api/DefaultApi.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/ApiCallback.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/ApiClient.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/ApiException.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/ApiResponse.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/auth/ApiKeyAuth.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/auth/Authentication.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/auth/HttpBasicAuth.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/auth/OAuth.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/auth/OAuthFlow.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/Configuration.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/GzipRequestInterceptor.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/JSON.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/Pair.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/ProgressRequestBody.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/ProgressResponseBody.java"); + ensureContainsFile(generatedFiles, output, "src/main/java/xyz/abcdef/StringUtil.java"); + ensureContainsFile(generatedFiles, output, "src/test/java/xyz/abcdef/api/DefaultApiTest.java"); + + String defaultApiFilename = new File(output, "src/main/java/xyz/abcdef/api/DefaultApi.java").getAbsolutePath().replace("\\", "/"); + String defaultApiConent = generatedFiles.get(defaultApiFilename); + Assert.assertTrue(defaultApiConent.contains("public class DefaultApi")); + + Optional optional = generator.getTemplateBasedFiles().stream().filter(f -> defaultApiFilename.equals(f.getOutputFilename())).findFirst(); + Assert.assertTrue(optional.isPresent()); + Assert.assertEquals(optional.get().getTemplateData().get("classname"), "DefaultApi"); + + output.deleteOnExit(); + } + + private void ensureContainsFile(Map generatedFiles, File root, String filename) { + File file = new File(root, filename); + String absoluteFilename = file.getAbsolutePath().replace("\\", "/"); + if(!generatedFiles.containsKey(absoluteFilename)) { + Assert.fail("Could not find '" + absoluteFilename + "' file in list:\n" + + generatedFiles.keySet().stream().sorted().collect(Collectors.joining(",\n"))); + } + Assert.assertTrue(generatedFiles.containsKey(absoluteFilename), "File '" + absoluteFilename + "' was not fould in the list of generated files"); + } + private CodegenProperty codegenPropertyWithArrayOfIntegerValues() { CodegenProperty array = new CodegenProperty(); final CodegenProperty items = new CodegenProperty();