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 }
|