View source
<?php
namespace Drupal\Tests\apigee_api_catalog\Functional;
use Drupal\apigee_api_catalog\Entity\ApiDoc;
use Drupal\Component\Serialization\Json;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Url;
use Drupal\Tests\BrowserTestBase;
use GuzzleHttp\RequestOptions;
class ApiDocsJsonApi extends BrowserTestBase {
public static $modules = [
'apigee_api_catalog',
'jsonapi',
'basic_auth',
];
protected $apidocPublished;
protected $apidocUnpublished;
protected function setUp() {
parent::setUp();
$apidoc_published = ApiDoc::create([
'name' => 'Published',
'description' => 'Published API',
'spec' => NULL,
'status' => 1,
]);
$apidoc_published
->save();
$this->apidocPublished = $apidoc_published;
$apidoc_unpublished = ApiDoc::create([
'name' => 'Unpublished',
'description' => 'Unpublished API',
'spec' => NULL,
'status' => 0,
]);
$apidoc_unpublished
->save();
$this->apidocUnpublished = $apidoc_unpublished;
}
public function testListAdminAccess() {
$account = $this
->drupalCreateUser([
'administer apigee api catalog',
]);
$this
->drupalLogin($account);
$collection_url = Url::fromRoute('jsonapi.apidoc--apidoc.collection')
->setAbsolute(TRUE)
->toString();
$this
->verifyAccess($account, [
$this->apidocPublished,
$this->apidocUnpublished,
], $collection_url);
}
public function testFilterAdminAccess() {
$account = $this
->drupalCreateUser([
'administer apigee api catalog',
]);
$this
->drupalLogin($account);
$collection_url = Url::fromRoute('jsonapi.apidoc--apidoc.collection')
->setAbsolute(TRUE)
->toString();
$url = "{$collection_url}?filter[name]=Published";
$this
->verifyAccess($account, [
$this->apidocPublished,
], $url);
$url = "{$collection_url}?filter[name]=Unpublished";
$this
->verifyAccess($account, [
$this->apidocUnpublished,
], $url);
}
public function testFilterViewAccessViewPublished() {
$account = $this
->drupalCreateUser([
'view published apidoc entities',
]);
$this
->drupalLogin($account);
$collection_url = Url::fromRoute('jsonapi.apidoc--apidoc.collection')
->setAbsolute(TRUE)
->toString();
$url = "{$collection_url}?filter[name]=Published";
$this
->verifyAccess($account, [
$this->apidocPublished,
], $url);
}
public function testFilterViewPublishedWithViewPublishedAndUnpublishedPermissions() {
$account = $this
->drupalCreateUser([
'view published apidoc entities',
'view unpublished apidoc entities',
]);
$this
->drupalLogin($account);
$collection_url = Url::fromRoute('jsonapi.apidoc--apidoc.collection')
->setAbsolute(TRUE)
->toString();
$url = "{$collection_url}?filter[name]=Published";
$this
->verifyAccess($account, [
$this->apidocPublished,
], $url);
}
public function testFilterViewUnpublishedWithViewPublishedAndUnpublishedPermissions() {
$account = $this
->drupalCreateUser([
'view published apidoc entities',
'view unpublished apidoc entities',
]);
$this
->drupalLogin($account);
$collection_url = Url::fromRoute('jsonapi.apidoc--apidoc.collection')
->setAbsolute(TRUE)
->toString();
$url = "{$collection_url}?filter[name]=Unpublished";
$this
->verifyAccess($account, [
$this->apidocUnpublished,
], $url);
}
protected function getAuthenticationRequestOptions($account) {
return [
'headers' => [
'Authorization' => 'Basic ' . base64_encode($account->name->value . ':' . $account->passRaw),
],
];
}
protected function verifyAccess(AccountInterface $account, array $apidocs_expected, string $url, array $request_options = []) {
$request_options[RequestOptions::HEADERS]['Accept'] = 'application/vnd.api+json';
$request_options = NestedArray::mergeDeep($request_options, $this
->getAuthenticationRequestOptions($account));
$client = $this
->getSession()
->getDriver()
->getClient()
->getClient();
$response = $client
->request('GET', $url, $request_options);
$this
->assertSame([
'application/vnd.api+json',
], $response
->getHeader('Content-Type'));
$response_document = Json::decode((string) $response
->getBody());
$apidocs_response = $response_document['data'];
$names = [];
foreach ($apidocs_response as $apidoc) {
$names[] = $apidoc['attributes']['name'];
}
usort($apidocs_expected, function ($a, $b) {
return strcmp($a
->getName(), $b
->getName());
});
usort($apidocs_response, function ($a, $b) {
return strcmp($a['attributes']['name'], $b['attributes']['name']);
});
for ($i = 0; $i < count($apidocs_response); $i++) {
$this
->assertEqual($apidocs_expected[$i]
->getName(), $apidocs_response[$i]['attributes']['name']);
}
$this
->assertCount(count($apidocs_expected), $apidocs_response, 'Count of API Docs returned does not match count of expected.');
}
}