Skip to content
Prev Previous commit
Next Next commit
[Slim4] Add implementation and tests for new method
  • Loading branch information
ybelenko committed Jan 8, 2020
commit 524050594663bbc007816e93e18cf1885a2e12a6
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,24 @@ final class OpenApiDataMocker implements IMocker
return $obj;
}

/**
* Mocks OpenApi Data from schema.
*
* @param array|object $schema OpenAPI schema
*
* @throws \InvalidArgumentException when invalid arguments passed
*
* @return mixed
*/
public function mockFromSchema($schema)
{
$props = $this->extractSchemaProperties($schema);
if ($props['type'] === null) {
throw new InvalidArgumentException('"schema" must be object or assoc array with "type" property');
}
return $this->mock($props['type'], $props['format'], $props);
}

/**
* @internal Extract OAS properties from array or object.
* @codeCoverageIgnore
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ use {{mockPackage}}\{{interfaceNamePrefix}}OpenApiDataMocker{{interfaceNameSuffi
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Constraint\IsType;
use StdClass;
use DateTime;

/**
* OpenApiDataMockerTest Class Doc Comment
Expand Down Expand Up @@ -519,7 +520,7 @@ class OpenApiDataMockerTest extends TestCase
$subMaxItems = $items->maxItems ?? null;
$subUniqueItems = $items->uniqueItems ?? null;
}


foreach ($arr as $item) {
switch ($dataType) {
Expand Down Expand Up @@ -769,5 +770,114 @@ class OpenApiDataMockerTest extends TestCase
],
];
}

/**
* @dataProvider provideMockFromSchemaCorrectArguments
* @covers ::mockFromSchema
*/
public function testMockFromSchemaWithCorrectArguments($schema, $expectedType)
{
$mocker = new OpenApiDataMocker();
$data = $mocker->mockFromSchema($schema);
$this->assertInternalType($expectedType, $data);
}

public function provideMockFromSchemaCorrectArguments()
{
return [
'string from object' => [
(object) ['type' => IMocker::DATA_TYPE_STRING],
IsType::TYPE_STRING,
],
'string from array' => [
['type' => IMocker::DATA_TYPE_STRING],
IsType::TYPE_STRING,
],
'integer from object' => [
(object) ['type' => IMocker::DATA_TYPE_INTEGER],
IsType::TYPE_INT,
],
'integer from array' => [
['type' => IMocker::DATA_TYPE_INTEGER],
IsType::TYPE_INT,
],
'number from object' => [
(object) ['type' => IMocker::DATA_TYPE_NUMBER],
IsType::TYPE_FLOAT,
],
'number from array' => [
['type' => IMocker::DATA_TYPE_NUMBER],
IsType::TYPE_FLOAT,
],
'string from object' => [
(object) ['type' => IMocker::DATA_TYPE_STRING],
IsType::TYPE_STRING,
],
'string from array' => [
['type' => IMocker::DATA_TYPE_STRING],
IsType::TYPE_STRING,
],
'boolean from object' => [
(object) ['type' => IMocker::DATA_TYPE_BOOLEAN],
IsType::TYPE_BOOL,
],
'boolean from array' => [
['type' => IMocker::DATA_TYPE_BOOLEAN],
IsType::TYPE_BOOL,
],
'array of strings from object' => [
(object) [
'type' => IMocker::DATA_TYPE_ARRAY,
'items' => ['type' => IMocker::DATA_TYPE_STRING],
],
IsType::TYPE_ARRAY,
],
'array of strings from array' => [
[
'type' => IMocker::DATA_TYPE_ARRAY,
'items' => ['type' => IMocker::DATA_TYPE_STRING],
],
IsType::TYPE_ARRAY,
],
'object with username prop from object' => [
(object) [
'type' => IMocker::DATA_TYPE_OBJECT,
'properties' => ['username' => ['type' => IMocker::DATA_TYPE_STRING]],
],
IsType::TYPE_OBJECT,
],
'object with username prop from array' => [
[
'type' => IMocker::DATA_TYPE_OBJECT,
'properties' => ['username' => ['type' => IMocker::DATA_TYPE_STRING]],
],
IsType::TYPE_OBJECT,
],
];
}

/**
* @dataProvider provideMockFromSchemaInvalidArguments
* @expectedException \InvalidArgumentException
* @covers ::mockFromSchema
*/
public function testMockFromSchemaWithInvalidArguments($schema)
{
$mocker = new OpenApiDataMocker();
$data = $mocker->mockFromSchema($schema);
}


public function provideMockFromSchemaInvalidArguments()
{
return [
'null' => [null],
'numeric' => [3.14],
'empty array' => [[]],
'empty object' => [(object) []],
'string' => ['foobar'],
'DateTime object' => [new DateTime()],
];
}
}
{{/apiInfo}}