annotate core/modules/jsonapi/tests/src/Functional/BlockTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
Chris@18 1 <?php
Chris@18 2
Chris@18 3 namespace Drupal\Tests\jsonapi\Functional;
Chris@18 4
Chris@18 5 use Drupal\block\Entity\Block;
Chris@18 6 use Drupal\Core\Session\AccountInterface;
Chris@18 7 use Drupal\Core\Url;
Chris@18 8
Chris@18 9 /**
Chris@18 10 * JSON:API integration test for the "Block" config entity type.
Chris@18 11 *
Chris@18 12 * @group jsonapi
Chris@18 13 */
Chris@18 14 class BlockTest extends ResourceTestBase {
Chris@18 15
Chris@18 16 /**
Chris@18 17 * {@inheritdoc}
Chris@18 18 */
Chris@18 19 public static $modules = ['block'];
Chris@18 20
Chris@18 21 /**
Chris@18 22 * {@inheritdoc}
Chris@18 23 */
Chris@18 24 protected static $entityTypeId = 'block';
Chris@18 25
Chris@18 26 /**
Chris@18 27 * {@inheritdoc}
Chris@18 28 */
Chris@18 29 protected static $resourceTypeName = 'block--block';
Chris@18 30
Chris@18 31 /**
Chris@18 32 * {@inheritdoc}
Chris@18 33 *
Chris@18 34 * @var \Drupal\block\BlockInterface
Chris@18 35 */
Chris@18 36 protected $entity;
Chris@18 37
Chris@18 38 /**
Chris@18 39 * {@inheritdoc}
Chris@18 40 */
Chris@18 41 protected function setUpAuthorization($method) {
Chris@18 42 switch ($method) {
Chris@18 43 case 'GET':
Chris@18 44 $this->entity->setVisibilityConfig('user_role', [])->save();
Chris@18 45 break;
Chris@18 46 }
Chris@18 47 }
Chris@18 48
Chris@18 49 /**
Chris@18 50 * {@inheritdoc}
Chris@18 51 */
Chris@18 52 protected function createEntity() {
Chris@18 53 $block = Block::create([
Chris@18 54 'plugin' => 'llama_block',
Chris@18 55 'region' => 'header',
Chris@18 56 'id' => 'llama',
Chris@18 57 'theme' => 'classy',
Chris@18 58 ]);
Chris@18 59 // All blocks can be viewed by the anonymous user by default. An interesting
Chris@18 60 // side effect of this is that any anonymous user is also able to read the
Chris@18 61 // corresponding block config entity via REST, even if an authentication
Chris@18 62 // provider is configured for the block config entity REST resource! In
Chris@18 63 // other words: Block entities do not distinguish between 'view' as in
Chris@18 64 // "render on a page" and 'view' as in "read the configuration".
Chris@18 65 // This prevents that.
Chris@18 66 // @todo Fix this in https://www.drupal.org/node/2820315.
Chris@18 67 $block->setVisibilityConfig('user_role', [
Chris@18 68 'id' => 'user_role',
Chris@18 69 'roles' => ['non-existing-role' => 'non-existing-role'],
Chris@18 70 'negate' => FALSE,
Chris@18 71 'context_mapping' => [
Chris@18 72 'user' => '@user.current_user_context:current_user',
Chris@18 73 ],
Chris@18 74 ]);
Chris@18 75 $block->save();
Chris@18 76
Chris@18 77 return $block;
Chris@18 78 }
Chris@18 79
Chris@18 80 /**
Chris@18 81 * {@inheritdoc}
Chris@18 82 */
Chris@18 83 protected function getExpectedDocument() {
Chris@18 84 $self_url = Url::fromUri('base:/jsonapi/block/block/' . $this->entity->uuid())->setAbsolute()->toString(TRUE)->getGeneratedUrl();
Chris@18 85 return [
Chris@18 86 'jsonapi' => [
Chris@18 87 'meta' => [
Chris@18 88 'links' => [
Chris@18 89 'self' => ['href' => 'http://jsonapi.org/format/1.0/'],
Chris@18 90 ],
Chris@18 91 ],
Chris@18 92 'version' => '1.0',
Chris@18 93 ],
Chris@18 94 'links' => [
Chris@18 95 'self' => ['href' => $self_url],
Chris@18 96 ],
Chris@18 97 'data' => [
Chris@18 98 'id' => $this->entity->uuid(),
Chris@18 99 'type' => 'block--block',
Chris@18 100 'links' => [
Chris@18 101 'self' => ['href' => $self_url],
Chris@18 102 ],
Chris@18 103 'attributes' => [
Chris@18 104 'weight' => NULL,
Chris@18 105 'langcode' => 'en',
Chris@18 106 'status' => TRUE,
Chris@18 107 'dependencies' => [
Chris@18 108 'theme' => [
Chris@18 109 'classy',
Chris@18 110 ],
Chris@18 111 ],
Chris@18 112 'theme' => 'classy',
Chris@18 113 'region' => 'header',
Chris@18 114 'provider' => NULL,
Chris@18 115 'plugin' => 'llama_block',
Chris@18 116 'settings' => [
Chris@18 117 'id' => 'broken',
Chris@18 118 'label' => '',
Chris@18 119 'provider' => 'core',
Chris@18 120 'label_display' => 'visible',
Chris@18 121 ],
Chris@18 122 'visibility' => [],
Chris@18 123 'drupal_internal__id' => 'llama',
Chris@18 124 ],
Chris@18 125 ],
Chris@18 126 ];
Chris@18 127 }
Chris@18 128
Chris@18 129 /**
Chris@18 130 * {@inheritdoc}
Chris@18 131 */
Chris@18 132 protected function getPostDocument() {
Chris@18 133 // @todo Update once https://www.drupal.org/node/2300677 is fixed.
Chris@18 134 }
Chris@18 135
Chris@18 136 /**
Chris@18 137 * {@inheritdoc}
Chris@18 138 */
Chris@18 139 protected function getExpectedCacheContexts(array $sparse_fieldset = NULL) {
Chris@18 140 // @see ::createEntity()
Chris@18 141 return array_values(array_diff(parent::getExpectedCacheContexts(), ['user.permissions']));
Chris@18 142 }
Chris@18 143
Chris@18 144 /**
Chris@18 145 * {@inheritdoc}
Chris@18 146 */
Chris@18 147 protected function getExpectedCacheTags(array $sparse_fieldset = NULL) {
Chris@18 148 // Because the 'user.permissions' cache context is missing, the cache tag
Chris@18 149 // for the anonymous user role is never added automatically.
Chris@18 150 return array_values(array_diff(parent::getExpectedCacheTags(), ['config:user.role.anonymous']));
Chris@18 151 }
Chris@18 152
Chris@18 153 /**
Chris@18 154 * {@inheritdoc}
Chris@18 155 */
Chris@18 156 protected function getExpectedUnauthorizedAccessMessage($method) {
Chris@18 157 switch ($method) {
Chris@18 158 case 'GET':
Chris@18 159 return "The block visibility condition 'user_role' denied access.";
Chris@18 160
Chris@18 161 default:
Chris@18 162 return parent::getExpectedUnauthorizedAccessMessage($method);
Chris@18 163 }
Chris@18 164 }
Chris@18 165
Chris@18 166 /**
Chris@18 167 * {@inheritdoc}
Chris@18 168 */
Chris@18 169 protected function getExpectedUnauthorizedAccessCacheability() {
Chris@18 170 // @see \Drupal\block\BlockAccessControlHandler::checkAccess()
Chris@18 171 return parent::getExpectedUnauthorizedAccessCacheability()
Chris@18 172 ->setCacheTags([
Chris@18 173 '4xx-response',
Chris@18 174 'config:block.block.llama',
Chris@18 175 'http_response',
Chris@18 176 'user:2',
Chris@18 177 ])
Chris@18 178 ->setCacheContexts(['url.site', 'user.roles']);
Chris@18 179 }
Chris@18 180
Chris@18 181 /**
Chris@18 182 * {@inheritdoc}
Chris@18 183 */
Chris@18 184 protected static function getExpectedCollectionCacheability(AccountInterface $account, array $collection, array $sparse_fieldset = NULL, $filtered = FALSE) {
Chris@18 185 return parent::getExpectedCollectionCacheability($account, $collection, $sparse_fieldset, $filtered)
Chris@18 186 ->addCacheTags(['user:2'])
Chris@18 187 ->addCacheContexts(['user.roles']);
Chris@18 188 }
Chris@18 189
Chris@18 190 }