mirror of
https://github.com/ambieco/scribe.git
synced 2026-04-12 09:46:52 +08:00
314 lines
11 KiB
PHP
314 lines
11 KiB
PHP
<?php
|
|
|
|
namespace Mpociot\ApiDoc\Tests\Unit;
|
|
|
|
use Illuminate\Support\Collection;
|
|
use Mpociot\ApiDoc\Writing\PostmanCollectionWriter;
|
|
use Orchestra\Testbench\TestCase;
|
|
|
|
class PostmanCollectionWriterTest extends TestCase
|
|
{
|
|
public function testNameIsPresentInCollection()
|
|
{
|
|
\Config::set('apidoc.postman', [
|
|
'name' => 'Test collection',
|
|
]);
|
|
|
|
$writer = new PostmanCollectionWriter(new Collection(), '');
|
|
$collection = $writer->getCollection();
|
|
|
|
$this->assertSame('Test collection', json_decode($collection)->info->name);
|
|
}
|
|
|
|
public function testFallbackCollectionNameIsUsed()
|
|
{
|
|
\Config::set('app.name', 'Fake App');
|
|
|
|
$writer = new PostmanCollectionWriter(new Collection(), '');
|
|
$collection = $writer->getCollection();
|
|
|
|
$this->assertSame('Fake App API', json_decode($collection)->info->name);
|
|
}
|
|
|
|
public function testDescriptionIsPresentInCollection()
|
|
{
|
|
\Config::set('apidoc.postman', [
|
|
'description' => 'A fake description',
|
|
]);
|
|
|
|
$writer = new PostmanCollectionWriter(new Collection(), '');
|
|
$collection = $writer->getCollection();
|
|
|
|
$this->assertSame('A fake description', json_decode($collection)->info->description);
|
|
}
|
|
|
|
public function testAuthIsNotIncludedWhenNull()
|
|
{
|
|
$writer = new PostmanCollectionWriter(new Collection(), '');
|
|
$collection = $writer->getCollection();
|
|
|
|
$this->assertArrayNotHasKey('auth', json_decode($collection, true));
|
|
}
|
|
|
|
public function testAuthIsIncludedVerbatim()
|
|
{
|
|
$auth = [
|
|
'type' => 'test',
|
|
'test' => ['a' => 1],
|
|
];
|
|
\Config::set('apidoc.postman', [
|
|
'auth' => $auth,
|
|
]);
|
|
|
|
$writer = new PostmanCollectionWriter(new Collection(), '');
|
|
$collection = $writer->getCollection();
|
|
|
|
$this->assertSame($auth, json_decode($collection, true)['auth']);
|
|
}
|
|
|
|
public function testEndpointIsParsed()
|
|
{
|
|
$route = $this->createMockRouteData('some/path');
|
|
|
|
// Ensure method is set correctly for assertion later
|
|
$route['methods'] = ['GET'];
|
|
|
|
$collection = $this->createMockRouteGroup([$route], 'Group');
|
|
|
|
$writer = new PostmanCollectionWriter($collection, 'fake.localhost');
|
|
$collection = json_decode($writer->getCollection(), true);
|
|
|
|
$this->assertSame('Group', data_get($collection, 'item.0.name'), 'Group name exists');
|
|
|
|
$item = data_get($collection, 'item.0.item.0');
|
|
$this->assertSame('some/path', $item['name'], 'Name defaults to path');
|
|
$this->assertSame('http', data_get($item, 'request.url.protocol'), 'Protocol defaults to http');
|
|
$this->assertSame('fake.localhost', data_get($item, 'request.url.host'), 'Host uses what\'s given');
|
|
$this->assertSame('some/path', data_get($item, 'request.url.path'), 'Path is set correctly');
|
|
$this->assertEmpty(data_get($item, 'request.url.query'), 'Query parameters are empty');
|
|
$this->assertSame('GET', data_get($item, 'request.method'), 'Method is correctly resolved');
|
|
$this->assertContains([
|
|
'key' => 'Accept',
|
|
'value' => 'application/json',
|
|
], data_get($item, 'request.header'), 'JSON Accept header is added');
|
|
}
|
|
|
|
public function testHttpsProtocolIsDetected()
|
|
{
|
|
$collection = $this->createMockRouteGroup([$this->createMockRouteData('fake')]);
|
|
$writer = new PostmanCollectionWriter($collection, 'https://fake.localhost');
|
|
$collection = json_decode($writer->getCollection(), true);
|
|
|
|
$this->assertSame('https', data_get($collection, 'item.0.item.0.request.url.protocol'));
|
|
}
|
|
|
|
public function testHeadersArePulledFromRoute()
|
|
{
|
|
$route = $this->createMockRouteData('some/path');
|
|
|
|
$route['headers'] = ['X-Fake' => 'Test'];
|
|
|
|
$collection = $this->createMockRouteGroup([$route], 'Group');
|
|
$writer = new PostmanCollectionWriter($collection, 'fake.localhost');
|
|
$collection = json_decode($writer->getCollection(), true);
|
|
|
|
$this->assertContains([
|
|
'key' => 'X-Fake',
|
|
'value' => 'Test',
|
|
], data_get($collection, 'item.0.item.0.request.header'));
|
|
}
|
|
|
|
public function testUrlParametersAreConverted()
|
|
{
|
|
$collection = $this->createMockRouteGroup([$this->createMockRouteData('fake/{param}')]);
|
|
$writer = new PostmanCollectionWriter($collection, 'fake.localhost');
|
|
$collection = json_decode($writer->getCollection(), true);
|
|
|
|
$item = data_get($collection, 'item.0.item.0');
|
|
$this->assertSame('fake/{param}', $item['name'], 'Name defaults to path');
|
|
$this->assertSame('fake/:param', data_get($item, 'request.url.path'), 'Path is converted');
|
|
}
|
|
|
|
public function testUrlParamsResolveTheirDocumentation()
|
|
{
|
|
$fakeRoute = $this->createMockRouteData('fake/{param}');
|
|
|
|
$fakeRoute['urlParameters'] = ['param' => [
|
|
'description' => 'A test description for the test param',
|
|
'required' => true,
|
|
'value' => 'foobar',
|
|
]];
|
|
|
|
$collection = $this->createMockRouteGroup([$fakeRoute]);
|
|
$writer = new PostmanCollectionWriter($collection, 'fake.localhost');
|
|
$collection = json_decode($writer->getCollection(), true);
|
|
|
|
$variableData = data_get($collection, 'item.0.item.0.request.url.variable');
|
|
|
|
$this->assertCount(1, $variableData);
|
|
$this->assertSame([
|
|
'id' => 'param',
|
|
'key' => 'param',
|
|
'value' => 'foobar',
|
|
'description' => 'A test description for the test param',
|
|
], $variableData[0]);
|
|
}
|
|
|
|
public function testQueryParametersAreDocumented()
|
|
{
|
|
$fakeRoute = $this->createMockRouteData('fake/path');
|
|
|
|
$fakeRoute['queryParameters'] = ['limit' => [
|
|
'description' => 'A fake limit for my fake endpoint',
|
|
'required' => false,
|
|
'value' => 5,
|
|
]];
|
|
|
|
$collection = $this->createMockRouteGroup([$fakeRoute]);
|
|
$writer = new PostmanCollectionWriter($collection, 'fake.localhost');
|
|
$collection = json_decode($writer->getCollection(), true);
|
|
|
|
$variableData = data_get($collection, 'item.0.item.0.request.url.query');
|
|
|
|
$this->assertCount(1, $variableData);
|
|
$this->assertSame([
|
|
'key' => 'limit',
|
|
'value' => '5',
|
|
'description' => 'A fake limit for my fake endpoint',
|
|
'disabled' => false,
|
|
], $variableData[0]);
|
|
}
|
|
|
|
public function testUrlParametersAreNotIncludedIfMissingFromPath()
|
|
{
|
|
$fakeRoute = $this->createMockRouteData('fake/path');
|
|
|
|
$fakeRoute['urlParameters'] = ['limit' => [
|
|
'description' => 'A fake limit for my fake endpoint',
|
|
'required' => false,
|
|
'value' => 5,
|
|
]];
|
|
|
|
$collection = $this->createMockRouteGroup([$fakeRoute]);
|
|
$writer = new PostmanCollectionWriter($collection, 'fake.localhost');
|
|
$collection = json_decode($writer->getCollection(), true);
|
|
|
|
$variableData = data_get($collection, 'item.0.item.0.request.url.query');
|
|
|
|
$this->assertCount(0, $variableData);
|
|
}
|
|
|
|
public function testQueryParametersAreDisabledWithNoValueWhenNotRequired()
|
|
{
|
|
$fakeRoute = $this->createMockRouteData('fake/path');
|
|
$fakeRoute['queryParameters'] = [
|
|
'required' => [
|
|
'description' => 'A required param with a null value',
|
|
'required' => true,
|
|
'value' => null,
|
|
],
|
|
'not_required' => [
|
|
'description' => 'A not required param with a null value',
|
|
'required' => false,
|
|
'value' => null,
|
|
],
|
|
];
|
|
|
|
$collection = $this->createMockRouteGroup([$fakeRoute]);
|
|
$writer = new PostmanCollectionWriter($collection, 'fake.localhost');
|
|
$collection = json_decode($writer->getCollection(), true);
|
|
|
|
$variableData = data_get($collection, 'item.0.item.0.request.url.query');
|
|
|
|
$this->assertCount(2, $variableData);
|
|
$this->assertContains([
|
|
'key' => 'required',
|
|
'value' => null,
|
|
'description' => 'A required param with a null value',
|
|
'disabled' => false,
|
|
], $variableData);
|
|
$this->assertContains([
|
|
'key' => 'not_required',
|
|
'value' => null,
|
|
'description' => 'A not required param with a null value',
|
|
'disabled' => true,
|
|
], $variableData);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideAuthConfigHeaderData
|
|
*/
|
|
public function testAuthAutoExcludesHeaderDefinitions(array $authConfig, array $expectedRemovedHeaders)
|
|
{
|
|
\Config::set('apidoc.postman', [
|
|
'auth' => $authConfig,
|
|
]);
|
|
|
|
$route = $this->createMockRouteData('some/path');
|
|
$route['headers'] = $expectedRemovedHeaders;
|
|
$collection = $this->createMockRouteGroup([$route], 'Group');
|
|
$writer = new PostmanCollectionWriter($collection, 'fake.localhost');
|
|
$collection = json_decode($writer->getCollection(), true);
|
|
|
|
foreach ($expectedRemovedHeaders as $key => $value) {
|
|
$this->assertNotContains(compact('key', 'value'), data_get($collection, 'item.0.item.0.request.header'));
|
|
}
|
|
}
|
|
|
|
public function provideAuthConfigHeaderData()
|
|
{
|
|
yield [
|
|
['type' => 'bearer', 'bearer' => ['token' => 'Test']],
|
|
['Authorization' => 'Bearer Test'],
|
|
];
|
|
|
|
yield [
|
|
['type' => 'apikey', 'apikey' => ['value' => 'Test', 'key' => 'X-Authorization']],
|
|
['X-Authorization' => 'Test'],
|
|
];
|
|
}
|
|
|
|
public function testApiKeyAuthIsIgnoredIfExplicitlyNotInHeader()
|
|
{
|
|
\Config::set('apidoc.postman', [
|
|
'auth' => ['type' => 'apikey', 'apikey' => [
|
|
'value' => 'Test',
|
|
'key' => 'X-Authorization',
|
|
'in' => 'notheader',
|
|
]],
|
|
]);
|
|
|
|
$route = $this->createMockRouteData('some/path');
|
|
$route['headers'] = ['X-Authorization' => 'Test'];
|
|
$collection = $this->createMockRouteGroup([$route], 'Group');
|
|
$writer = new PostmanCollectionWriter($collection, 'fake.localhost');
|
|
$collection = json_decode($writer->getCollection(), true);
|
|
|
|
$this->assertContains([
|
|
'key' => 'X-Authorization',
|
|
'value' => 'Test',
|
|
], data_get($collection, 'item.0.item.0.request.header'));
|
|
}
|
|
|
|
protected function createMockRouteData($path, $title = '')
|
|
{
|
|
return [
|
|
'uri' => $path,
|
|
'methods' => ['GET'],
|
|
'headers' => [],
|
|
'metadata' => [
|
|
'groupDescription' => '',
|
|
'title' => $title,
|
|
],
|
|
'queryParameters' => [],
|
|
'urlParameters' => [],
|
|
'cleanBodyParameters' => [],
|
|
];
|
|
}
|
|
|
|
protected function createMockRouteGroup(array $routes, $groupName = 'Group')
|
|
{
|
|
return collect([$groupName => collect($routes)]);
|
|
}
|
|
}
|