annotate core/modules/node/tests/src/Functional/NodeRevisionsUiTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
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 }