function BookTest::testBookDelete

Same name in other branches
  1. 9 core/modules/book/tests/src/Functional/BookTest.php \Drupal\Tests\book\Functional\BookTest::testBookDelete()
  2. 8.9.x core/modules/book/tests/src/Functional/BookTest.php \Drupal\Tests\book\Functional\BookTest::testBookDelete()
  3. 11.x core/modules/book/tests/src/Functional/BookTest.php \Drupal\Tests\book\Functional\BookTest::testBookDelete()

Tests the access for deleting top-level book nodes.

File

core/modules/book/tests/src/Functional/BookTest.php, line 419

Class

BookTest
Create a book, add pages, and test book interface.

Namespace

Drupal\Tests\book\Functional

Code

public function testBookDelete() : void {
    $node_storage = $this->container
        ->get('entity_type.manager')
        ->getStorage('node');
    $nodes = $this->createBook();
    $this->drupalLogin($this->adminUser);
    $edit = [];
    // Ensure that the top-level book node cannot be deleted.
    $this->drupalGet('node/' . $this->book
        ->id() . '/outline/remove');
    $this->assertSession()
        ->statusCodeEquals(403);
    // Ensure that a child book node can be deleted.
    $this->drupalGet('node/' . $nodes[4]->id() . '/outline/remove');
    $this->submitForm($edit, 'Remove');
    $node_storage->resetCache([
        $nodes[4]->id(),
    ]);
    $node4 = $node_storage->load($nodes[4]->id());
    $this->assertEmpty($node4->book, 'Deleting child book node properly allowed.');
    // $nodes[4] is stale, trying to delete it directly will cause an error.
    $node4->delete();
    unset($nodes[4]);
    // Delete all child book nodes and retest top-level node deletion.
    $node_storage->delete($nodes);
    $this->drupalGet('node/' . $this->book
        ->id() . '/outline/remove');
    $this->submitForm($edit, 'Remove');
    $node_storage->resetCache([
        $this->book
            ->id(),
    ]);
    $node = $node_storage->load($this->book
        ->id());
    $this->assertEmpty($node->book, 'Deleting childless top-level book node properly allowed.');
    // Tests directly deleting a book parent.
    $nodes = $this->createBook();
    $this->drupalLogin($this->adminUser);
    $this->drupalGet($this->book
        ->toUrl('delete-form'));
    $this->assertSession()
        ->pageTextContains($this->book
        ->label() . ' is part of a book outline, and has associated child pages. If you proceed with deletion, the child pages will be relocated automatically.');
    // Delete parent, and visit a child page.
    $this->drupalGet($this->book
        ->toUrl('delete-form'));
    $this->submitForm([], 'Delete');
    $this->drupalGet($nodes[0]->toUrl());
    $this->assertSession()
        ->statusCodeEquals(200);
    $this->assertSession()
        ->pageTextContains($nodes[0]->label());
    // The book parents should be updated.
    $node_storage = \Drupal::entityTypeManager()->getStorage('node');
    $node_storage->resetCache();
    $child = $node_storage->load($nodes[0]->id());
    $this->assertEquals($child->id(), $child->book['bid'], 'Child node book ID updated when parent is deleted.');
    // 3rd-level children should now be 2nd-level.
    $second = $node_storage->load($nodes[1]->id());
    $this->assertEquals($child->id(), $second->book['bid'], '3rd-level child node is now second level when top-level node is deleted.');
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.