Mercurial > hg > isophonics-drupal-site
comparison core/modules/rdf/tests/src/Functional/CommentAttributesTest.php @ 16:c2387f117808
Routine composer update
author | Chris Cannam |
---|---|
date | Tue, 10 Jul 2018 15:07:59 +0100 |
parents | |
children | af1871eacc83 |
comparison
equal
deleted
inserted
replaced
15:e200cb7efeb3 | 16:c2387f117808 |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\Tests\rdf\Functional; | |
4 | |
5 use Drupal\comment\CommentInterface; | |
6 use Drupal\comment\CommentManagerInterface; | |
7 use Drupal\Tests\comment\Functional\CommentTestBase; | |
8 use Drupal\user\RoleInterface; | |
9 use Drupal\comment\Entity\Comment; | |
10 | |
11 /** | |
12 * Tests the RDFa markup of comments. | |
13 * | |
14 * @group rdf | |
15 */ | |
16 class CommentAttributesTest extends CommentTestBase { | |
17 | |
18 /** | |
19 * Modules to enable. | |
20 * | |
21 * @var array | |
22 */ | |
23 public static $modules = ['views', 'node', 'comment', 'rdf']; | |
24 | |
25 /** | |
26 * URI of the front page of the Drupal site. | |
27 * | |
28 * @var string | |
29 */ | |
30 protected $baseUri; | |
31 | |
32 /** | |
33 * URI of the test node created by CommentTestBase::setUp(). | |
34 * | |
35 * @var string | |
36 */ | |
37 protected $nodeUri; | |
38 | |
39 protected function setUp() { | |
40 parent::setUp(); | |
41 | |
42 // Enables anonymous user comments. | |
43 user_role_change_permissions(RoleInterface::ANONYMOUS_ID, [ | |
44 'access comments' => TRUE, | |
45 'post comments' => TRUE, | |
46 'skip comment approval' => TRUE, | |
47 ]); | |
48 // Allows anonymous to leave their contact information. | |
49 $this->setCommentAnonymous(COMMENT_ANONYMOUS_MAY_CONTACT); | |
50 $this->setCommentPreview(DRUPAL_OPTIONAL); | |
51 $this->setCommentForm(TRUE); | |
52 $this->setCommentSubject(TRUE); | |
53 $this->setCommentSettings('comment_default_mode', CommentManagerInterface::COMMENT_MODE_THREADED, 'Comment paging changed.'); | |
54 | |
55 // Prepares commonly used URIs. | |
56 $this->baseUri = \Drupal::url('<front>', [], ['absolute' => TRUE]); | |
57 $this->nodeUri = $this->node->url('canonical', ['absolute' => TRUE]); | |
58 | |
59 // Set relation between node and comment. | |
60 $article_mapping = rdf_get_mapping('node', 'article'); | |
61 $comment_count_mapping = [ | |
62 'properties' => ['sioc:num_replies'], | |
63 'datatype' => 'xsd:integer', | |
64 'datatype_callback' => ['callable' => 'Drupal\rdf\CommonDataConverter::rawValue'], | |
65 ]; | |
66 $article_mapping->setFieldMapping('comment_count', $comment_count_mapping)->save(); | |
67 | |
68 // Save user mapping. | |
69 $user_mapping = rdf_get_mapping('user', 'user'); | |
70 $username_mapping = [ | |
71 'properties' => ['foaf:name'], | |
72 ]; | |
73 $user_mapping->setFieldMapping('name', $username_mapping)->save(); | |
74 $user_mapping->setFieldMapping('homepage', ['properties' => ['foaf:page'], 'mapping_type' => 'rel'])->save(); | |
75 | |
76 // Save comment mapping. | |
77 $mapping = rdf_get_mapping('comment', 'comment'); | |
78 $mapping->setBundleMapping(['types' => ['sioc:Post', 'sioct:Comment']])->save(); | |
79 $field_mappings = [ | |
80 'subject' => [ | |
81 'properties' => ['dc:title'], | |
82 ], | |
83 'created' => [ | |
84 'properties' => ['dc:date', 'dc:created'], | |
85 'datatype' => 'xsd:dateTime', | |
86 'datatype_callback' => ['callable' => 'Drupal\rdf\CommonDataConverter::dateIso8601Value'], | |
87 ], | |
88 'changed' => [ | |
89 'properties' => ['dc:modified'], | |
90 'datatype' => 'xsd:dateTime', | |
91 'datatype_callback' => ['callable' => 'Drupal\rdf\CommonDataConverter::dateIso8601Value'], | |
92 ], | |
93 'comment_body' => [ | |
94 'properties' => ['content:encoded'], | |
95 ], | |
96 'pid' => [ | |
97 'properties' => ['sioc:reply_of'], | |
98 'mapping_type' => 'rel', | |
99 ], | |
100 'uid' => [ | |
101 'properties' => ['sioc:has_creator'], | |
102 'mapping_type' => 'rel', | |
103 ], | |
104 'name' => [ | |
105 'properties' => ['foaf:name'], | |
106 ], | |
107 ]; | |
108 // Iterate over shared field mappings and save. | |
109 foreach ($field_mappings as $field_name => $field_mapping) { | |
110 $mapping->setFieldMapping($field_name, $field_mapping)->save(); | |
111 } | |
112 } | |
113 | |
114 /** | |
115 * Tests the presence of the RDFa markup for the number of comments. | |
116 */ | |
117 public function testNumberOfCommentsRdfaMarkup() { | |
118 // Posts 2 comments on behalf of registered user. | |
119 $this->saveComment($this->node->id(), $this->webUser->id()); | |
120 $this->saveComment($this->node->id(), $this->webUser->id()); | |
121 | |
122 // Tests number of comments in teaser view. | |
123 $this->drupalLogin($this->webUser); | |
124 $parser = new \EasyRdf_Parser_Rdfa(); | |
125 $graph = new \EasyRdf_Graph(); | |
126 $parser->parse($graph, $this->drupalGet('node'), 'rdfa', $this->baseUri); | |
127 | |
128 // Number of comments. | |
129 $expected_value = [ | |
130 'type' => 'literal', | |
131 'value' => 2, | |
132 'datatype' => 'http://www.w3.org/2001/XMLSchema#integer', | |
133 ]; | |
134 $this->assertTrue($graph->hasProperty($this->nodeUri, 'http://rdfs.org/sioc/ns#num_replies', $expected_value), 'Number of comments found in RDF output of teaser view (sioc:num_replies).'); | |
135 | |
136 // Tests number of comments in full node view, expected value is the same. | |
137 $parser = new \EasyRdf_Parser_Rdfa(); | |
138 $graph = new \EasyRdf_Graph(); | |
139 $parser->parse($graph, $this->drupalGet('node/' . $this->node->id()), 'rdfa', $this->baseUri); | |
140 $this->assertTrue($graph->hasProperty($this->nodeUri, 'http://rdfs.org/sioc/ns#num_replies', $expected_value), 'Number of comments found in RDF output of full node view mode (sioc:num_replies).'); | |
141 } | |
142 | |
143 /** | |
144 * Tests comment author link markup has not been broken by RDF. | |
145 */ | |
146 public function testCommentRdfAuthorMarkup() { | |
147 // Post a comment as a registered user. | |
148 $this->saveComment($this->node->id(), $this->webUser->id()); | |
149 | |
150 // Give the user access to view user profiles so the profile link shows up. | |
151 user_role_grant_permissions(RoleInterface::AUTHENTICATED_ID, ['access user profiles']); | |
152 $this->drupalLogin($this->webUser); | |
153 | |
154 // Ensure that the author link still works properly after the author output | |
155 // is modified by the RDF module. | |
156 $this->drupalGet('node/' . $this->node->id()); | |
157 $this->assertLink($this->webUser->getUsername()); | |
158 $this->assertLinkByHref('user/' . $this->webUser->id()); | |
159 } | |
160 | |
161 /** | |
162 * Tests if RDFa markup for meta information is present in comments. | |
163 * | |
164 * Tests presence of RDFa markup for the title, date and author and homepage | |
165 * on comments from registered and anonymous users. | |
166 */ | |
167 public function testCommentRdfaMarkup() { | |
168 // Posts comment #1 on behalf of registered user. | |
169 $comment1 = $this->saveComment($this->node->id(), $this->webUser->id()); | |
170 | |
171 // Tests comment #1 with access to the user profile. | |
172 $this->drupalLogin($this->webUser); | |
173 $parser = new \EasyRdf_Parser_Rdfa(); | |
174 $graph = new \EasyRdf_Graph(); | |
175 $parser->parse($graph, $this->drupalGet('node/' . $this->node->id()), 'rdfa', $this->baseUri); | |
176 $this->_testBasicCommentRdfaMarkup($graph, $comment1); | |
177 | |
178 // Tests comment #1 with no access to the user profile (as anonymous user). | |
179 $this->drupalLogout(); | |
180 $parser = new \EasyRdf_Parser_Rdfa(); | |
181 $graph = new \EasyRdf_Graph(); | |
182 $parser->parse($graph, $this->drupalGet('node/' . $this->node->id()), 'rdfa', $this->baseUri); | |
183 $this->_testBasicCommentRdfaMarkup($graph, $comment1); | |
184 | |
185 // Posts comment #2 as anonymous user. | |
186 $anonymous_user = []; | |
187 $anonymous_user['name'] = $this->randomMachineName(); | |
188 $anonymous_user['mail'] = 'tester@simpletest.org'; | |
189 $anonymous_user['homepage'] = 'http://example.org/'; | |
190 $comment2 = $this->saveComment($this->node->id(), 0, $anonymous_user); | |
191 | |
192 // Tests comment #2 as anonymous user. | |
193 $parser = new \EasyRdf_Parser_Rdfa(); | |
194 $graph = new \EasyRdf_Graph(); | |
195 $parser->parse($graph, $this->drupalGet('node/' . $this->node->id()), 'rdfa', $this->baseUri); | |
196 $this->_testBasicCommentRdfaMarkup($graph, $comment2, $anonymous_user); | |
197 | |
198 // Tests comment #2 as logged in user. | |
199 $this->drupalLogin($this->webUser); | |
200 $parser = new \EasyRdf_Parser_Rdfa(); | |
201 $graph = new \EasyRdf_Graph(); | |
202 $parser->parse($graph, $this->drupalGet('node/' . $this->node->id()), 'rdfa', $this->baseUri); | |
203 $this->_testBasicCommentRdfaMarkup($graph, $comment2, $anonymous_user); | |
204 } | |
205 | |
206 /** | |
207 * Tests RDF comment replies. | |
208 */ | |
209 public function testCommentReplyOfRdfaMarkup() { | |
210 // Posts comment #1 on behalf of registered user. | |
211 $this->drupalLogin($this->webUser); | |
212 $comment_1 = $this->saveComment($this->node->id(), $this->webUser->id()); | |
213 | |
214 $comment_1_uri = $comment_1->url('canonical', ['absolute' => TRUE]); | |
215 | |
216 // Posts a reply to the first comment. | |
217 $comment_2 = $this->saveComment($this->node->id(), $this->webUser->id(), NULL, $comment_1->id()); | |
218 $comment_2_uri = $comment_2->url('canonical', ['absolute' => TRUE]); | |
219 | |
220 $parser = new \EasyRdf_Parser_Rdfa(); | |
221 $graph = new \EasyRdf_Graph(); | |
222 $parser->parse($graph, $this->drupalGet('node/' . $this->node->id()), 'rdfa', $this->baseUri); | |
223 | |
224 // Tests the reply_of relationship of a first level comment. | |
225 $expected_value = [ | |
226 'type' => 'uri', | |
227 'value' => $this->nodeUri, | |
228 ]; | |
229 $this->assertTrue($graph->hasProperty($comment_1_uri, 'http://rdfs.org/sioc/ns#reply_of', $expected_value), 'Comment relation to its node found in RDF output (sioc:reply_of).'); | |
230 | |
231 // Tests the reply_of relationship of a second level comment. | |
232 $expected_value = [ | |
233 'type' => 'uri', | |
234 'value' => $this->nodeUri, | |
235 ]; | |
236 $this->assertTrue($graph->hasProperty($comment_2_uri, 'http://rdfs.org/sioc/ns#reply_of', $expected_value), 'Comment relation to its node found in RDF output (sioc:reply_of).'); | |
237 $expected_value = [ | |
238 'type' => 'uri', | |
239 'value' => $comment_1_uri, | |
240 ]; | |
241 $this->assertTrue($graph->hasProperty($comment_2_uri, 'http://rdfs.org/sioc/ns#reply_of', $expected_value), 'Comment relation to its parent comment found in RDF output (sioc:reply_of).'); | |
242 } | |
243 | |
244 /** | |
245 * Helper function for testCommentRdfaMarkup(). | |
246 * | |
247 * Tests the current page for basic comment RDFa markup. | |
248 * | |
249 * @param $comment | |
250 * Comment object. | |
251 * @param $account | |
252 * An array containing information about an anonymous user. | |
253 */ | |
254 public function _testBasicCommentRdfaMarkup($graph, CommentInterface $comment, $account = []) { | |
255 $comment_uri = $comment->url('canonical', ['absolute' => TRUE]); | |
256 | |
257 // Comment type. | |
258 $expected_value = [ | |
259 'type' => 'uri', | |
260 'value' => 'http://rdfs.org/sioc/types#Comment', | |
261 ]; | |
262 $this->assertTrue($graph->hasProperty($comment_uri, 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type', $expected_value), 'Comment type found in RDF output (sioct:Comment).'); | |
263 // Comment type. | |
264 $expected_value = [ | |
265 'type' => 'uri', | |
266 'value' => 'http://rdfs.org/sioc/ns#Post', | |
267 ]; | |
268 $this->assertTrue($graph->hasProperty($comment_uri, 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type', $expected_value), 'Comment type found in RDF output (sioc:Post).'); | |
269 | |
270 // Comment title. | |
271 $expected_value = [ | |
272 'type' => 'literal', | |
273 'value' => $comment->getSubject(), | |
274 'lang' => 'en', | |
275 ]; | |
276 $this->assertTrue($graph->hasProperty($comment_uri, 'http://purl.org/dc/terms/title', $expected_value), 'Comment subject found in RDF output (dc:title).'); | |
277 | |
278 // Comment date. | |
279 $expected_value = [ | |
280 'type' => 'literal', | |
281 'value' => format_date($comment->getCreatedTime(), 'custom', 'c', 'UTC'), | |
282 'datatype' => 'http://www.w3.org/2001/XMLSchema#dateTime', | |
283 ]; | |
284 $this->assertTrue($graph->hasProperty($comment_uri, 'http://purl.org/dc/terms/date', $expected_value), 'Comment date found in RDF output (dc:date).'); | |
285 // Comment date. | |
286 $expected_value = [ | |
287 'type' => 'literal', | |
288 'value' => format_date($comment->getCreatedTime(), 'custom', 'c', 'UTC'), | |
289 'datatype' => 'http://www.w3.org/2001/XMLSchema#dateTime', | |
290 ]; | |
291 $this->assertTrue($graph->hasProperty($comment_uri, 'http://purl.org/dc/terms/created', $expected_value), 'Comment date found in RDF output (dc:created).'); | |
292 | |
293 // Comment body. | |
294 $expected_value = [ | |
295 'type' => 'literal', | |
296 'value' => $comment->comment_body->value . "\n", | |
297 'lang' => 'en', | |
298 ]; | |
299 $this->assertTrue($graph->hasProperty($comment_uri, 'http://purl.org/rss/1.0/modules/content/encoded', $expected_value), 'Comment body found in RDF output (content:encoded).'); | |
300 | |
301 // The comment author can be a registered user or an anonymous user. | |
302 if ($comment->getOwnerId() > 0) { | |
303 $author_uri = \Drupal::url('entity.user.canonical', ['user' => $comment->getOwnerId()], ['absolute' => TRUE]); | |
304 // Comment relation to author. | |
305 $expected_value = [ | |
306 'type' => 'uri', | |
307 'value' => $author_uri, | |
308 ]; | |
309 $this->assertTrue($graph->hasProperty($comment_uri, 'http://rdfs.org/sioc/ns#has_creator', $expected_value), 'Comment relation to author found in RDF output (sioc:has_creator).'); | |
310 } | |
311 else { | |
312 // The author is expected to be a blank node. | |
313 $author_uri = $graph->get($comment_uri, '<http://rdfs.org/sioc/ns#has_creator>'); | |
314 if ($author_uri instanceof \EasyRdf_Resource) { | |
315 $this->assertTrue($author_uri->isBnode(), 'Comment relation to author found in RDF output (sioc:has_creator) and author is blank node.'); | |
316 } | |
317 else { | |
318 $this->fail('Comment relation to author found in RDF output (sioc:has_creator).'); | |
319 } | |
320 } | |
321 | |
322 // Author name. | |
323 $name = empty($account["name"]) ? $this->webUser->getUsername() : $account["name"] . " (not verified)"; | |
324 $expected_value = [ | |
325 'type' => 'literal', | |
326 'value' => $name, | |
327 ]; | |
328 $this->assertTrue($graph->hasProperty($author_uri, 'http://xmlns.com/foaf/0.1/name', $expected_value), 'Comment author name found in RDF output (foaf:name).'); | |
329 | |
330 // Comment author homepage (only for anonymous authors). | |
331 if ($comment->getOwnerId() == 0) { | |
332 $expected_value = [ | |
333 'type' => 'uri', | |
334 'value' => 'http://example.org/', | |
335 ]; | |
336 $this->assertTrue($graph->hasProperty($author_uri, 'http://xmlns.com/foaf/0.1/page', $expected_value), 'Comment author link found in RDF output (foaf:page).'); | |
337 } | |
338 } | |
339 | |
340 /** | |
341 * Creates a comment entity. | |
342 * | |
343 * @param $nid | |
344 * Node id which will hold the comment. | |
345 * @param $uid | |
346 * User id of the author of the comment. Can be NULL if $contact provided. | |
347 * @param $contact | |
348 * Set to NULL for no contact info, TRUE to ignore success checking, and | |
349 * array of values to set contact info. | |
350 * @param $pid | |
351 * Comment id of the parent comment in a thread. | |
352 * | |
353 * @return \Drupal\comment\Entity\Comment | |
354 * The saved comment. | |
355 */ | |
356 public function saveComment($nid, $uid, $contact = NULL, $pid = 0) { | |
357 $values = [ | |
358 'entity_id' => $nid, | |
359 'entity_type' => 'node', | |
360 'field_name' => 'comment', | |
361 'uid' => $uid, | |
362 'pid' => $pid, | |
363 'subject' => $this->randomMachineName(), | |
364 'comment_body' => $this->randomMachineName(), | |
365 'status' => 1, | |
366 ]; | |
367 if ($contact) { | |
368 $values += $contact; | |
369 } | |
370 | |
371 $comment = Comment::create($values); | |
372 $comment->save(); | |
373 return $comment; | |
374 } | |
375 | |
376 } |