diff --git a/modules/openapi-generator/src/main/resources/php-slim4-server/openapi_data_mocker.mustache b/modules/openapi-generator/src/main/resources/php-slim4-server/openapi_data_mocker.mustache index b18c8f8903778535cd6c6eac0377056ee8cf45c6..5d101d2cf292426c4507596a3efc60ea3339b72b 100644 --- a/modules/openapi-generator/src/main/resources/php-slim4-server/openapi_data_mocker.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim4-server/openapi_data_mocker.mustache @@ -127,6 +127,22 @@ final class OpenApiDataMocker implements IMocker $exclusiveMinimum = false, $exclusiveMaximum = false ) { + $dataFormat = is_string($dataFormat) ? strtolower($dataFormat) : $dataFormat; + switch ($dataFormat) { + case IMocker::DATA_FORMAT_INT32: + // -2147483647..2147483647 + $minimum = is_numeric($minimum) ? max($minimum, -2147483647) : -2147483647; + $maximum = is_numeric($maximum) ? min($maximum, 2147483647) : 2147483647; + break; + case IMocker::DATA_FORMAT_INT64: + // -9223372036854775807..9223372036854775807 + $minimum = is_numeric($minimum) ? max($minimum, -9223372036854775807) : -9223372036854775807; + $maximum = is_numeric($maximum) ? min($maximum, 9223372036854775807) : 9223372036854775807; + break; + default: + // do nothing, unsupported format + } + return $this->getRandomNumber($minimum, $maximum, $exclusiveMinimum, $exclusiveMaximum, 0); } @@ -365,7 +381,7 @@ final class OpenApiDataMocker implements IMocker foreach ($properties as $propName => $propValue) { $options = $this->extractSchemaProperties($propValue); $dataType = $options['type']; - $dataFormat = $options['dataFormat'] ?? null; + $dataFormat = $options['format'] ?? null; $ref = $options['$ref'] ?? null; $data = $this->mockFromRef($ref); $obj->$propName = ($data) ? $data : $this->mock($dataType, $dataFormat, $options); @@ -525,7 +541,7 @@ final class OpenApiDataMocker implements IMocker if ($maxDecimals > 0) { return round($min + mt_rand() / mt_getrandmax() * ($max - $min), $maxDecimals); } - return mt_rand($min, $max); + return mt_rand((int) $min, (int) $max); } } {{/apiInfo}} diff --git a/modules/openapi-generator/src/main/resources/php-slim4-server/openapi_data_mocker_test.mustache b/modules/openapi-generator/src/main/resources/php-slim4-server/openapi_data_mocker_test.mustache index 94b80e9352b76c05ae5d324210904a050da90c2c..c6e70d781af68be75d269f9220d92bb6e38c154f 100644 --- a/modules/openapi-generator/src/main/resources/php-slim4-server/openapi_data_mocker_test.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim4-server/openapi_data_mocker_test.mustache @@ -198,6 +198,36 @@ class OpenApiDataMockerTest extends TestCase ]; } + /** + * @covers ::mockInteger + * @dataProvider provideMockIntegerFormats + */ + public function testMockIntegerWithFormats( + $dataFormat, + $minimum, + $maximum, + $expectedMin, + $expectedMax + ) { + $mocker = new OpenApiDataMocker(); + $integer = $mocker->mockInteger($dataFormat, $minimum, $maximum); + $this->assertGreaterThanOrEqual($expectedMin, $integer); + $this->assertLessThanOrEqual($expectedMax, $integer); + } + + public function provideMockIntegerFormats() + { + return [ + [IMocker::DATA_FORMAT_INT32, -2147483648, 2147483648, -2147483647, 2147483647], + [IMocker::DATA_FORMAT_INT64, '-9223372036854775808', '9223372036854775808', -9223372036854775807, 9223372036854775807], + [IMocker::DATA_FORMAT_INT32, -10, 10, -10, 10], + [IMocker::DATA_FORMAT_INT64, -10, 10, -10, 10], + [IMocker::DATA_FORMAT_INT32, -9223372036854775807, 9223372036854775807, -2147483647, 2147483647], + [strtoupper(IMocker::DATA_FORMAT_INT32), -2147483648, 2147483648, -2147483647, 2147483647], + [strtoupper(IMocker::DATA_FORMAT_INT64), '-9223372036854775808', '9223372036854775808', -9223372036854775807, 9223372036854775807], + ]; + } + /** * @dataProvider provideMockNumberCorrectArguments * @covers ::mockNumber diff --git a/samples/server/petstore/php-slim4/lib/Mock/OpenApiDataMocker.php b/samples/server/petstore/php-slim4/lib/Mock/OpenApiDataMocker.php index 7f4412a74182816f000854983059dc6d89e17442..facf17f0ef2968a57c59012f6118696b5937f6cc 100644 --- a/samples/server/petstore/php-slim4/lib/Mock/OpenApiDataMocker.php +++ b/samples/server/petstore/php-slim4/lib/Mock/OpenApiDataMocker.php @@ -119,6 +119,22 @@ final class OpenApiDataMocker implements IMocker $exclusiveMinimum = false, $exclusiveMaximum = false ) { + $dataFormat = is_string($dataFormat) ? strtolower($dataFormat) : $dataFormat; + switch ($dataFormat) { + case IMocker::DATA_FORMAT_INT32: + // -2147483647..2147483647 + $minimum = is_numeric($minimum) ? max($minimum, -2147483647) : -2147483647; + $maximum = is_numeric($maximum) ? min($maximum, 2147483647) : 2147483647; + break; + case IMocker::DATA_FORMAT_INT64: + // -9223372036854775807..9223372036854775807 + $minimum = is_numeric($minimum) ? max($minimum, -9223372036854775807) : -9223372036854775807; + $maximum = is_numeric($maximum) ? min($maximum, 9223372036854775807) : 9223372036854775807; + break; + default: + // do nothing, unsupported format + } + return $this->getRandomNumber($minimum, $maximum, $exclusiveMinimum, $exclusiveMaximum, 0); } @@ -357,7 +373,7 @@ final class OpenApiDataMocker implements IMocker foreach ($properties as $propName => $propValue) { $options = $this->extractSchemaProperties($propValue); $dataType = $options['type']; - $dataFormat = $options['dataFormat'] ?? null; + $dataFormat = $options['format'] ?? null; $ref = $options['$ref'] ?? null; $data = $this->mockFromRef($ref); $obj->$propName = ($data) ? $data : $this->mock($dataType, $dataFormat, $options); @@ -517,6 +533,6 @@ final class OpenApiDataMocker implements IMocker if ($maxDecimals > 0) { return round($min + mt_rand() / mt_getrandmax() * ($max - $min), $maxDecimals); } - return mt_rand($min, $max); + return mt_rand((int) $min, (int) $max); } } diff --git a/samples/server/petstore/php-slim4/test/Mock/OpenApiDataMockerTest.php b/samples/server/petstore/php-slim4/test/Mock/OpenApiDataMockerTest.php index 2ddf0b8a0f57f7e7aa78ba3b75e863571e95736f..87777551d08f1a228335a54ea284bdfcc8184b10 100644 --- a/samples/server/petstore/php-slim4/test/Mock/OpenApiDataMockerTest.php +++ b/samples/server/petstore/php-slim4/test/Mock/OpenApiDataMockerTest.php @@ -190,6 +190,36 @@ class OpenApiDataMockerTest extends TestCase ]; } + /** + * @covers ::mockInteger + * @dataProvider provideMockIntegerFormats + */ + public function testMockIntegerWithFormats( + $dataFormat, + $minimum, + $maximum, + $expectedMin, + $expectedMax + ) { + $mocker = new OpenApiDataMocker(); + $integer = $mocker->mockInteger($dataFormat, $minimum, $maximum); + $this->assertGreaterThanOrEqual($expectedMin, $integer); + $this->assertLessThanOrEqual($expectedMax, $integer); + } + + public function provideMockIntegerFormats() + { + return [ + [IMocker::DATA_FORMAT_INT32, -2147483648, 2147483648, -2147483647, 2147483647], + [IMocker::DATA_FORMAT_INT64, '-9223372036854775808', '9223372036854775808', -9223372036854775807, 9223372036854775807], + [IMocker::DATA_FORMAT_INT32, -10, 10, -10, 10], + [IMocker::DATA_FORMAT_INT64, -10, 10, -10, 10], + [IMocker::DATA_FORMAT_INT32, -9223372036854775807, 9223372036854775807, -2147483647, 2147483647], + [strtoupper(IMocker::DATA_FORMAT_INT32), -2147483648, 2147483648, -2147483647, 2147483647], + [strtoupper(IMocker::DATA_FORMAT_INT64), '-9223372036854775808', '9223372036854775808', -9223372036854775807, 9223372036854775807], + ]; + } + /** * @dataProvider provideMockNumberCorrectArguments * @covers ::mockNumber