View source
<?php
namespace Drupal\Tests\acquia_contenthub\Functional;
use Drupal\Component\Serialization\Json;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\node\NodeInterface;
class IntegrationTest extends ContentHubTestBase {
use StringTranslationTrait;
public static $modules = [
'node',
'acquia_contenthub',
'field',
'field_test_boolean_access_denied',
];
protected $article;
protected $unpublishedArticle;
protected $page;
protected $adminRole;
protected $limitedRole;
protected $fieldStorage;
protected $field;
protected $defaultTheme = 'stark';
public function setUp() : void {
parent::setUp();
$this->adminRole = $this
->createAdminRole();
$this->limitedRole = $this
->createRole([
'access content',
]);
$this->fieldStorage = FieldStorageConfig::create([
'field_name' => 'test_field_01',
'entity_type' => 'node',
'type' => 'boolean',
]);
$this->fieldStorage
->save();
$this->field = FieldConfig::create([
'field_name' => 'test_field_01',
'entity_type' => 'node',
'bundle' => 'article',
'label' => 'Test',
'required' => TRUE,
'settings' => [
'on_label' => 'field_test_01_on',
'off_label' => 'field_test_01_off',
],
]);
$this->field
->save();
\Drupal::service('entity_display.repository')
->getViewDisplay('node', 'article', 'full')
->setComponent('test_field_01', [
'type' => 'boolean',
])
->save();
\Drupal::service('entity_display.repository')
->getViewDisplay('node', 'article', 'teaser')
->setComponent('test_field_01', [
'type' => 'boolean',
])
->save();
}
public function testFramework() {
$this->dumpHeaders = TRUE;
$this
->drupalLogin($this->adminUser);
$this
->createSampleContent();
$this
->configureContentHubContentTypes('node', [
'article',
]);
$this
->checkCdfOutput($this->article);
$this
->setRoleFor(AccountInterface::ANONYMOUS_ROLE);
$this
->checkCdfAccess($this->article);
$this
->checkCdfFormat($this->article);
$this
->setRoleFor($this->limitedRole);
$this
->checkCdfAccess($this->article);
$this
->setRoleFor($this->adminRole);
$this
->checkCdfAccess($this->article);
$this
->setRoleFor(AccountInterface::ANONYMOUS_ROLE);
$this
->checkCdfAccess($this->unpublishedArticle, FALSE);
$this
->setRoleFor($this->limitedRole);
$visible_roles = $this
->getUserWarningRole();
$this
->assertFalse(array_key_exists($this->limitedRole, $visible_roles), 'The role warning message absent');
$this
->checkCdfAccess($this->unpublishedArticle, FALSE);
$this
->setRoleFor($this->adminRole);
$visible_roles = $this
->getUserWarningRole();
$this
->assertTrue(array_key_exists($this->adminRole, $visible_roles), 'The role warning message present');
$this
->checkCdfAccess($this->unpublishedArticle);
$this
->setRoleFor(AccountInterface::ANONYMOUS_ROLE);
$this
->checkCdfFieldAccess($this->article);
$this
->setRoleFor(AccountInterface::ANONYMOUS_ROLE);
$this
->checkCdfFieldAccess($this->article, FALSE, FALSE);
$this
->setRoleFor($this->adminRole);
$this
->checkCdfFieldAccess($this->article);
$this
->setRoleFor($this->adminRole);
$this
->checkCdfFieldAccess($this->article, FALSE, FALSE);
$this
->setRoleFor(AccountInterface::ANONYMOUS_ROLE);
$this
->enableViewModeFor('node', 'article', 'teaser');
$this
->checkCdfOutput($this->article, 'teaser');
$this
->ConfigureAndUsePreviewImageStyle();
$this
->checkAccessViewMode($this->article, 'teaser', TRUE);
$this
->drupalGet("acquia-contenthub/display/node/{$this->unpublishedArticle->id()}/teaser");
$this
->assertSession()
->statusCodeEquals(200);
$this
->assertNoText($this->unpublishedArticle
->label(), 'An unpublished content should not be rendered for admin user if anonymous role selected');
$this
->setRoleFor(AccountInterface::ANONYMOUS_ROLE);
$this
->checkFieldAccessViewMode($this->article, 'teaser');
$this
->checkCdfMarkup($this->article);
$this
->setRoleFor(AccountInterface::ANONYMOUS_ROLE);
$this
->checkFieldAccessViewMode($this->article, 'teaser', FALSE, FALSE);
$this
->setRoleFor($this->adminRole);
$this
->checkFieldAccessViewMode($this->article, 'teaser');
$this
->setRoleFor($this->adminRole);
$this
->checkFieldAccessViewMode($this->article, 'teaser', FALSE, FALSE);
$this
->setRoleFor($this->adminRole);
$this
->checkAccessViewMode($this->article, 'teaser', TRUE);
$this
->checkAccessViewMode($this->unpublishedArticle, 'teaser', TRUE);
$this
->drupalLogout();
$this
->checkAccessViewMode($this->article, 'teaser', FALSE);
$this
->checkAccessViewMode($this->unpublishedArticle, 'teaser', FALSE);
}
public function checkCdfAccess(NodeInterface $entity, $access = TRUE) {
$output = $this
->drupalGetCdf('acquia-contenthub-cdf/' . $entity
->getEntityTypeId() . '/' . $entity
->id());
$this
->assertSession()
->statusCodeEquals(200);
if ($access) {
$this
->assertTrue(isset($output['entities']['0']), 'CDF is present');
}
else {
$this
->assertFalse(isset($output['entities']['0']), 'CDF is not present');
}
}
public function checkCdfFormat(NodeInterface $entity) {
$output = $this
->drupalGetCdf('acquia-contenthub-cdf/' . $entity
->getEntityTypeId() . '/' . $entity
->id());
$this
->assertSession()
->statusCodeEquals(200, 'Accept acquia_contenthub_cdf format.');
$this
->assertEquals($output['entities']['0']['uuid'], $entity
->uuid(), 'CDF is present for acquia_contenthub_cdf format.');
$output = $this
->drupalGetWithFormat('acquia-contenthub-cdf/' . $entity
->getEntityTypeId() . '/' . $entity
->id(), 'html');
$output = Json::decode($output);
$this
->assertSession()
->statusCodeEquals(200, 'Accept html format (browser default).');
$this
->assertEquals($output['entities']['0']['uuid'], $entity
->uuid(), 'CDF is present for html format.');
$output = $this
->drupalGetWithFormat('acquia-contenthub-cdf/' . $entity
->getEntityTypeId() . '/' . $entity
->id(), 'json');
$output = Json::decode($output);
$this
->assertSession()
->statusCodeEquals(200, 'Accept json format.');
$this
->assertEquals($output['entities']['0']['uuid'], $entity
->uuid(), 'CDF is present for json format.');
$output = $this
->drupalGet('acquia-contenthub-cdf/' . $entity
->getEntityTypeId() . '/' . $entity
->id());
$output = Json::decode($output);
$this
->assertSession()
->statusCodeEquals(200, 'Accept default format (json is default for tests).');
$this
->assertEquals($output['entities']['0']['uuid'], $entity
->uuid(), 'CDF is present for default format.');
$this
->drupalGetWithFormat('acquia-contenthub-cdf/' . $entity
->getEntityTypeId() . '/' . $entity
->id(), 'xml');
$this
->assertSession()
->statusCodeEquals(406, 'A 406 response was returned when XML was requested.');
}
public function checkCdfMarkup(NodeInterface $entity) {
$this
->enableViewModeFor('node', 'article', [
'default',
'full',
'teaser',
]);
$output = $this
->drupalGetCdf('acquia-contenthub-cdf/' . $entity
->getEntityTypeId() . '/' . $entity
->id());
$dialog_off_canvas_openning = floatval(\Drupal::VERSION) <= 8.4 ? '' : '<div class="dialog-off-canvas-main-canvas" data-off-canvas-main-canvas>';
$dialog_off_canvas_closing = floatval(\Drupal::VERSION) <= 8.4 ? '' : '</div>';
$this
->setRawContent($output['entities'][0]['metadata']['view_modes']['default']['html']);
$this
->removeWhiteSpace();
$expected = '</head><body>' . $dialog_off_canvas_openning . '<article role="article" class="node node--type-article node--promoted node--view-mode-default"><h2><a href="/node/1" rel="bookmark"><span class="field field--name-title field--type-string field--label-hidden">';
$this
->assertRaw($expected, 'Default view mode have no extra markup.');
$expected = '</article>' . $dialog_off_canvas_closing . '<div data-content-barrier-exclude="true"></div></body></html>';
$this
->assertRaw($expected, 'Default view mode footer JS is wrapped into div with data-content-barrier-exclude attribute.');
$this
->setRawContent($output['entities'][0]['metadata']['view_modes']['full']['html']);
$this
->removeWhiteSpace();
$expected = '</head><body>' . $dialog_off_canvas_openning . '<article role="article" class="node node--type-article node--promoted node--view-mode-full"><h2><a href="/node/1" rel="bookmark"><span class="field field--name-title field--type-string field--label-hidden">';
$this
->assertRaw($expected, 'Full view mode have no extra markup.');
$expected = '</article>' . $dialog_off_canvas_closing . '<div data-content-barrier-exclude="true"></div></body></html>';
$this
->assertRaw($expected, 'Full view mode footer JS is wrapped into div with data-content-barrier-exclude attribute.');
$this
->setRawContent($output['entities'][0]['metadata']['view_modes']['teaser']['html']);
$this
->removeWhiteSpace();
$expected = '</head><body>' . $dialog_off_canvas_openning . '<article role="article" class="node node--type-article node--promoted node--view-mode-teaser"><h2><a href="/node/1" rel="bookmark"><span class="field field--name-title field--type-string field--label-hidden">';
$this
->assertRaw($expected, 'Teaser view mode have no extra markup.');
$expected = '</article>' . $dialog_off_canvas_closing . '<div data-content-barrier-exclude="true"></div></body></html>';
$this
->assertRaw($expected, 'Teaser view mode footer JS is wrapped into div with data-content-barrier-exclude attribute.');
$this
->enableViewModeFor('node', 'article', 'teaser');
}
public function checkCdfFieldAccess(NodeInterface $entity, $access = TRUE, $field_access = TRUE) {
\Drupal::state()
->set('field.test_boolean_field_access_field', $field_access ? '' : 'test_field_01');
$output = $this
->drupalGetCdf('acquia-contenthub-cdf/' . $entity
->getEntityTypeId() . '/' . $entity
->id());
$this
->assertSession()
->statusCodeEquals(200);
if ($access) {
$this
->assertTrue(isset($output['entities']['0']['attributes']['test_field_01']), 'Test Field is present');
}
else {
$this
->assertFalse(isset($output['entities']['0']['attributes']['test_field_01']), 'Test Field is not present');
}
}
public function createSampleContent() {
$this->article = $this
->drupalCreateNode([
'type' => 'article',
'test_field_01' => [
'value' => 1,
],
]);
$this->page = $this
->drupalCreateNode([
'type' => 'page',
]);
$this->unpublishedArticle = $this
->drupalCreateNode([
'type' => 'article',
'status' => FALSE,
]);
}
public function checkCdfOutput(NodeInterface $entity, $view_mode = NULL) {
$output = $this
->drupalGetCdf('acquia-contenthub-cdf/' . $entity
->getEntityTypeId() . '/' . $entity
->id());
$this
->assertSession()
->statusCodeEquals(200);
if (!empty($view_mode)) {
$this
->assertTrue(isset($output['entities']['0']['metadata']), 'Metadata is present');
$this
->assertTrue(isset($output['entities']['0']['metadata']['view_modes'][$view_mode]), $this
->t('View mode %view_mode is present', [
'%view_mode' => $view_mode,
]));
}
else {
$this
->assertFalse(isset($output['entities']['0']['metadata']), 'Metadata is not present');
}
}
public function configureAndUsePreviewImageStyle() {
$this
->drupalGet('admin/config/services/acquia-contenthub/configuration');
$this
->assertRaw('admin/structure/types/manage/article#edit-acquia-contenthub', 'Preview image shortcut links exist on the page.');
$this
->drupalGet('admin/structure/types/manage/article');
$this
->assertText($this
->t('Acquia Content Hub'));
}
public function checkAccessViewMode(NodeInterface $entity, $view_mode, $access = TRUE) {
$this
->drupalGet("acquia-contenthub/display/node/{$entity->id()}/{$view_mode}");
if ($access) {
$this
->assertSession()
->statusCodeEquals(200);
$this
->assertText($entity
->label());
}
else {
$this
->assertSession()
->statusCodeEquals(403);
}
}
public function checkFieldAccessViewMode(NodeInterface $entity, $view_mode, $access = TRUE, $field_access = TRUE) {
\Drupal::state()
->set('field.test_boolean_field_access_field', $field_access ? '' : 'test_field_01');
$this
->drupalGet("acquia-contenthub/display/node/{$entity->id()}/{$view_mode}");
$this
->assertSession()
->statusCodeEquals(200);
if ($access) {
$this
->assertText('field_test_01_on');
}
else {
$this
->assertNoText('field_test_01_on');
}
}
public function getUserWarningRole() {
$markup = $this
->xpath('//div[@id="user-warning-role"]');
$states = (array) json_decode($markup[0]['data-drupal-states']);
$visible_roles = [];
if (isset($states['visible'])) {
foreach ($states['visible'] as $state) {
$visible_role = (array) $state;
$visible_roles[] = $visible_role[':input[name="user_role"]']->value;
}
return array_flip($visible_roles);
}
return [];
}
}