diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonLegacyClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonLegacyClientCodegen.java index c2955c34e1a..fbefdec4253 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonLegacyClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonLegacyClientCodegen.java @@ -797,9 +797,7 @@ public class PythonLegacyClientCodegen extends DefaultCodegen implements Codegen if ("Number".equalsIgnoreCase(schema.getFormat())) {return "1";} if (StringUtils.isNotBlank(schema.getPattern())) { String pattern = schema.getPattern(); - while (pattern.startsWith("/")) pattern = pattern.substring(0, pattern.length()-1); - while (pattern.endsWith("/")) pattern = pattern.substring(1); - RgxGen rgxGen = new RgxGen(pattern); + RgxGen rgxGen = new RgxGen(patternCorrection(pattern)); // this seed makes it so if we have [a-z] we pick a Random random = new Random(18); String sample = rgxGen.generate(random); @@ -1052,4 +1050,14 @@ public class PythonLegacyClientCodegen extends DefaultCodegen implements Codegen } } } + + public String patternCorrection(String pattern){ + // Java does not recognize starting and ending forward slashes and mode modifiers + // It considers them as characters with no special meaning and tries to find them in the match string + boolean checkEnding = pattern.endsWith("/i") || pattern.endsWith("/g") || pattern.endsWith("/m"); + if (checkEnding) pattern = pattern.substring(0, pattern.length()-2); + if (pattern.endsWith("/")) pattern = pattern.substring(0, pattern.length()-1); + if (pattern.startsWith("/")) pattern = pattern.substring(1); + return pattern; + } } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonLegacyClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonLegacyClientCodegenTest.java index 15bd68e7f74..f7e949e5f27 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonLegacyClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonLegacyClientCodegenTest.java @@ -18,17 +18,20 @@ package org.openapitools.codegen.python; import com.google.common.collect.Sets; +import com.sun.org.apache.xpath.internal.operations.Bool; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.media.*; import io.swagger.v3.parser.util.SchemaTypeUtil; import org.openapitools.codegen.*; import org.openapitools.codegen.languages.PythonLegacyClientCodegen; +import org.openapitools.codegen.utils.ModelUtils; import org.testng.Assert; import org.testng.annotations.Test; import java.util.ArrayList; import java.util.Arrays; +import java.util.regex.Pattern; public class PythonLegacyClientCodegenTest { @@ -93,6 +96,25 @@ public class PythonLegacyClientCodegenTest { Assert.assertEquals(op.allParams.get(5).pattern, "/^pattern\\d{3}$/i"); } + + + @Test(description = "test generated example values for string properties") + public void testGeneratedExampleValues() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/examples.yaml"); + final PythonLegacyClientCodegen codegen = new PythonLegacyClientCodegen(); + codegen.setOpenAPI(openAPI); + final Schema dummyUserSchema = openAPI.getComponents().getSchemas().get("DummyUser"); + final Schema nameSchema = (Schema) dummyUserSchema.getProperties().get("name"); + final Schema numberSchema = (Schema) dummyUserSchema.getProperties().get("number"); + final Schema addressSchema = (Schema) dummyUserSchema.getProperties().get("address"); + final String namePattern = codegen.patternCorrection(nameSchema.getPattern()); + final String numberPattern = codegen.patternCorrection(numberSchema.getPattern()); + final String addressPattern = codegen.patternCorrection(addressSchema.getPattern()); + Assert.assertTrue(codegen.escapeQuotationMark(codegen.toExampleValue(nameSchema)).matches(namePattern)); + Assert.assertTrue(codegen.escapeQuotationMark(codegen.toExampleValue(numberSchema)).matches(numberPattern)); + Assert.assertTrue(codegen.escapeQuotationMark(codegen.toExampleValue(addressSchema)).matches(addressPattern)); + } + @Test(description = "test single quotes escape") public void testSingleQuotes() { final PythonLegacyClientCodegen codegen = new PythonLegacyClientCodegen(); diff --git a/modules/openapi-generator/src/test/resources/3_0/examples.yaml b/modules/openapi-generator/src/test/resources/3_0/examples.yaml index dd1b88d52c2..07893343180 100644 --- a/modules/openapi-generator/src/test/resources/3_0/examples.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/examples.yaml @@ -118,3 +118,15 @@ components: properties: city: type: string + DummyUser: + type: object + properties: + name: + type: string + pattern: '/^[a-z\s]+$/' + number: + type: string + pattern: '/[0-9]{10}/g' + address: + type: string + pattern: '/^[a-z0-9\s]+$/i'