Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\node\Functional;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Url;
|
Chris@0
|
6 use Drupal\node\Entity\Node;
|
Chris@0
|
7 use Drupal\node\Entity\NodeType;
|
Chris@0
|
8
|
Chris@0
|
9 /**
|
Chris@0
|
10 * Tests the UI for controlling node revision behavior.
|
Chris@0
|
11 *
|
Chris@0
|
12 * @group node
|
Chris@0
|
13 */
|
Chris@0
|
14 class NodeRevisionsUiTest extends NodeTestBase {
|
Chris@0
|
15
|
Chris@0
|
16 /**
|
Chris@0
|
17 * @var \Drupal\user\Entity\User
|
Chris@0
|
18 */
|
Chris@0
|
19 protected $editor;
|
Chris@0
|
20
|
Chris@0
|
21 /**
|
Chris@0
|
22 * {@inheritdoc}
|
Chris@0
|
23 */
|
Chris@0
|
24 protected function setUp() {
|
Chris@0
|
25 parent::setUp();
|
Chris@0
|
26
|
Chris@0
|
27 // Create users.
|
Chris@0
|
28 $this->editor = $this->drupalCreateUser([
|
Chris@0
|
29 'administer nodes',
|
Chris@0
|
30 'edit any page content',
|
Chris@0
|
31 'view page revisions',
|
Chris@0
|
32 'access user profiles',
|
Chris@0
|
33 ]);
|
Chris@0
|
34 }
|
Chris@0
|
35
|
Chris@0
|
36 /**
|
Chris@0
|
37 * Checks that unchecking 'Create new revision' works when editing a node.
|
Chris@0
|
38 */
|
Chris@0
|
39 public function testNodeFormSaveWithoutRevision() {
|
Chris@0
|
40 $this->drupalLogin($this->editor);
|
Chris@0
|
41 $node_storage = $this->container->get('entity.manager')->getStorage('node');
|
Chris@0
|
42
|
Chris@0
|
43 // Set page revision setting 'create new revision'. This will mean new
|
Chris@0
|
44 // revisions are created by default when the node is edited.
|
Chris@0
|
45 $type = NodeType::load('page');
|
Chris@0
|
46 $type->setNewRevision(TRUE);
|
Chris@0
|
47 $type->save();
|
Chris@0
|
48
|
Chris@0
|
49 // Create the node.
|
Chris@0
|
50 $node = $this->drupalCreateNode();
|
Chris@0
|
51
|
Chris@0
|
52 // Verify the checkbox is checked on the node edit form.
|
Chris@0
|
53 $this->drupalGet('node/' . $node->id() . '/edit');
|
Chris@0
|
54 $this->assertFieldChecked('edit-revision', "'Create new revision' checkbox is checked");
|
Chris@0
|
55
|
Chris@0
|
56 // Uncheck the create new revision checkbox and save the node.
|
Chris@0
|
57 $edit = ['revision' => FALSE];
|
Chris@0
|
58 $this->drupalPostForm('node/' . $node->id() . '/edit', $edit, t('Save'));
|
Chris@0
|
59
|
Chris@0
|
60 // Load the node again and check the revision is the same as before.
|
Chris@0
|
61 $node_storage->resetCache([$node->id()]);
|
Chris@0
|
62 $node_revision = $node_storage->load($node->id(), TRUE);
|
Chris@0
|
63 $this->assertEqual($node_revision->getRevisionId(), $node->getRevisionId(), "After an existing node is saved with 'Create new revision' unchecked, a new revision is not created.");
|
Chris@0
|
64
|
Chris@0
|
65 // Verify the checkbox is checked on the node edit form.
|
Chris@0
|
66 $this->drupalGet('node/' . $node->id() . '/edit');
|
Chris@0
|
67 $this->assertFieldChecked('edit-revision', "'Create new revision' checkbox is checked");
|
Chris@0
|
68
|
Chris@0
|
69 // Submit the form without changing the checkbox.
|
Chris@0
|
70 $edit = [];
|
Chris@0
|
71 $this->drupalPostForm('node/' . $node->id() . '/edit', $edit, t('Save'));
|
Chris@0
|
72
|
Chris@0
|
73 // Load the node again and check the revision is different from before.
|
Chris@0
|
74 $node_storage->resetCache([$node->id()]);
|
Chris@0
|
75 $node_revision = $node_storage->load($node->id());
|
Chris@0
|
76 $this->assertNotEqual($node_revision->getRevisionId(), $node->getRevisionId(), "After an existing node is saved with 'Create new revision' checked, a new revision is created.");
|
Chris@0
|
77 }
|
Chris@0
|
78
|
Chris@0
|
79 /**
|
Chris@0
|
80 * Checks HTML double escaping of revision logs.
|
Chris@0
|
81 */
|
Chris@0
|
82 public function testNodeRevisionDoubleEscapeFix() {
|
Chris@0
|
83 $this->drupalLogin($this->editor);
|
Chris@0
|
84 $nodes = [];
|
Chris@0
|
85
|
Chris@0
|
86 // Create the node.
|
Chris@0
|
87 $node = $this->drupalCreateNode();
|
Chris@0
|
88
|
Chris@0
|
89 $username = [
|
Chris@0
|
90 '#theme' => 'username',
|
Chris@0
|
91 '#account' => $this->editor,
|
Chris@0
|
92 ];
|
Chris@0
|
93 $editor = \Drupal::service('renderer')->renderPlain($username);
|
Chris@0
|
94
|
Chris@0
|
95 // Get original node.
|
Chris@0
|
96 $nodes[] = clone $node;
|
Chris@0
|
97
|
Chris@0
|
98 // Create revision with a random title and body and update variables.
|
Chris@0
|
99 $node->title = $this->randomMachineName();
|
Chris@0
|
100 $node->body = [
|
Chris@0
|
101 'value' => $this->randomMachineName(32),
|
Chris@0
|
102 'format' => filter_default_format(),
|
Chris@0
|
103 ];
|
Chris@0
|
104 $node->setNewRevision();
|
Chris@0
|
105 $revision_log = 'Revision <em>message</em> with markup.';
|
Chris@0
|
106 $node->revision_log->value = $revision_log;
|
Chris@0
|
107 $node->save();
|
Chris@0
|
108 // Make sure we get revision information.
|
Chris@0
|
109 $node = Node::load($node->id());
|
Chris@0
|
110 $nodes[] = clone $node;
|
Chris@0
|
111
|
Chris@0
|
112 $this->drupalGet('node/' . $node->id() . '/revisions');
|
Chris@0
|
113
|
Chris@0
|
114 // Assert the old revision message.
|
Chris@18
|
115 $date = $this->container->get('date.formatter')->format($nodes[0]->revision_timestamp->value, 'short');
|
Chris@0
|
116 $url = new Url('entity.node.revision', ['node' => $nodes[0]->id(), 'node_revision' => $nodes[0]->getRevisionId()]);
|
Chris@0
|
117 $this->assertRaw(\Drupal::l($date, $url) . ' by ' . $editor);
|
Chris@0
|
118
|
Chris@0
|
119 // Assert the current revision message.
|
Chris@18
|
120 $date = $this->container->get('date.formatter')->format($nodes[1]->revision_timestamp->value, 'short');
|
Chris@18
|
121 $this->assertRaw($nodes[1]->toLink($date)->toString() . ' by ' . $editor . '<p class="revision-log">' . $revision_log . '</p>');
|
Chris@0
|
122 }
|
Chris@0
|
123
|
Chris@0
|
124 /**
|
Chris@0
|
125 * Checks the Revisions tab.
|
Chris@0
|
126 */
|
Chris@0
|
127 public function testNodeRevisionsTabWithDefaultRevision() {
|
Chris@0
|
128 $this->drupalLogin($this->editor);
|
Chris@0
|
129
|
Chris@0
|
130 // Create the node.
|
Chris@0
|
131 $node = $this->drupalCreateNode();
|
Chris@0
|
132 $storage = \Drupal::entityTypeManager()->getStorage($node->getEntityTypeId());
|
Chris@0
|
133
|
Chris@0
|
134 // Create a new revision based on the default revision.
|
Chris@0
|
135 // Revision 2.
|
Chris@0
|
136 $node = $storage->load($node->id());
|
Chris@0
|
137 $node->setNewRevision(TRUE);
|
Chris@0
|
138 $node->save();
|
Chris@0
|
139
|
Chris@0
|
140 // Revision 3.
|
Chris@0
|
141 $node = $storage->load($node->id());
|
Chris@0
|
142 $node->setNewRevision(TRUE);
|
Chris@0
|
143 $node->save();
|
Chris@0
|
144
|
Chris@0
|
145 // Revision 4.
|
Chris@0
|
146 // Trigger translation changes in order to show the revision.
|
Chris@0
|
147 $node = $storage->load($node->id());
|
Chris@0
|
148 $node->setTitle($this->randomString());
|
Chris@0
|
149 $node->isDefaultRevision(FALSE);
|
Chris@0
|
150 $node->setNewRevision(TRUE);
|
Chris@0
|
151 $node->save();
|
Chris@0
|
152
|
Chris@0
|
153 // Revision 5.
|
Chris@0
|
154 $node = $storage->load($node->id());
|
Chris@0
|
155 $node->isDefaultRevision(FALSE);
|
Chris@0
|
156 $node->setNewRevision(TRUE);
|
Chris@0
|
157 $node->save();
|
Chris@0
|
158
|
Chris@0
|
159 $node_id = $node->id();
|
Chris@0
|
160
|
Chris@0
|
161 $this->drupalGet('node/' . $node_id . '/revisions');
|
Chris@0
|
162
|
Chris@14
|
163 // Verify that the latest affected revision having been a default revision
|
Chris@14
|
164 // is displayed as the current one.
|
Chris@14
|
165 $this->assertNoLinkByHref('/node/' . $node_id . '/revisions/1/revert');
|
Chris@14
|
166 $elements = $this->xpath('//tr[contains(@class, "revision-current")]/td/a[1]');
|
Chris@14
|
167 // The site may be installed in a subdirectory, so check if the URL is
|
Chris@14
|
168 // contained in the retrieved one.
|
Chris@14
|
169 $this->assertContains('/node/1', current($elements)->getAttribute('href'));
|
Chris@14
|
170
|
Chris@0
|
171 // Verify that the default revision can be an older revision than the latest
|
Chris@0
|
172 // one.
|
Chris@14
|
173 // Assert that the revisions with translations changes are shown.
|
Chris@0
|
174 $this->assertLinkByHref('/node/' . $node_id . '/revisions/4/revert');
|
Chris@0
|
175
|
Chris@0
|
176 // Assert that the revisions without translations changes are filtered out:
|
Chris@0
|
177 // 2, 3 and 5.
|
Chris@0
|
178 $this->assertNoLinkByHref('/node/' . $node_id . '/revisions/2/revert');
|
Chris@0
|
179 $this->assertNoLinkByHref('/node/' . $node_id . '/revisions/3/revert');
|
Chris@0
|
180 $this->assertNoLinkByHref('/node/' . $node_id . '/revisions/5/revert');
|
Chris@0
|
181 }
|
Chris@0
|
182
|
Chris@0
|
183 }
|