Projet

Général

Profil

Paste
Télécharger (13,4 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / panelizer / tests / panelizer.node_revisions.test @ 651307cd

1
<?php
2
/**
3
 * @file
4
 * Test the node revisions functionality for Panelizer.
5
 */
6

    
7
/**
8
 * Verifies Panelizer configuration options for node revisions.
9
 */
10
class PanelizerNodeRevisionTest extends PanelizerTestHelper {
11

    
12
  /**
13
   * {@inheritdoc}
14
   */
15
  public static function getInfo() {
16
    return array(
17
      'name' => 'Panelizer node revisions (excluding IPE)',
18
      'description' => 'Test panelizer customization in node revisions, excluding IPE.',
19
      'group' => 'Panelizer',
20
    );
21
  }
22

    
23
  /**
24
   * {@inheritdoc}
25
   */
26
  function setUp(array $modules = array()) {
27
    parent::setUp();
28

    
29
    $perms = array(
30
      'administer content types',
31
      'administer nodes',
32
      'bypass node access',
33
      'administer page manager',
34
      'use page manager',
35
      'administer panelizer',
36
    );
37
    $web_user = $this->drupalCreateUser($perms);
38
    $this->drupalLogin($web_user);
39
  }
40

    
41
  /**
42
   * Confirm various aspects of revision handling work correctly.
43
   */
44
  function testRevisionHandling() {
45
    // Finding this class on the page will indicate it is using a default
46
    // display.
47
    $css_default_class = 'panelizer-default';
48

    
49
    // Enable the node_view display in Page Manager.
50
    $this->simpleEnablePage('node_view');
51

    
52
    // Check the Page Manager admin page.
53
    $this->drupalGet('admin/structure/pages');
54
    $this->assertResponse(200);
55
    $this->assertLink(t('Disable'));
56

    
57
    // Panelize "Basic page" content type and the 'page_manager' display, give
58
    // it a default display and allow multiple displays.
59
    $edit = array();
60
    $edit['panelizer[status]'] = TRUE;
61
    $edit['panelizer[view modes][page_manager][status]'] = TRUE;
62
    $edit['panelizer[view modes][page_manager][default]'] = TRUE;
63
    $edit['panelizer[view modes][page_manager][choice]'] = TRUE;
64
    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
65
    $this->assertResponse(200);
66

    
67
    // Add a custom class to the default display.
68
    $this->drupalGet('admin/structure/types/manage/page/panelizer/page_manager/node:page:default/settings');
69
    $edit = array(
70
      'css_class' => $css_default_class,
71
    );
72
    $this->drupalPost(NULL, $edit, t('Save'));
73

    
74
    // Clone the default display.
75
    $this->drupalGet('admin/structure/types/manage/page/panelizer/page_manager/node:page:default/clone');
76
    $this->assertResponse(200);
77
    $this->assertText(t('Name'));
78
    $this->assertFieldById('edit-title', "Clone of Default", "Administrative Title");
79

    
80
    // Manually set the machine name here as it's normally set by
81
    // machine-name.js, which doesn't work via SimpleTest.
82
    $this->drupalPost(NULL, array('name' => 'clone_of_default'), t('Save'));
83
    $this->assertResponse(200);
84
    // Confirm the status message.
85
    $this->assertText(t('!item has been created.', array('!item' => 'node:page:clone_of_default')));
86

    
87
    // Set a custom css class to identify this cloned display.
88
    $edit = array();
89
    $clone_css_class = 'panelizer-test-page-node-revisions-clone';
90
    $edit['css_class'] = $clone_css_class;
91
    $this->drupalPost('admin/structure/types/manage/page/panelizer/page_manager/node:page:clone_of_default/settings', $edit, t('Save'));
92
    $this->assertResponse(200);
93
    $this->assertText(t('The settings have been updated.'));
94

    
95
    // Clone the cloned display.
96
    $this->drupalGet('admin/structure/types/manage/page/panelizer/page_manager/node:page:clone_of_default/clone');
97
    $this->assertResponse(200);
98
    $this->assertText(t('Name'));
99
    $this->assertFieldById('edit-title', "Clone of Clone of Default", "Administrative Title");
100

    
101
    // Manually set the machine name here as it's normally set by
102
    // machine-name.js, which doesn't work via SimpleTest.
103
    $this->drupalPost(NULL, array('name' => 'clone_of_clone_of_default'), t('Save'));
104
    $this->assertResponse(200);
105
    $this->assertText(t('!item has been created.', array('!item' => 'node:page:clone_of_clone_of_default')));
106

    
107
    // Set a custom css class to identify this cloned-cloned display.
108
    $edit = array();
109
    $clone_of_clone_css_class = 'panelizer-test-page-node-revisions-cloned-clone';
110
    $edit['css_class'] = $clone_of_clone_css_class;
111
    $this->drupalPost('admin/structure/types/manage/page/panelizer/page_manager/node:page:clone_of_clone_of_default/settings', $edit, t('Save'));
112
    $this->assertResponse(200);
113
    $this->assertText(t('The settings have been updated.'));
114

    
115
    // Assert panel choice for new pages.
116
    $this->drupalGet('node/add/page');
117
    $this->assertField('panelizer[page_manager][name]', 'Display can be chosen on new page form');
118

    
119
    // Create a node with default panelizer display.
120
    $edit = array();
121
    $langcode = LANGUAGE_NONE;
122
    $edit["title"] = $this->randomName(8);
123
    $edit["body[$langcode][0][value]"] = $this->randomName(16);
124
    $this->drupalPost('node/add/page', $edit, t('Save'));
125
    $this->assertResponse(200);
126

    
127
    // Check that the post can be panelized.
128
    $node = $this->drupalGetNodeByTitle($edit["title"]);
129
    $this->assertLink('Customize display', 0, 'The customize display link appears on the page');
130
    $this->assertLinkByHref('node/' . $node->nid . '/panelizer', 0, 'A link to customize the node appears on the page');
131

    
132
    // Assert panel choice for existing pages.
133
    $this->drupalGet('node/' . $node->nid . '/edit');
134
    $this->assertResponse(200);
135
    $this->assertField('panelizer[page_manager][name]', 'Display can be chosen on edit page form');
136

    
137
    // Create a new revision with a different display.
138
    $langcode = LANGUAGE_NONE;
139
    $edit["revision"] = 1;
140
    $edit["log"] = "Changed panelizer display in a revision";
141
    $edit["panelizer[page_manager][name]"] = 'node:page:clone_of_default';
142
    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
143
    $this->assertResponse(200);
144
    $this->assertLink(t('Revisions'), 0, 'The node has multiple revisions');
145

    
146
    // Check that the new revision is rendered using the cloned display.
147
    $elements = $this->xpath('//body[contains(@class,:class)]', array(':class' => $clone_css_class));
148
    $this->assertEqual(count($elements), 1, 'The node is using the cloned display.');
149

    
150
    // Confirm that the revisions tab is now available.
151
    $this->drupalGet('node/' . $node->nid . '/revisions');
152
    $this->assertResponse(200);
153

    
154
    // Check that the old revision is still using the default display.
155
    $revisions = node_revision_list($node);
156
    $oldest_revision = array_pop($revisions);
157
    $this->assertNotNull($oldest_revision->vid);
158
    $this->drupalGet('node/' . $node->nid . '/revisions/' . $oldest_revision->vid . '/view');
159
    $this->assertResponse(200);
160
    $elements = $this->xpath('//body[contains(@class,:class)]', array(':class' => $clone_css_class));
161
    $this->assertEqual(count($elements), 0, 'The node revision is not using the cloned display.');
162
    // @todo Panelizer doesn't add a body class for default displays, need to
163
    // add a default class.
164
    $elements = $this->xpath('//body[contains(@class,:class)]', array(':class' => $css_default_class));
165
    $this->assertEqual(count($elements), 1, 'The node is using the default display.');
166

    
167
    // Create a new revision with another different display.
168
    $langcode = LANGUAGE_NONE;
169
    $edit = array();
170
    $edit['title'] = $node->title;
171
    $edit["body[$langcode][0][value]"] = $node->body[$langcode][0]["value"];
172
    $edit["revision"] = 1;
173
    $edit["log"] = "Changed panelizer display in another revision";
174
    $edit["panelizer[page_manager][name]"] = 'node:page:clone_of_clone_of_default';
175
    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
176
    $this->assertResponse(200);
177

    
178
    // Check that the new revision is rendered using the cloned display.
179
    $elements = $this->xpath('//body[contains(@class,:class)]', array(':class' => $clone_of_clone_css_class));
180
    $this->assertEqual(count($elements), 1, 'The node is using the cloned display.');
181

    
182
    // Check that the oldest revision is still using the default display.
183
    $revisions = node_revision_list($node);
184
    $this->assertEqual(count($revisions), 3, "The node has one published and two former revisions");
185
    $oldest_revision = array_pop($revisions);
186
    $this->assertNotNull($oldest_revision->vid);
187
    $this->drupalGet('node/' . $node->nid . '/revisions/' . $oldest_revision->vid . '/view');
188
    $this->assertResponse(200);
189
    $elements = $this->xpath('//body[contains(@class,:class)]', array(':class' => $clone_of_clone_css_class));
190
    $this->assertEqual(count($elements), 0, 'The node revision is NOT using the clone of cloned display.');
191
    $elements = $this->xpath('//body[contains(@class,:class)]', array(':class' => $clone_css_class));
192
    $this->assertEqual(count($elements), 0, 'The node revision is NOT using the cloned display.');
193
    // @todo Panelizer doesn't add a body class for default displays, need to
194
    // add a default class.
195
    $elements = $this->xpath('//body[contains(@class,:class)]', array(':class' => $css_default_class));
196
    $this->assertEqual(count($elements), 1, 'The node revision is using the default display.');
197

    
198
    // Check that the previous revision is still using the original cloned
199
    // display.
200
    $node_revision = array_pop($revisions);
201
    $this->assertNotNull($node_revision->vid);
202
    $node_revision = node_load(NULL, $node_revision->vid);
203
    $this->drupalGet('node/' . $node->nid . '/revisions/' . $node_revision->vid . '/view');
204
    $this->assertResponse(200);
205
    $elements = $this->xpath('//body[contains(@class,:class)]', array(':class' => $clone_of_clone_css_class));
206
    $this->assertEqual(count($elements), 0, 'The node revision is NOT using the clone of cloned display.');
207
    $elements = $this->xpath('//body[contains(@class,:class)]', array(':class' => $clone_css_class));
208
    $this->assertEqual(count($elements), 1, 'The node revision is using the default display.');
209

    
210
    // Get the number of {panelizer_entity} records currently recorded for this
211
    // node.
212
    $old_count = db_select('panelizer_entity', 'pe')
213
      ->fields('pe')
214
      ->condition('entity_type', 'node')
215
      ->condition('entity_id', $node->nid)
216
      ->countQuery()
217
      ->execute()
218
      ->fetchField();
219

    
220
    // Delete a revision.
221
    $this->drupalGet('node/' . $node->nid . '/revisions/' . $node_revision->vid . '/delete');
222
    $this->assertResponse(200);
223
    $t_args = array(
224
      '%revision-date' => format_date($node_revision->revision_timestamp),
225
    );
226
    $this->assertText(strip_tags(t('Are you sure you want to delete the revision from %revision-date?', $t_args)));
227
    $this->assertText(t('This action cannot be undone.'));
228
    $this->drupalPost(NULL, array(), t('Delete'));
229
    $this->assertResponse(200);
230
    $t_args = array(
231
      '%revision-date' => format_date($node_revision->revision_timestamp),
232
      '@type' => node_type_get_name($node_revision),
233
      '%title' => $node_revision->title,
234
    );
235
    $this->assertText(strip_tags(t('Revision from %revision-date of @type %title has been deleted.', $t_args)));
236

    
237
    // Confirm only one {panelizer_entity} record was deleted.
238
    $records = db_select('panelizer_entity', 'pe')
239
      ->fields('pe')
240
      ->condition('entity_type', 'node')
241
      ->condition('entity_id', $node->nid)
242
      ->orderBy('pe.revision_id')
243
      ->execute()
244
      ->fetchAll();
245
    $this->assertEqual($old_count, count($records) + 1);
246
    $this->verbose('<pre>' . print_r($records, TRUE) . '</pre>');
247

    
248
    // Revert to the first revision.
249
    $revisions = node_revision_list($node);
250
    $node_revision = array_pop($revisions);
251
    $node_revision = node_load(NULL, $node_revision->vid);
252
    $this->drupalGet('node/' . $node->nid . '/revisions/' . $node_revision->vid . '/revert');
253
    $this->assertResponse(200);
254
    $t_args = array(
255
      '%revision-date' => format_date($node_revision->revision_timestamp),
256
    );
257
    $this->assertText(strip_tags(t('Are you sure you want to revert to the revision from %revision-date?', $t_args)));
258
    $this->drupalPost(NULL, array(), t('Revert'));
259
    $this->assertResponse(200);
260
    $t_args = array(
261
      '@type' => node_type_get_name($node_revision),
262
      '%title' => $node_revision->title,
263
      '%revision-date' => format_date($node_revision->revision_timestamp),
264
    );
265
    $this->assertText(strip_tags(t('@type %title has been reverted back to the revision from %revision-date.', $t_args)));
266

    
267
    // Confirm one more {panelizer_entity} record was added.
268
    $records = db_select('panelizer_entity', 'pe')
269
      ->fields('pe')
270
      ->condition('entity_type', 'node')
271
      ->condition('entity_id', $node->nid)
272
      ->orderBy('pe.revision_id')
273
      ->execute()
274
      ->fetchAll();
275
    // Because one of the displays is now using a default, there'll be one less
276
    // record.
277
    $this->assertEqual($old_count, count($records) + 1);
278
    $this->verbose('<pre>' . print_r($records, TRUE) . '</pre>');
279

    
280
    $this->drupalGet('node/' . $node->nid);
281
    $this->assertResponse(200);
282
    $elements = $this->xpath('//body[contains(@class,:class)]', array(':class' => $clone_css_class));
283
    $this->assertEqual(count($elements), 0, 'The node revision is not using the cloned display.');
284
    // @todo Panelizer doesn't add a body class for default displays, need to
285
    // add a default class.
286
    $elements = $this->xpath('//body[contains(@class,:class)]', array(':class' => $css_default_class));
287
    $this->assertEqual(count($elements), 1, 'The node is using the default display again.');
288

    
289
    // Confirm there is no record for this object that is now using the default.
290
    $new_display = NULL;
291
    foreach ($records as $record) {
292
      if ($record->revision_id == $node_revision->vid) {
293
        $new_display = $record->name;
294
        break;
295
      }
296
    }
297
    $this->assertNull($new_display);
298
  }
299

    
300
}