[Slim4] Add string formats support to Data Mocker (#4975)

* [Slim4] Support byte data format

* [Slim4] Support date and date-time data formats

* [Slim4] Support password data format

* [Slim4] Support uuid data format

* [Slim4] Fix test of password format mocking

'00000' is numeric type, because PHPUnit doesn't make strict type
comparison.

* [Slim4] Fix data format key in object mocking

* [Slim4] Support binary data format

* [Slim4] Support email data format

* [Slim4] Base64 encode binary format output

Raw bytes string breaks PHP stdout output, so I've decided to use base64
encoding format for binary format too.

* [Slim4] Refresh samples
This commit is contained in:
Yuriy Belenko 2020-01-23 11:18:18 +03:00 committed by William Cheng
parent bcff006dc8
commit 0366e946ba
4 changed files with 544 additions and 4 deletions

View File

@ -36,6 +36,7 @@ namespace {{mockPackage}};
use {{mockPackage}}\{{interfaceNamePrefix}}OpenApiDataMocker{{interfaceNameSuffix}} as IMocker; use {{mockPackage}}\{{interfaceNamePrefix}}OpenApiDataMocker{{interfaceNameSuffix}} as IMocker;
use {{utilsPackage}}\{{traitNamePrefix}}ModelUtils{{traitNameSuffix}}; use {{utilsPackage}}\{{traitNamePrefix}}ModelUtils{{traitNameSuffix}};
use StdClass; use StdClass;
use DateTime;
use InvalidArgumentException; use InvalidArgumentException;
/** /**
@ -193,6 +194,26 @@ final class OpenApiDataMocker implements IMocker
$enum = null, $enum = null,
$pattern = null $pattern = null
) { ) {
$str = '';
$getLoremIpsum = function ($length) {
return str_pad(
'',
$length,
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ',
\STR_PAD_RIGHT
);
};
$truncateOrPad = function ($text, $min = null, $max = null, $glue = '') {
if ($max !== null && mb_strlen($text) > $max) {
// truncate
$text = substr($text, 0, $max);
} elseif ($min !== null && mb_strlen($text) < $min) {
// pad
$text = str_pad('', $min, $text . $glue, \STR_PAD_RIGHT);
}
return $text;
};
if ($enum !== null) { if ($enum !== null) {
if ( if (
is_array($enum) === false is_array($enum) === false
@ -231,7 +252,72 @@ final class OpenApiDataMocker implements IMocker
throw new InvalidArgumentException('"maxLength" value cannot be less than "minLength"'); throw new InvalidArgumentException('"maxLength" value cannot be less than "minLength"');
} }
return str_pad('', mt_rand($minLength, $maxLength), 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ', \STR_PAD_RIGHT); switch ($dataFormat) {
case IMocker::DATA_FORMAT_BYTE:
case IMocker::DATA_FORMAT_BINARY:
// base64 encoded string
$inputLength = 1;
$str = base64_encode($getLoremIpsum($inputLength));
while (mb_strlen($str) < $minLength) {
$inputLength++;
$str = base64_encode($getLoremIpsum($inputLength));
}
// base64 encoding produces strings devided by 4, so resulted string can exceed maxLength parameter
// I think truncated(invalid) base64 string is better than oversized, cause this data is fake anyway
$str = $truncateOrPad($str, null, $maxLength, '. ');
break;
case IMocker::DATA_FORMAT_DATE:
case IMocker::DATA_FORMAT_DATE_TIME:
// min unix timestamp is 0 and max is 2147483647 for 32bit systems which equals 2038-01-19 03:14:07
$date = DateTime::createFromFormat('U', mt_rand(0, 2147483647));
$str = ($dataFormat === IMocker::DATA_FORMAT_DATE) ? $date->format('Y-m-d') : $date->format('Y-m-d\TH:i:sP');
// truncate or pad datestring to fit minLength and maxLength
$str = $truncateOrPad($str, $minLength, $maxLength, ' ');
break;
case IMocker::DATA_FORMAT_PASSWORD:
// use list of most popular passwords
$obviousPassList = [
'qwerty',
'qwerty12345',
'hello',
'12345',
'0000',
'qwerty12345!',
'qwertyuiop[]',
];
$str = $obviousPassList[mt_rand(0, count($obviousPassList) - 1)];
// truncate or pad password to fit minLength and maxLength
$str = $truncateOrPad($str, $minLength, $maxLength);
break;
case IMocker::DATA_FORMAT_UUID:
// use php built-in uniqid function
$str = uniqid();
// truncate or pad password to fit minLength and maxLength
$str = $truncateOrPad($str, $minLength, $maxLength);
break;
case IMocker::DATA_FORMAT_EMAIL:
// just for visionary purpose, not related to real persons
$fakeEmailList = [
'johndoe',
'lhoswald',
'ojsimpson',
'mlking',
'jfkennedy',
];
$str = $fakeEmailList[mt_rand(0, count($fakeEmailList) - 1)] . '@example.com';
// truncate or pad email to fit minLength and maxLength
$str = $truncateOrPad($str, $minLength, $maxLength);
break;
default:
$str = $getLoremIpsum(mt_rand($minLength, $maxLength));
}
return $str;
} }
/** /**

View File

@ -342,7 +342,6 @@ class OpenApiDataMockerTest extends TestCase
IsType::TYPE_STRING, IsType::TYPE_STRING,
]; ];
$notTypes = [ $notTypes = [
IsType::TYPE_NUMERIC,
IsType::TYPE_FLOAT, IsType::TYPE_FLOAT,
IsType::TYPE_INT, IsType::TYPE_INT,
IsType::TYPE_ARRAY, IsType::TYPE_ARRAY,
@ -363,6 +362,22 @@ class OpenApiDataMockerTest extends TestCase
[null, null, null, null, $types, $notTypes], [null, null, null, null, $types, $notTypes],
[null, null, null, ['foobar', 'foobaz', 'hello world'], $types, $notTypes], [null, null, null, ['foobar', 'foobaz', 'hello world'], $types, $notTypes],
[null, null, null, ['foobar'], $types, $notTypes], [null, null, null, ['foobar'], $types, $notTypes],
[IMocker::DATA_FORMAT_PASSWORD, 0, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_PASSWORD, 10, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_PASSWORD, 0, 100, null, $types, $notTypes],
[IMocker::DATA_FORMAT_PASSWORD, 10, 50, null, $types, $notTypes],
[IMocker::DATA_FORMAT_PASSWORD, 10, 10, null, $types, $notTypes],
[IMocker::DATA_FORMAT_PASSWORD, 0, 0, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, null, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 10, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 10, 10, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, null, 8, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 16, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 25, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 25, 25, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, null, 20, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 30, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 1, 1, null, $types, $notTypes],
]; ];
} }
@ -398,6 +413,175 @@ class OpenApiDataMockerTest extends TestCase
]; ];
} }
/**
* @covers ::mock
* @covers ::mockString
* @dataProvider provideMockStringByteFormatArguments
*/
public function testMockStringWithByteFormat(
$dataFormat,
$minLength,
$maxLength
) {
$mocker = new OpenApiDataMocker();
$str = $mocker->mockString($dataFormat, $minLength, $maxLength);
$str2 = $mocker->mock(IMocker::DATA_TYPE_STRING, $dataFormat, ['minLength' => $minLength, 'maxLength' => $maxLength]);
$base64pattern = '/^[\w\+\/\=]*$/';
$this->assertRegExp($base64pattern, $str);
$this->assertRegExp($base64pattern, $str2);
if ($minLength !== null) {
$this->assertGreaterThanOrEqual($minLength, mb_strlen($str));
$this->assertGreaterThanOrEqual($minLength, mb_strlen($str2));
}
if ($maxLength !== null) {
$this->assertLessThanOrEqual($maxLength, mb_strlen($str));
$this->assertLessThanOrEqual($maxLength, mb_strlen($str2));
}
}
public function provideMockStringByteFormatArguments()
{
return [
[IMocker::DATA_FORMAT_BYTE, null, null],
[IMocker::DATA_FORMAT_BYTE, 10, null],
[IMocker::DATA_FORMAT_BYTE, 10, 10],
[IMocker::DATA_FORMAT_BYTE, null, 12],
];
}
/**
* @covers ::mock
* @covers ::mockString
* @dataProvider provideMockStringBinaryFormatArguments
*/
public function testMockStringWithBinaryFormat(
$dataFormat,
$minLength,
$maxLength
) {
$mocker = new OpenApiDataMocker();
$str = $mocker->mockString($dataFormat, $minLength, $maxLength);
$str2 = $mocker->mock(IMocker::DATA_TYPE_STRING, $dataFormat, ['minLength' => $minLength, 'maxLength' => $maxLength]);
if ($minLength !== null) {
$this->assertGreaterThanOrEqual($minLength, strlen($str));
$this->assertGreaterThanOrEqual($minLength, strlen($str2));
}
if ($maxLength !== null) {
$this->assertLessThanOrEqual($maxLength, strlen($str));
$this->assertLessThanOrEqual($maxLength, strlen($str2));
}
}
public function provideMockStringBinaryFormatArguments()
{
return [
[IMocker::DATA_FORMAT_BINARY, 0, null],
[IMocker::DATA_FORMAT_BINARY, 10, null],
[IMocker::DATA_FORMAT_BINARY, 0, 100],
[IMocker::DATA_FORMAT_BINARY, 10, 50],
[IMocker::DATA_FORMAT_BINARY, 10, 10],
[IMocker::DATA_FORMAT_BINARY, 0, 0],
];
}
/**
* @covers ::mock
* @covers ::mockString
* @dataProvider provideMockStringDateFormatArguments
*/
public function testMockStringWithDateAndDateTimeFormat(
$dataFormat,
$minLength,
$maxLength,
$dtFormat
) {
$mocker = new OpenApiDataMocker();
$str = $mocker->mockString($dataFormat, $minLength, $maxLength);
$str2 = $mocker->mock(IMocker::DATA_TYPE_STRING, $dataFormat, ['minLength' => $minLength, 'maxLength' => $maxLength]);
if ($dtFormat !== null) {
$date = DateTime::createFromFormat($dtFormat, $str);
$date2 = DateTime::createFromFormat($dtFormat, $str2);
$this->assertInstanceOf(DateTime::class, $date);
$this->assertInstanceOf(DateTime::class, $date2);
}
if ($minLength !== null) {
$this->assertGreaterThanOrEqual($minLength, mb_strlen($str));
$this->assertGreaterThanOrEqual($minLength, mb_strlen($str2));
}
if ($maxLength !== null) {
$this->assertLessThanOrEqual($maxLength, mb_strlen($str));
$this->assertLessThanOrEqual($maxLength, mb_strlen($str2));
}
}
public function provideMockStringDateFormatArguments()
{
return [
[IMocker::DATA_FORMAT_DATE, null, null, 'Y-m-d'],
[IMocker::DATA_FORMAT_DATE, 10, null, 'Y-m-d'],
[IMocker::DATA_FORMAT_DATE, 10, 10, 'Y-m-d'],
[IMocker::DATA_FORMAT_DATE, null, 8, null],
[IMocker::DATA_FORMAT_DATE, 16, null, null],
[IMocker::DATA_FORMAT_DATE_TIME, null, null, 'Y-m-d\TH:i:sP'],
[IMocker::DATA_FORMAT_DATE_TIME, 25, null, 'Y-m-d\TH:i:sP'],
[IMocker::DATA_FORMAT_DATE_TIME, 25, 25, 'Y-m-d\TH:i:sP'],
[IMocker::DATA_FORMAT_DATE_TIME, null, 20, null],
[IMocker::DATA_FORMAT_DATE_TIME, 30, null, null],
];
}
/**
* @covers ::mock
* @covers ::mockString
* @dataProvider provideMockStringUuidFormatArguments
*/
public function testMockStringWithUuidFormat(
$minLength,
$maxLength
) {
$mocker = new OpenApiDataMocker();
$arr = [];
$arr2 = [];
$hexPattern = '/^[a-f0-9]*$/';
while (count($arr) < 100 && count($arr2) < 100) {
$str = $mocker->mockString(IMocker::DATA_FORMAT_UUID, $minLength, $maxLength);
$str2 = $mocker->mock(IMocker::DATA_TYPE_STRING, IMocker::DATA_FORMAT_UUID, ['minLength' => $minLength, 'maxLength' => $maxLength]);
$arr[] = $str;
$arr2[] = $str2;
$this->assertRegExp($hexPattern, $str);
$this->assertRegExp($hexPattern, $str2);
if ($minLength !== null) {
$this->assertGreaterThanOrEqual($minLength, mb_strlen($str));
$this->assertGreaterThanOrEqual($minLength, mb_strlen($str2));
}
if ($maxLength !== null) {
$this->assertLessThanOrEqual($maxLength, mb_strlen($str));
$this->assertLessThanOrEqual($maxLength, mb_strlen($str2));
}
}
}
public function provideMockStringUuidFormatArguments()
{
return [
[null, null],
[10, null],
[10, 10],
[null, 8],
[16, null],
[null, null],
[25, null],
[25, 25],
[null, 20],
[30, null],
[1, 1],
];
}
/** /**
* @covers ::mockBoolean * @covers ::mockBoolean
*/ */

View File

@ -28,6 +28,7 @@ namespace OpenAPIServer\Mock;
use OpenAPIServer\Mock\OpenApiDataMockerInterface as IMocker; use OpenAPIServer\Mock\OpenApiDataMockerInterface as IMocker;
use OpenAPIServer\Utils\ModelUtilsTrait; use OpenAPIServer\Utils\ModelUtilsTrait;
use StdClass; use StdClass;
use DateTime;
use InvalidArgumentException; use InvalidArgumentException;
/** /**
@ -185,6 +186,26 @@ final class OpenApiDataMocker implements IMocker
$enum = null, $enum = null,
$pattern = null $pattern = null
) { ) {
$str = '';
$getLoremIpsum = function ($length) {
return str_pad(
'',
$length,
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ',
\STR_PAD_RIGHT
);
};
$truncateOrPad = function ($text, $min = null, $max = null, $glue = '') {
if ($max !== null && mb_strlen($text) > $max) {
// truncate
$text = substr($text, 0, $max);
} elseif ($min !== null && mb_strlen($text) < $min) {
// pad
$text = str_pad('', $min, $text . $glue, \STR_PAD_RIGHT);
}
return $text;
};
if ($enum !== null) { if ($enum !== null) {
if ( if (
is_array($enum) === false is_array($enum) === false
@ -223,7 +244,72 @@ final class OpenApiDataMocker implements IMocker
throw new InvalidArgumentException('"maxLength" value cannot be less than "minLength"'); throw new InvalidArgumentException('"maxLength" value cannot be less than "minLength"');
} }
return str_pad('', mt_rand($minLength, $maxLength), 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ', \STR_PAD_RIGHT); switch ($dataFormat) {
case IMocker::DATA_FORMAT_BYTE:
case IMocker::DATA_FORMAT_BINARY:
// base64 encoded string
$inputLength = 1;
$str = base64_encode($getLoremIpsum($inputLength));
while (mb_strlen($str) < $minLength) {
$inputLength++;
$str = base64_encode($getLoremIpsum($inputLength));
}
// base64 encoding produces strings devided by 4, so resulted string can exceed maxLength parameter
// I think truncated(invalid) base64 string is better than oversized, cause this data is fake anyway
$str = $truncateOrPad($str, null, $maxLength, '. ');
break;
case IMocker::DATA_FORMAT_DATE:
case IMocker::DATA_FORMAT_DATE_TIME:
// min unix timestamp is 0 and max is 2147483647 for 32bit systems which equals 2038-01-19 03:14:07
$date = DateTime::createFromFormat('U', mt_rand(0, 2147483647));
$str = ($dataFormat === IMocker::DATA_FORMAT_DATE) ? $date->format('Y-m-d') : $date->format('Y-m-d\TH:i:sP');
// truncate or pad datestring to fit minLength and maxLength
$str = $truncateOrPad($str, $minLength, $maxLength, ' ');
break;
case IMocker::DATA_FORMAT_PASSWORD:
// use list of most popular passwords
$obviousPassList = [
'qwerty',
'qwerty12345',
'hello',
'12345',
'0000',
'qwerty12345!',
'qwertyuiop[]',
];
$str = $obviousPassList[mt_rand(0, count($obviousPassList) - 1)];
// truncate or pad password to fit minLength and maxLength
$str = $truncateOrPad($str, $minLength, $maxLength);
break;
case IMocker::DATA_FORMAT_UUID:
// use php built-in uniqid function
$str = uniqid();
// truncate or pad password to fit minLength and maxLength
$str = $truncateOrPad($str, $minLength, $maxLength);
break;
case IMocker::DATA_FORMAT_EMAIL:
// just for visionary purpose, not related to real persons
$fakeEmailList = [
'johndoe',
'lhoswald',
'ojsimpson',
'mlking',
'jfkennedy',
];
$str = $fakeEmailList[mt_rand(0, count($fakeEmailList) - 1)] . '@example.com';
// truncate or pad email to fit minLength and maxLength
$str = $truncateOrPad($str, $minLength, $maxLength);
break;
default:
$str = $getLoremIpsum(mt_rand($minLength, $maxLength));
}
return $str;
} }
/** /**

View File

@ -334,7 +334,6 @@ class OpenApiDataMockerTest extends TestCase
IsType::TYPE_STRING, IsType::TYPE_STRING,
]; ];
$notTypes = [ $notTypes = [
IsType::TYPE_NUMERIC,
IsType::TYPE_FLOAT, IsType::TYPE_FLOAT,
IsType::TYPE_INT, IsType::TYPE_INT,
IsType::TYPE_ARRAY, IsType::TYPE_ARRAY,
@ -355,6 +354,22 @@ class OpenApiDataMockerTest extends TestCase
[null, null, null, null, $types, $notTypes], [null, null, null, null, $types, $notTypes],
[null, null, null, ['foobar', 'foobaz', 'hello world'], $types, $notTypes], [null, null, null, ['foobar', 'foobaz', 'hello world'], $types, $notTypes],
[null, null, null, ['foobar'], $types, $notTypes], [null, null, null, ['foobar'], $types, $notTypes],
[IMocker::DATA_FORMAT_PASSWORD, 0, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_PASSWORD, 10, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_PASSWORD, 0, 100, null, $types, $notTypes],
[IMocker::DATA_FORMAT_PASSWORD, 10, 50, null, $types, $notTypes],
[IMocker::DATA_FORMAT_PASSWORD, 10, 10, null, $types, $notTypes],
[IMocker::DATA_FORMAT_PASSWORD, 0, 0, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, null, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 10, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 10, 10, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, null, 8, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 16, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 25, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 25, 25, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, null, 20, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 30, null, null, $types, $notTypes],
[IMocker::DATA_FORMAT_EMAIL, 1, 1, null, $types, $notTypes],
]; ];
} }
@ -390,6 +405,175 @@ class OpenApiDataMockerTest extends TestCase
]; ];
} }
/**
* @covers ::mock
* @covers ::mockString
* @dataProvider provideMockStringByteFormatArguments
*/
public function testMockStringWithByteFormat(
$dataFormat,
$minLength,
$maxLength
) {
$mocker = new OpenApiDataMocker();
$str = $mocker->mockString($dataFormat, $minLength, $maxLength);
$str2 = $mocker->mock(IMocker::DATA_TYPE_STRING, $dataFormat, ['minLength' => $minLength, 'maxLength' => $maxLength]);
$base64pattern = '/^[\w\+\/\=]*$/';
$this->assertRegExp($base64pattern, $str);
$this->assertRegExp($base64pattern, $str2);
if ($minLength !== null) {
$this->assertGreaterThanOrEqual($minLength, mb_strlen($str));
$this->assertGreaterThanOrEqual($minLength, mb_strlen($str2));
}
if ($maxLength !== null) {
$this->assertLessThanOrEqual($maxLength, mb_strlen($str));
$this->assertLessThanOrEqual($maxLength, mb_strlen($str2));
}
}
public function provideMockStringByteFormatArguments()
{
return [
[IMocker::DATA_FORMAT_BYTE, null, null],
[IMocker::DATA_FORMAT_BYTE, 10, null],
[IMocker::DATA_FORMAT_BYTE, 10, 10],
[IMocker::DATA_FORMAT_BYTE, null, 12],
];
}
/**
* @covers ::mock
* @covers ::mockString
* @dataProvider provideMockStringBinaryFormatArguments
*/
public function testMockStringWithBinaryFormat(
$dataFormat,
$minLength,
$maxLength
) {
$mocker = new OpenApiDataMocker();
$str = $mocker->mockString($dataFormat, $minLength, $maxLength);
$str2 = $mocker->mock(IMocker::DATA_TYPE_STRING, $dataFormat, ['minLength' => $minLength, 'maxLength' => $maxLength]);
if ($minLength !== null) {
$this->assertGreaterThanOrEqual($minLength, strlen($str));
$this->assertGreaterThanOrEqual($minLength, strlen($str2));
}
if ($maxLength !== null) {
$this->assertLessThanOrEqual($maxLength, strlen($str));
$this->assertLessThanOrEqual($maxLength, strlen($str2));
}
}
public function provideMockStringBinaryFormatArguments()
{
return [
[IMocker::DATA_FORMAT_BINARY, 0, null],
[IMocker::DATA_FORMAT_BINARY, 10, null],
[IMocker::DATA_FORMAT_BINARY, 0, 100],
[IMocker::DATA_FORMAT_BINARY, 10, 50],
[IMocker::DATA_FORMAT_BINARY, 10, 10],
[IMocker::DATA_FORMAT_BINARY, 0, 0],
];
}
/**
* @covers ::mock
* @covers ::mockString
* @dataProvider provideMockStringDateFormatArguments
*/
public function testMockStringWithDateAndDateTimeFormat(
$dataFormat,
$minLength,
$maxLength,
$dtFormat
) {
$mocker = new OpenApiDataMocker();
$str = $mocker->mockString($dataFormat, $minLength, $maxLength);
$str2 = $mocker->mock(IMocker::DATA_TYPE_STRING, $dataFormat, ['minLength' => $minLength, 'maxLength' => $maxLength]);
if ($dtFormat !== null) {
$date = DateTime::createFromFormat($dtFormat, $str);
$date2 = DateTime::createFromFormat($dtFormat, $str2);
$this->assertInstanceOf(DateTime::class, $date);
$this->assertInstanceOf(DateTime::class, $date2);
}
if ($minLength !== null) {
$this->assertGreaterThanOrEqual($minLength, mb_strlen($str));
$this->assertGreaterThanOrEqual($minLength, mb_strlen($str2));
}
if ($maxLength !== null) {
$this->assertLessThanOrEqual($maxLength, mb_strlen($str));
$this->assertLessThanOrEqual($maxLength, mb_strlen($str2));
}
}
public function provideMockStringDateFormatArguments()
{
return [
[IMocker::DATA_FORMAT_DATE, null, null, 'Y-m-d'],
[IMocker::DATA_FORMAT_DATE, 10, null, 'Y-m-d'],
[IMocker::DATA_FORMAT_DATE, 10, 10, 'Y-m-d'],
[IMocker::DATA_FORMAT_DATE, null, 8, null],
[IMocker::DATA_FORMAT_DATE, 16, null, null],
[IMocker::DATA_FORMAT_DATE_TIME, null, null, 'Y-m-d\TH:i:sP'],
[IMocker::DATA_FORMAT_DATE_TIME, 25, null, 'Y-m-d\TH:i:sP'],
[IMocker::DATA_FORMAT_DATE_TIME, 25, 25, 'Y-m-d\TH:i:sP'],
[IMocker::DATA_FORMAT_DATE_TIME, null, 20, null],
[IMocker::DATA_FORMAT_DATE_TIME, 30, null, null],
];
}
/**
* @covers ::mock
* @covers ::mockString
* @dataProvider provideMockStringUuidFormatArguments
*/
public function testMockStringWithUuidFormat(
$minLength,
$maxLength
) {
$mocker = new OpenApiDataMocker();
$arr = [];
$arr2 = [];
$hexPattern = '/^[a-f0-9]*$/';
while (count($arr) < 100 && count($arr2) < 100) {
$str = $mocker->mockString(IMocker::DATA_FORMAT_UUID, $minLength, $maxLength);
$str2 = $mocker->mock(IMocker::DATA_TYPE_STRING, IMocker::DATA_FORMAT_UUID, ['minLength' => $minLength, 'maxLength' => $maxLength]);
$arr[] = $str;
$arr2[] = $str2;
$this->assertRegExp($hexPattern, $str);
$this->assertRegExp($hexPattern, $str2);
if ($minLength !== null) {
$this->assertGreaterThanOrEqual($minLength, mb_strlen($str));
$this->assertGreaterThanOrEqual($minLength, mb_strlen($str2));
}
if ($maxLength !== null) {
$this->assertLessThanOrEqual($maxLength, mb_strlen($str));
$this->assertLessThanOrEqual($maxLength, mb_strlen($str2));
}
}
}
public function provideMockStringUuidFormatArguments()
{
return [
[null, null],
[10, null],
[10, 10],
[null, 8],
[16, null],
[null, null],
[25, null],
[25, 25],
[null, 20],
[30, null],
[1, 1],
];
}
/** /**
* @covers ::mockBoolean * @covers ::mockBoolean
*/ */