209 lines
6.3 KiB
PHP
209 lines
6.3 KiB
PHP
|
<?php
|
||
|
|
||
|
use cebe\openapi\Reader;
|
||
|
use cebe\openapi\spec\OAuthFlow;
|
||
|
use cebe\openapi\spec\OAuthFlows;
|
||
|
use cebe\openapi\spec\SecurityRequirement;
|
||
|
use cebe\openapi\spec\SecurityScheme;
|
||
|
|
||
|
/**
|
||
|
* @covers \cebe\openapi\spec\SecurityScheme
|
||
|
* @covers \cebe\openapi\spec\OAuthFlows
|
||
|
* @covers \cebe\openapi\spec\OAuthFlow
|
||
|
* @covers \cebe\openapi\spec\SecurityRequirement
|
||
|
*/
|
||
|
class SecuritySchemeTest extends \PHPUnit\Framework\TestCase
|
||
|
{
|
||
|
public function testRead()
|
||
|
{
|
||
|
/** @var $securityScheme SecurityScheme */
|
||
|
$securityScheme = Reader::readFromYaml(<<<YAML
|
||
|
type: http
|
||
|
scheme: basic
|
||
|
YAML
|
||
|
, SecurityScheme::class);
|
||
|
|
||
|
$result = $securityScheme->validate();
|
||
|
$this->assertEquals([], $securityScheme->getErrors());
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$this->assertEquals('http', $securityScheme->type);
|
||
|
$this->assertEquals('basic', $securityScheme->scheme);
|
||
|
|
||
|
/** @var $securityScheme SecurityScheme */
|
||
|
$securityScheme = Reader::readFromYaml(<<<YAML
|
||
|
scheme: basic
|
||
|
YAML
|
||
|
, SecurityScheme::class);
|
||
|
|
||
|
$result = $securityScheme->validate();
|
||
|
$this->assertEquals(['SecurityScheme is missing required property: type'], $securityScheme->getErrors());
|
||
|
$this->assertFalse($result);
|
||
|
|
||
|
/** @var $securityScheme SecurityScheme */
|
||
|
$securityScheme = Reader::readFromYaml(<<<YAML
|
||
|
type: apiKey
|
||
|
YAML
|
||
|
, SecurityScheme::class);
|
||
|
|
||
|
$result = $securityScheme->validate();
|
||
|
$this->assertEquals([
|
||
|
'SecurityScheme is missing required property: name',
|
||
|
'SecurityScheme is missing required property: in',
|
||
|
], $securityScheme->getErrors());
|
||
|
$this->assertFalse($result);
|
||
|
|
||
|
/** @var $securityScheme SecurityScheme */
|
||
|
$securityScheme = Reader::readFromYaml(<<<YAML
|
||
|
type: http
|
||
|
YAML
|
||
|
, SecurityScheme::class);
|
||
|
|
||
|
$result = $securityScheme->validate();
|
||
|
$this->assertEquals([
|
||
|
'SecurityScheme is missing required property: scheme',
|
||
|
], $securityScheme->getErrors());
|
||
|
$this->assertFalse($result);
|
||
|
|
||
|
/** @var $securityScheme SecurityScheme */
|
||
|
$securityScheme = Reader::readFromYaml(<<<YAML
|
||
|
type: oauth2
|
||
|
YAML
|
||
|
, SecurityScheme::class);
|
||
|
|
||
|
$result = $securityScheme->validate();
|
||
|
$this->assertEquals([
|
||
|
'SecurityScheme is missing required property: flows',
|
||
|
], $securityScheme->getErrors());
|
||
|
$this->assertFalse($result);
|
||
|
|
||
|
/** @var $securityScheme SecurityScheme */
|
||
|
$securityScheme = Reader::readFromYaml(<<<YAML
|
||
|
type: openIdConnect
|
||
|
YAML
|
||
|
, SecurityScheme::class);
|
||
|
|
||
|
$result = $securityScheme->validate();
|
||
|
$this->assertEquals([
|
||
|
'SecurityScheme is missing required property: openIdConnectUrl',
|
||
|
], $securityScheme->getErrors());
|
||
|
$this->assertFalse($result);
|
||
|
}
|
||
|
|
||
|
public function testOAuth2()
|
||
|
{
|
||
|
/** @var $securityScheme SecurityScheme */
|
||
|
$securityScheme = Reader::readFromYaml(<<<YAML
|
||
|
type: oauth2
|
||
|
flows:
|
||
|
implicit:
|
||
|
authorizationUrl: https://example.com/api/oauth/dialog
|
||
|
YAML
|
||
|
, SecurityScheme::class);
|
||
|
|
||
|
$result = $securityScheme->validate();
|
||
|
$this->assertEquals([
|
||
|
'OAuthFlow is missing required property: scopes',
|
||
|
], $securityScheme->getErrors());
|
||
|
$this->assertFalse($result);
|
||
|
|
||
|
/** @var $securityScheme SecurityScheme */
|
||
|
$securityScheme = Reader::readFromYaml(<<<YAML
|
||
|
type: oauth2
|
||
|
flows:
|
||
|
implicit:
|
||
|
authorizationUrl: https://example.com/api/oauth/dialog
|
||
|
scopes:
|
||
|
write:pets: modify pets in your account
|
||
|
read:pets: read your pets
|
||
|
authorizationCode:
|
||
|
authorizationUrl: https://example.com/api/oauth/dialog
|
||
|
tokenUrl: https://example.com/api/oauth/token
|
||
|
scopes:
|
||
|
write:pets: modify pets in your account
|
||
|
read:pets: read your pets
|
||
|
YAML
|
||
|
, SecurityScheme::class);
|
||
|
|
||
|
$result = $securityScheme->validate();
|
||
|
$this->assertEquals([], $securityScheme->getErrors());
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$this->assertInstanceOf(OAuthFlows::class, $securityScheme->flows);
|
||
|
$this->assertInstanceOf(OAuthFlow::class, $securityScheme->flows->implicit);
|
||
|
$this->assertInstanceOf(OAuthFlow::class, $securityScheme->flows->authorizationCode);
|
||
|
$this->assertNull($securityScheme->flows->clientCredentials);
|
||
|
$this->assertNull($securityScheme->flows->password);
|
||
|
|
||
|
$this->assertEquals('https://example.com/api/oauth/dialog', $securityScheme->flows->implicit->authorizationUrl);
|
||
|
$this->assertEquals([
|
||
|
'write:pets' => 'modify pets in your account',
|
||
|
'read:pets' => 'read your pets',
|
||
|
], $securityScheme->flows->implicit->scopes);
|
||
|
}
|
||
|
|
||
|
public function testSecurityRequirement()
|
||
|
{
|
||
|
/** @var $securityRequirement SecurityRequirement */
|
||
|
$securityRequirement = Reader::readFromYaml(<<<YAML
|
||
|
api_key: []
|
||
|
YAML
|
||
|
, SecurityRequirement::class);
|
||
|
|
||
|
$result = $securityRequirement->validate();
|
||
|
$this->assertEquals([], $securityRequirement->getErrors());
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$this->assertSame([], $securityRequirement->api_key);
|
||
|
|
||
|
/** @var $securityRequirement SecurityRequirement */
|
||
|
$securityRequirement = Reader::readFromYaml(<<<YAML
|
||
|
petstore_auth:
|
||
|
- write:pets
|
||
|
- read:pets
|
||
|
YAML
|
||
|
, SecurityRequirement::class);
|
||
|
|
||
|
$result = $securityRequirement->validate();
|
||
|
$this->assertEquals([], $securityRequirement->getErrors());
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$this->assertSame(['write:pets', 'read:pets'], $securityRequirement->petstore_auth);
|
||
|
}
|
||
|
|
||
|
public function testDefaultSecurity()
|
||
|
{
|
||
|
$openapi = Reader::readFromYaml(<<<YAML
|
||
|
paths:
|
||
|
/path/one:
|
||
|
post:
|
||
|
description: path one
|
||
|
# [...]
|
||
|
security: [] # default security
|
||
|
|
||
|
/path/two:
|
||
|
post:
|
||
|
description: path two
|
||
|
# [...]
|
||
|
# No security entry defined there
|
||
|
|
||
|
components:
|
||
|
securitySchemes:
|
||
|
Bearer:
|
||
|
type: http
|
||
|
scheme: bearer
|
||
|
bearerFormat: JWT
|
||
|
|
||
|
security:
|
||
|
- Bearer: []
|
||
|
YAML
|
||
|
);
|
||
|
|
||
|
$this->assertSame([], $openapi->paths->getPath('/path/one')->post->security);
|
||
|
$this->assertSame(null, $openapi->paths->getPath('/path/two')->post->security);
|
||
|
|
||
|
$this->assertCount(1, $openapi->security);
|
||
|
$this->assertSame([], $openapi->security[0]->Bearer);
|
||
|
}
|
||
|
}
|