Skip to content

Commit

Permalink
[php][php-nextgen] enumUnknownDefaultCase true now return the correct…
Browse files Browse the repository at this point in the history
… value for unknown values
  • Loading branch information
Ocarthon committed Feb 4, 2025
1 parent 8998d83 commit dd652a6
Show file tree
Hide file tree
Showing 5 changed files with 202 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -419,13 +419,18 @@ class {{classname}} {{#parentSchema}}extends {{{parent}}}{{/parentSchema}}{{^par
$allowedValues = $this->{{getter}}AllowableValues();
{{^isContainer}}
if ({{#isNullable}}!is_null(${{name}}) && {{/isNullable}}!in_array(${{{name}}}, $allowedValues, true)) {
{{#enumUnknownDefaultCase}}
${{name}} = {{#allowableValues}}{{#enumVars}}{{#-last}}self::{{enumName}}_{{{name}}};{{/-last}}{{/enumVars}}{{/allowableValues}}
{{/enumUnknownDefaultCase}}
{{^enumUnknownDefaultCase}}
throw new InvalidArgumentException(
sprintf(
"Invalid value '%s' for '{{name}}', must be one of '%s'",
${{{name}}},
implode("', '", $allowedValues)
)
);
{{/enumUnknownDefaultCase}}
}
{{/isContainer}}
{{#isContainer}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -408,13 +408,18 @@ class {{classname}} {{#parentSchema}}extends {{{parent}}}{{/parentSchema}}{{^par
$allowedValues = $this->{{getter}}AllowableValues();
{{^isContainer}}
if ({{#isNullable}}!is_null(${{name}}) && {{/isNullable}}!in_array(${{{name}}}, $allowedValues, true)) {
{{#enumUnknownDefaultCase}}
${{name}} = {{#allowableValues}}{{#enumVars}}{{#-last}}self::{{enumName}}_{{{name}}};{{/-last}}{{/enumVars}}{{/allowableValues}}
{{/enumUnknownDefaultCase}}
{{^enumUnknownDefaultCase}}
throw new \InvalidArgumentException(
sprintf(
"Invalid value '%s' for '{{name}}', must be one of '%s'",
${{{name}}},
implode("', '", $allowedValues)
)
);
{{/enumUnknownDefaultCase}}
}
{{/isContainer}}
{{#isContainer}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,33 @@

package org.openapitools.codegen.php;

import io.swagger.parser.OpenAPIParser;
import io.swagger.v3.oas.models.OpenAPI;
import org.openapitools.codegen.CodegenConstants;
import org.openapitools.codegen.CodegenModel;
import io.swagger.v3.parser.core.models.ParseOptions;
import org.openapitools.codegen.*;
import org.openapitools.codegen.java.assertions.JavaFileAssert;
import org.openapitools.codegen.languages.JavaMicroprofileServerCodegen;
import org.openapitools.codegen.languages.PhpClientCodegen;
import org.openapitools.codegen.TestUtils;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.io.File;
import java.nio.file.Files;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class PhpClientCodegenTest {

protected PhpClientCodegen codegen;

@BeforeMethod
public void before() {
codegen = new PhpClientCodegen();
}

@Test
public void testInitialConfigValues() throws Exception {
final PhpClientCodegen codegen = new PhpClientCodegen();
Expand Down Expand Up @@ -90,4 +107,69 @@ public void modelTest() {
Assert.assertEquals(simpleName.classname, "DollarModel");
Assert.assertEquals(simpleName.classVarName, "dollar_model");
}

@Test
public void testEnumUnknownDefaultCaseDeserializationEnabled() throws Exception {
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
output.deleteOnExit();

OpenAPI openAPI = new OpenAPIParser()
.readLocation("src/test/resources/bugs/issue_20593.yaml", null, new ParseOptions()).getOpenAPI();

codegen.setOutputDir(output.getAbsolutePath());
codegen.additionalProperties().put(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, "true");

ClientOptInput input = new ClientOptInput()
.openAPI(openAPI)
.config(codegen);

DefaultGenerator generator = new DefaultGenerator();
Map<String, File> files = generator.opts(input).generate().stream()
.collect(Collectors.toMap(File::getName, Function.identity()));

List<String> modelContent = Files
.readAllLines(files.get("Pet.php").toPath())
.stream()
.map(String::trim)
.collect(Collectors.toList());

for (String l : modelContent) {
System.out.println(l);
}

Assert.assertListContains(modelContent, a -> a.equals("$color = self::COLOR_UNKNOWN_DEFAULT_OPEN_API;"), "");
Assert.assertListNotContains(modelContent, a -> a.equals("\"Invalid value '%s' for 'color', must be one of '%s'\","), "");
}

@Test
public void testEnumUnknownDefaultCaseDeserializationDisabled() throws Exception {
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
output.deleteOnExit();

OpenAPI openAPI = new OpenAPIParser()
.readLocation("src/test/resources/bugs/issue_20593.yaml", null, new ParseOptions()).getOpenAPI();

codegen.setOutputDir(output.getAbsolutePath());

ClientOptInput input = new ClientOptInput()
.openAPI(openAPI)
.config(codegen);

DefaultGenerator generator = new DefaultGenerator();
Map<String, File> files = generator.opts(input).generate().stream()
.collect(Collectors.toMap(File::getName, Function.identity()));

List<String> modelContent = Files
.readAllLines(files.get("Pet.php").toPath())
.stream()
.map(String::trim)
.collect(Collectors.toList());

for (String l : modelContent) {
System.out.println(l);
}

Assert.assertListNotContains(modelContent, a -> a.equals("$color = self::COLOR_UNKNOWN_DEFAULT_OPEN_API;"), "");
Assert.assertListContains(modelContent, a -> a.equalsIgnoreCase("\"Invalid value '%s' for 'color', must be one of '%s'\","), "");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,35 @@

package org.openapitools.codegen.php;

import io.swagger.parser.OpenAPIParser;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.parser.core.models.ParseOptions;
import org.openapitools.codegen.ClientOptInput;
import org.openapitools.codegen.CodegenConstants;
import org.openapitools.codegen.DefaultGenerator;
import org.openapitools.codegen.languages.PhpClientCodegen;
import org.openapitools.codegen.languages.PhpNextgenClientCodegen;
import org.openapitools.codegen.testutils.ConfigAssert;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.io.File;
import java.nio.file.Files;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class PhpNextgenClientCodegenTest {

protected PhpNextgenClientCodegen codegen;

@BeforeMethod
public void before() {
codegen = new PhpNextgenClientCodegen();
}

@Test
public void testInitialConfigValues() throws Exception {
final PhpNextgenClientCodegen codegen = new PhpNextgenClientCodegen();
Expand Down Expand Up @@ -68,4 +90,69 @@ public void testAdditionalPropertiesPutForConfigValuesWithTrueValue() throws Exc
configAssert.assertValue(PhpNextgenClientCodegen.SUPPORT_STREAMING, codegen::isSupportStreaming, Boolean.TRUE);
Assert.assertEquals(codegen.isSupportStreaming(), true);
}

@Test
public void testEnumUnknownDefaultCaseDeserializationEnabled() throws Exception {
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
output.deleteOnExit();

OpenAPI openAPI = new OpenAPIParser()
.readLocation("src/test/resources/bugs/issue_20593.yaml", null, new ParseOptions()).getOpenAPI();

codegen.setOutputDir(output.getAbsolutePath());
codegen.additionalProperties().put(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, "true");

ClientOptInput input = new ClientOptInput()
.openAPI(openAPI)
.config(codegen);

DefaultGenerator generator = new DefaultGenerator();
Map<String, File> files = generator.opts(input).generate().stream()
.collect(Collectors.toMap(File::getName, Function.identity()));

List<String> modelContent = Files
.readAllLines(files.get("Pet.php").toPath())
.stream()
.map(String::trim)
.collect(Collectors.toList());

for (String l : modelContent) {
System.out.println(l);
}

Assert.assertListContains(modelContent, a -> a.equals("$color = self::COLOR_UNKNOWN_DEFAULT_OPEN_API;"), "");
Assert.assertListNotContains(modelContent, a -> a.equals("\"Invalid value '%s' for 'color', must be one of '%s'\","), "");
}

@Test
public void testEnumUnknownDefaultCaseDeserializationDisabled() throws Exception {
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
output.deleteOnExit();

OpenAPI openAPI = new OpenAPIParser()
.readLocation("src/test/resources/bugs/issue_20593.yaml", null, new ParseOptions()).getOpenAPI();

codegen.setOutputDir(output.getAbsolutePath());

ClientOptInput input = new ClientOptInput()
.openAPI(openAPI)
.config(codegen);

DefaultGenerator generator = new DefaultGenerator();
Map<String, File> files = generator.opts(input).generate().stream()
.collect(Collectors.toMap(File::getName, Function.identity()));

List<String> modelContent = Files
.readAllLines(files.get("Pet.php").toPath())
.stream()
.map(String::trim)
.collect(Collectors.toList());

for (String l : modelContent) {
System.out.println(l);
}

Assert.assertListNotContains(modelContent, a -> a.equals("$color = self::COLOR_UNKNOWN_DEFAULT_OPEN_API;"), "");
Assert.assertListContains(modelContent, a -> a.equalsIgnoreCase("\"Invalid value '%s' for 'color', must be one of '%s'\","), "");
}
}
20 changes: 20 additions & 0 deletions modules/openapi-generator/src/test/resources/bugs/issue_20593.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
openapi: "3.0.0"
info:
version: 2.0.0
title: test
paths:
/pets:
get:
summary: List all pets
operationId: listPets
responses:
'200':
description: OK
components:
schemas:
Pet:
type: object
properties:
Color:
type: string
enum: [RED, BLUE, GREEN]

0 comments on commit dd652a6

Please # to comment.