node.test 14.6 KB
Newer Older
1
2
3
4
<?php
// $Id$

class NodeRevisionsTestCase extends DrupalWebTestCase {
5
6
7
  protected $nodes;
  protected $logs;

8
  /**
9
   * Implementation of getInfo().
10
11
12
13
   */
  function getInfo() {
    return array(
      'name' => t('Node revisions'),
14
15
      'description' => t('Create a node with revisions and test viewing, reverting, and deleting revisions.'),
      'group' => t('Node'),
16
17
18
19
    );
  }

  /**
20
   * Implementation of setUp().
21
   */
22
23
  function setUp() {
    parent::setUp();
24

25
    // Create and login user.
26
    $web_user = $this->drupalCreateUser(array('view revisions', 'revert revisions', 'edit any page content',
27
                                               'delete revisions', 'delete any page content'));
28
    $this->drupalLogin($web_user);
29

30
31
32
33
    // Create initial node.
    $node = $this->drupalCreateNode();
    $settings = get_object_vars($node);
    $settings['revision'] = 1;
34

35
36
    $nodes = array();
    $logs = array();
37

38
39
    // Get original node.
    $nodes[] = $node;
40

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    // Create three revisions.
    $revision_count = 3;
    for ($i = 0; $i < $revision_count; $i++) {
      $logs[] = $settings['log'] = $this->randomName(32);

      // Create revision with random title and body and update variables.
      $this->drupalCreateNode($settings);
      $node = node_load($node->nid); // Make sure we get revision information.
      $settings = get_object_vars($node);

      $nodes[] = $node;
    }

    $this->nodes = $nodes;
    $this->logs = $logs;
56
57
58
  }

  /**
59
   * Check node revision related opperations.
60
   */
61
62
63
  function testRevisions() {
    $nodes = $this->nodes;
    $logs = $this->logs;
64

65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
    // Get last node for simple checks.
    $node = $nodes[3];

    // Confirm the correct revision text appears on "view revisions" page.
    $this->drupalGet("node/$node->nid/revisions/$node->vid/view");
    $this->assertText($node->body, t('Correct text displays for version.'));

    // Confirm the correct log message appears on "revisions overview" page.
    $this->drupalGet("node/$node->nid/revisions");
    foreach ($logs as $log) {
      $this->assertText($log, t('Log message found.'));
    }

    // Confirm that revisions revert properly.
    $this->drupalPost("node/$node->nid/revisions/{$nodes[1]->vid}/revert", array(), t('Revert'));
    $this->assertRaw(t('@type %title has been reverted back to the revision from %revision-date.',
                        array('@type' => 'Page', '%title' => $nodes[1]->title,
                              '%revision-date' => format_date($nodes[1]->revision_timestamp))), t('Revision reverted.'));
    $reverted_node = node_load($node->nid);
    $this->assertTrue(($nodes[1]->body == $reverted_node->body), t('Node reverted correctly.'));

    // Confirm revisions delete properly.
    $this->drupalPost("node/$node->nid/revisions/{$nodes[1]->vid}/delete", array(), t('Delete'));
    $this->assertRaw(t('Revision from %revision-date of @type %title has been deleted.',
                        array('%revision-date' => format_date($nodes[1]->revision_timestamp),
                              '@type' => 'Page', '%title' => $nodes[1]->title)), t('Revision deleted.'));
    $this->assertTrue(db_result(db_query('SELECT COUNT(vid) FROM {node_revisions} WHERE nid = %d and vid = %d', $node->nid, $nodes[1]->vid)) == 0, t('Revision not found.'));
92
93
94
95
96
  }
}

class NodeTeaserTestCase extends DrupalWebTestCase {
  /**
97
   * Implementation of getInfo().
98
99
100
101
   */
  function getInfo() {
    return array(
      'name' => t('Node teaser'),
102
103
      'description' => t('Test node_teaser() with different strings and lengths.'),
      'group' => t('Node'),
104
105
106
107
    );
  }

  /**
108
   * Tests an edge case where if the first sentence is a question and
109
110
   * subsequent sentences are not. This is edge case is documented at
   * http://drupal.org/node/180425.
111
112
113
   */
  function testFirstSentenceQuestion() {
    $body = 'A question? A sentence. Another sentence.';
114
115
    $expected = 'A question? A sentence.';
    $this->callNodeTeaser($body, $expected, NULL, 30);
116
117
118
  }

  /**
119
   * Test teaser with long example.
120
   */
121
122
123
124
125
126
127
128
129
130
  function testLongSentence() {
    $body = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ' . // 125
            'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ' . // 108
            'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. ' . // 103
            'Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; // 110
    $expected = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ' .
                'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ' .
                'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.';
    // First three sentences add up to: 336, so add one for space and then 3 to get half-way into next word.
    $this->callNodeTeaser($body, $expected, NULL, 340);
131
132
133
  }

