tao-test/app/vendor/cebe/php-openapi/tests/spec/PathTest.php

196 lines
7.2 KiB
PHP

<?php
use cebe\openapi\Reader;
use cebe\openapi\spec\Operation;
use cebe\openapi\spec\PathItem;
use cebe\openapi\spec\Paths;
use cebe\openapi\spec\Reference;
use cebe\openapi\spec\Response;
use cebe\openapi\spec\Responses;
/**
* @covers \cebe\openapi\spec\Paths
* @covers \cebe\openapi\spec\PathItem
*/
class PathTest extends \PHPUnit\Framework\TestCase
{
public function testRead()
{
/** @var $paths Paths */
$paths = Reader::readFromJson(<<<'JSON'
{
"/pets": {
"get": {
"description": "Returns all pets from the system that the user has access to",
"responses": {
"200": {
"description": "A list of pets.",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/pet"
}
}
}
}
}
}
}
}
}
JSON
, Paths::class);
$result = $paths->validate();
$this->assertEquals([], $paths->getErrors());
$this->assertTrue($result);
$this->assertTrue($paths->hasPath('/pets'));
$this->assertTrue(isset($paths['/pets']));
$this->assertFalse($paths->hasPath('/dog'));
$this->assertFalse(isset($paths['/dog']));
$this->assertInstanceOf(PathItem::class, $paths->getPath('/pets'));
$this->assertInstanceOf(PathItem::class, $paths['/pets']);
$this->assertInstanceOf(Operation::class, $paths->getPath('/pets')->get);
$this->assertNull($paths->getPath('/dog'));
$this->assertNull($paths['/dog']);
$this->assertCount(1, $paths->getPaths());
$this->assertCount(1, $paths);
foreach($paths as $path => $pathItem) {
$this->assertEquals('/pets', $path);
$this->assertInstanceOf(PathItem::class, $pathItem);
}
}
public function testCreateionFromObjects()
{
$paths = new Paths([
'/pets' => new PathItem([
'get' => new Operation([
'responses' => new Responses([
200 => new Response(['description' => 'A list of pets.']),
404 => ['description' => 'The pets list is gone 🙀'],
])
])
])
]);
$this->assertTrue($paths->hasPath('/pets'));
$this->assertInstanceOf(PathItem::class, $paths->getPath('/pets'));
$this->assertInstanceOf(PathItem::class, $paths['/pets']);
$this->assertInstanceOf(Operation::class, $paths->getPath('/pets')->get);
$this->assertSame('A list of pets.', $paths->getPath('/pets')->get->responses->getResponse(200)->description);
$this->assertSame('The pets list is gone 🙀', $paths->getPath('/pets')->get->responses->getResponse(404)->description);
}
public function badPathsConfigProvider()
{
yield [['/pets' => 'foo'], 'Path MUST be either array or PathItem object, "string" given'];
yield [['/pets' => 42], 'Path MUST be either array or PathItem object, "integer" given'];
yield [['/pets' => false], 'Path MUST be either array or PathItem object, "boolean" given'];
yield [['/pets' => new stdClass()], 'Path MUST be either array or PathItem object, "stdClass" given'];
// The last one can be supported in future, but now SpecBaseObjects::__construct() requires array explicitly
}
/**
* @dataProvider badPathsConfigProvider
*/
public function testPathsCanNotBeCreatedFromBullshit($config, $expectedException)
{
$this->expectException(\cebe\openapi\exceptions\TypeErrorException::class);
$this->expectExceptionMessage($expectedException);
new Paths($config);
}
public function testInvalidPath()
{
/** @var $paths Paths */
$paths = Reader::readFromJson(<<<'JSON'
{
"pets": {
"get": {
"description": "Returns all pets from the system that the user has access to",
"responses": {
"200": {
"description": "A list of pets."
}
}
}
}
}
JSON
, Paths::class);
$result = $paths->validate();
$this->assertEquals([
'Path must begin with /: pets'
], $paths->getErrors());
$this->assertFalse($result);
}
public function testPathItemReference()
{
$file = __DIR__ . '/data/paths/openapi.yaml';
/** @var $openapi \cebe\openapi\spec\OpenApi */
$openapi = Reader::readFromYamlFile($file, \cebe\openapi\spec\OpenApi::class, false);
$result = $openapi->validate();
$this->assertEquals([], $openapi->getErrors(), print_r($openapi->getErrors(), true));
$this->assertTrue($result);
$this->assertInstanceOf(Paths::class, $openapi->paths);
$this->assertInstanceOf(PathItem::class, $fooPath = $openapi->paths['/foo']);
$this->assertInstanceOf(PathItem::class, $barPath = $openapi->paths['/bar']);
$this->assertSame([
'x-extension-1' => 'Extension1',
'x-extension-2' => 'Extension2'
], $openapi->getExtensions());
$this->assertEmpty($fooPath->getOperations());
$this->assertEmpty($barPath->getOperations());
$this->assertInstanceOf(\cebe\openapi\spec\Reference::class, $fooPath->getReference());
$this->assertInstanceOf(\cebe\openapi\spec\Reference::class, $barPath->getReference());
$this->assertNull($fooPath->getReference()->resolve());
$this->assertInstanceOf(PathItem::class, $ReferencedBarPath = $barPath->getReference()->resolve());
$this->assertCount(1, $ReferencedBarPath->getOperations());
$this->assertInstanceOf(Operation::class, $ReferencedBarPath->get);
$this->assertEquals('getBar', $ReferencedBarPath->get->operationId);
$this->assertInstanceOf(Reference::class, $reference200 = $ReferencedBarPath->get->responses['200']);
$this->assertInstanceOf(Response::class, $ReferencedBarPath->get->responses['404']);
$this->assertEquals('non-existing resource', $ReferencedBarPath->get->responses['404']->description);
$path200 = $reference200->resolve();
$this->assertInstanceOf(Response::class, $path200);
$this->assertEquals('A bar', $path200->description);
/** @var $openapi OpenApi */
$openapi = Reader::readFromYamlFile($file, \cebe\openapi\spec\OpenApi::class, true);
$result = $openapi->validate();
$this->assertEquals([], $openapi->getErrors(), print_r($openapi->getErrors(), true));
$this->assertTrue($result);
$this->assertInstanceOf(Paths::class, $openapi->paths);
$this->assertInstanceOf(PathItem::class, $fooPath = $openapi->paths['/foo']);
$this->assertInstanceOf(PathItem::class, $barPath = $openapi->paths['/bar']);
$this->assertEmpty($fooPath->getOperations());
$this->assertCount(1, $barPath->getOperations());
$this->assertInstanceOf(Operation::class, $barPath->get);
$this->assertEquals('getBar', $barPath->get->operationId);
$this->assertEquals('A bar', $barPath->get->responses['200']->description);
$this->assertEquals('non-existing resource', $barPath->get->responses['404']->description);
}
}