  /**
134
   * Test various teaser length edge cases.
135
136
137
138
139
140
141
142
143
   */
  function testLength() {
    // This body string tests a number of edge cases.
    $body = "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>";

    // The teasers we expect node_teaser() to return when $size is the index
    // of each array item.
    // Using an input format with no line-break filter:
    $teasers = array(
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
      "<",
      "<p",
      "<p>",
      "<p>\n",
      "<p>\nH",
      "<p>\nHi",
      "<p>\nHi\n",
      "<p>\nHi\n<",
      "<p>\nHi\n</",
      "<p>\nHi\n</p",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
    );

184
185
    // And Using an input format WITH the line-break filter.
    $teasers_lb = array(
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
      "<",
      "<p",
      "<p>",
      "<p>",
      "<p>",
      "<p>",
      "<p>\nHi",
      "<p>\nHi",
      "<p>\nHi",
      "<p>\nHi",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>",
      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
    );
225
226
227
228
229
230
231
232
233
234
235
236

    // Test node_teaser() for different sizes.
    for ($i = 0; $i <= 37; $i++) {
      $this->callNodeTeaser($body, $teasers[$i],    NULL, $i);
      $this->callNodeTeaser($body, $teasers_lb[$i], 1,    $i);
      $this->callNodeTeaser($body, $teasers_lb[$i], 2,    $i);
    }
  }

  /**
   * Calls node_teaser() and asserts that the expected teaser is returned.
   */
237
  function callNodeTeaser($body, $expected, $format = NULL, $size = NULL) {
238
    $teaser = node_teaser($body, $format, $size);
239
    $this->assertIdentical($teaser, $expected, t('Generated teaser "@teaser" matches expected teaser.', array('@teaser' => $teaser)));
240
241
242
243
  }
}

class PageEditTestCase extends DrupalWebTestCase {
244
245
246
  /**
   * Implementation of getInfo().
   */
247
248
  function getInfo() {
    return array(
249
250
251
252
      'name' => t('Node edit'),
      'description' => t('Create a node and test node edit functionality.'),
      'group' => t('Node'),
    );
253
254
  }

255
256
257
258
259
260
  /**
   * Implementation of setUp().
   */
  function setUp() {
    parent::setUp();

261
262
    $web_user = $this->drupalCreateUser(array('edit own page content', 'create page content'));
    $this->drupalLogin($web_user);
263
  }
264

265
266
267
268
269
270
271
272
  /**
   * Check node edit functionality.
   */
  function testPageEdit() {
    // Create node to edit.
    $edit = array();
    $edit['title'] = $this->randomName(8);
    $edit['body'] = $this->randomName(16);
273
274
    $this->drupalPost('node/add/page', $edit, t('Save'));

275
    // Check that the node exists in the database.
276
    $node = node_load(array('title' => $edit['title']));
277
    $this->assertTrue($node, t('Node found in database.'));
278

279
    // Check that "edit" link points to correct page.
280
    $this->clickLink(t('Edit'));
281
282
283
    $edit_url = url("node/$node->nid/edit", array('absolute' => true));
    $actual_url = $this->getURL();
    $this->assertEqual($edit_url, $actual_url, t('On edit page.'));
284

285
286
287
288
    // Check that the title and body fields are displayed with the correct values.
    $this->assertLink(t('Edit'), 0, t('Edit tab found.'));
    $this->assertFieldByName('title', $edit['title'], t('Title field displayed.'));
    $this->assertFieldByName('body', '<!--break-->' . $edit['body'], t('Body field displayed.'));
289

290
291
292
293
294
295
296
297
298
299
    // Edit the content of the node.
    $edit = array();
    $edit['title'] = $this->randomName(8);
    $edit['body'] = $this->randomName(16);
    // Stay on the current page, without reloading.
    $this->drupalPost(NULL, $edit, t('Save'));

    // Check that the title and body fields are displayed with the updated values.
    $this->assertText($edit['title'], t('Title displayed.'));
    $this->assertText($edit['body'], t('Body displayed.'));
300
301
302
303
  }
}

class PagePreviewTestCase extends DrupalWebTestCase {
304
305
306
  /**
   * Implementation of getInfo().
   */
307
308
  function getInfo() {
    return array(
309
310
311
312
      'name' => t('Node preview'),
      'description' => t('Test node preview functionality.'),
      'group' => t('Node'),
    );
313
314
  }

315
  /**
316
   * Implementation of setUp().
317
   */
318
319
320
  function setUp() {
    parent::setUp();

321
322
    $web_user = $this->drupalCreateUser(array('edit own page content', 'create page content'));
    $this->drupalLogin($web_user);
323
  }
324

325
326
327
328
329
330
331
332
  /**
   * Check the node preview functionality.
   */
  function testPagePreview() {
    // Fill in node creation form and preview node.
    $edit = array();
    $edit['title'] = $this->randomName(8);
    $edit['body'] = $this->randomName(16);
333
334
    $this->drupalPost('node/add/page', $edit, t('Preview'));

335
336
337
338
    // Check that the preview is displaying the title and body.
    $this->assertTitle(t('Preview'), t('Page title is preview.'));
    $this->assertText($edit['title'], t('Title displayed.'));
    $this->assertText($edit['body'], t('Body displayed.'));
339

340
341
342
    // Check that the title and body fields are displayed with the correct values.
    $this->assertFieldByName('title', $edit['title'], t('Title field displayed.'));
    $this->assertFieldByName('body', '<!--break-->' . $edit['body'], t('Body field displayed.'));
343
344
345
  }
}

346
class PageCreationTestCase extends DrupalWebTestCase {
347
  /**
348
   * Implementation of getInfo().
349
350
351
   */
  function getInfo() {
    return array(
352
353
      'name' => t('Node creation'),
      'description' => t('Create a node and test saving it.'),
354
355
356
357
      'group' => t('Node'),
    );
  }

358
359
360
361
362
  /**
   * Implementation of setUp().
   */
  function setUp() {
    parent::setUp();
363

364
    $web_user = $this->drupalCreateUser(array('create page content', 'edit own page content'));
365
    $this->drupalLogin($web_user);
366
  }
367

368
369
370
371
372
  /**
   * Create a page node and verify its consistency in the database.
   */
  function testPageCreation() {
    // Create a node.
373
    $edit = array();
374
375
    $edit['title'] = $this->randomName(8);
    $edit['body'] = $this->randomName(16);
376
377
    $this->drupalPost('node/add/page', $edit, t('Save'));

378
379
    // Check that the page has been created.
    $this->assertRaw(t('!post %title has been created.', array('!post' => 'Page', '%title' => $edit['title'])), t('Page created.'));
380

381
    // Check that the node exists in the database.
382
    $node = node_load(array('title' => $edit['title']));
383
    $this->assertTrue($node, t('Node found in database.'));
384
385
386
387
388
  }
}

class PageViewTestCase extends DrupalWebTestCase {
  /**
389
   * Implementation of getInfo().
390
391
392
   */
  function getInfo() {
    return array(
393
394
      'name' => t('Node edit permissions'),
      'description' => t('Create a node and test edit permissions.'),
395
396
      'group' => t('Node'),
    );
397
398
  }

399
400
401
  /**
   * Creates a node and then an anonymous and unpermissioned user attempt to edit the node.
   */
402
  function testPageView() {
403
    // Create a node to view.
404
    $node = $this->drupalCreateNode();
405
    $this->assertTrue(node_load($node->nid), t('Node created.'));
406

407
    // Try to edit with anonymous user.
408
409
410
    $html = $this->drupalGet("node/$node->nid/edit");
    $this->assertResponse(403);

411
412
413
    // Create a user without permission to edit node.
    $web_user = $this->drupalCreateUser(array('access content'));
    $this->drupalLogin($web_user);
414

415
416
    // Attempt to access edit page.
    $this->drupalGet("node/$node->nid/edit");
417
418
    $this->assertResponse(403);

419
    // Create user with permission to edit node.
420
    $web_user = $this->drupalCreateUser(array('bypass node access'));
421
422
423
424
425
    $this->drupalLogin($web_user);

    // Attempt to access edit page.
    $this->drupalGet("node/$node->nid/edit");
    $this->assertResponse(200);
426
427
  }
}
428
429
430
431
432
433
434

class NodeTitleXSSTestCase extends DrupalWebTestCase {
  /**
   * Implementation of getInfo().
   */
  function getInfo() {
     return array(
435
436
      'name' => t('Node title XSS filtering'),
      'description' => t('Create a node with dangerous tags in its title and test that they are escaped.'),
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
      'group' => t('Node'),
    );
  }

  function testNodeTitleXSS() {
    // Prepare a user to do the stuff.
    $web_user = $this->drupalCreateUser(array('create page content', 'edit any page content'));
    $this->drupalLogin($web_user);

    $xss = '<script>alert("xss")</script>';

    $edit = array(
      'title' => $xss . $this->randomName(),
    );
    $this->drupalPost('node/add/page', $edit, t('Preview'));
    $this->assertNoRaw($xss, t('Harmful tags are escaped when previewing a node.'));

    $node = $this->drupalCreateNode($edit);

    $this->drupalGet('node/' . $node->nid);
    $this->assertNoRaw($xss, t('Harmful tags are escaped when viewing a node.'));

    $this->drupalGet('node/' . $node->nid . '/edit');
    $this->assertNoRaw($xss, t('Harmful tags are escaped when editing a node.'));
  }
462
}