You are here

public function PrepareUninstallTest::testUninstall in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/system/tests/src/Functional/Module/PrepareUninstallTest.php \Drupal\Tests\system\Functional\Module\PrepareUninstallTest::testUninstall()

Tests that Node and Taxonomy can be uninstalled.

File

core/modules/system/tests/src/Functional/Module/PrepareUninstallTest.php, line 72

Class

PrepareUninstallTest
Tests that modules which provide entity types can be uninstalled.

Namespace

Drupal\Tests\system\Functional\Module

Code

public function testUninstall() {

  // Check that Taxonomy cannot be uninstalled yet.
  $this
    ->drupalGet('admin/modules/uninstall');
  $this
    ->assertText('Remove content items');
  $this
    ->assertLinkByHref('admin/modules/uninstall/entity/taxonomy_term');

  // Delete Taxonomy term data.
  $this
    ->drupalGet('admin/modules/uninstall/entity/taxonomy_term');
  $term_count = count($this->terms);
  for ($i = 1; $i < 11; $i++) {
    $this
      ->assertText($this->terms[$term_count - $i]
      ->label());
  }
  $term_count = $term_count - 10;
  $this
    ->assertText("And {$term_count} more taxonomy terms.");
  $this
    ->assertText('This action cannot be undone.');
  $this
    ->assertText('Make a backup of your database if you want to be able to restore these items.');
  $this
    ->drupalPostForm(NULL, [], t('Delete all taxonomy terms'));

  // Check that we are redirected to the uninstall page and data has been
  // removed.
  $this
    ->assertUrl('admin/modules/uninstall', []);
  $this
    ->assertText('All taxonomy terms have been deleted.');

  // Check that there is no more data to be deleted, Taxonomy is ready to be
  // uninstalled.
  $this
    ->assertText('Enables the categorization of content.');
  $this
    ->assertNoLinkByHref('admin/modules/uninstall/entity/taxonomy_term');

  // Uninstall the Taxonomy module.
  $this
    ->drupalPostForm('admin/modules/uninstall', [
    'uninstall[taxonomy]' => TRUE,
  ], t('Uninstall'));
  $this
    ->drupalPostForm(NULL, [], t('Uninstall'));
  $this
    ->assertText('The selected modules have been uninstalled.');
  $this
    ->assertNoText('Enables the categorization of content.');

  // Check Node cannot be uninstalled yet, there is content to be removed.
  $this
    ->drupalGet('admin/modules/uninstall');
  $this
    ->assertText('Remove content items');
  $this
    ->assertLinkByHref('admin/modules/uninstall/entity/node');

  // Delete Node data.
  $this
    ->drupalGet('admin/modules/uninstall/entity/node');

  // All 10 nodes should be listed.
  foreach ($this->nodes as $node) {
    $this
      ->assertText($node
      ->label());
  }

  // Ensures there is no more count when not necessary.
  $this
    ->assertNoText('And 0 more content');
  $this
    ->assertText('This action cannot be undone.');
  $this
    ->assertText('Make a backup of your database if you want to be able to restore these items.');

  // Create another node so we have 11.
  $this->nodes[] = $this
    ->drupalCreateNode([
    'type' => 'page',
  ]);
  $this
    ->drupalGet('admin/modules/uninstall/entity/node');

  // Ensures singular case is used when a single entity is left after listing
  // the first 10's labels.
  $this
    ->assertText('And 1 more content item.');

  // Create another node so we have 12.
  $this->nodes[] = $this
    ->drupalCreateNode([
    'type' => 'article',
  ]);
  $this
    ->drupalGet('admin/modules/uninstall/entity/node');

  // Ensures singular case is used when a single entity is left after listing
  // the first 10's labels.
  $this
    ->assertText('And 2 more content items.');
  $this
    ->drupalPostForm(NULL, [], t('Delete all content items'));

  // Check we are redirected to the uninstall page and data has been removed.
  $this
    ->assertUrl('admin/modules/uninstall', []);
  $this
    ->assertText('All content items have been deleted.');

  // Check there is no more data to be deleted, Node is ready to be
  // uninstalled.
  $this
    ->assertText('Allows content to be submitted to the site and displayed on pages.');
  $this
    ->assertNoLinkByHref('admin/modules/uninstall/entity/node');

  // Uninstall Node module.
  $this
    ->drupalPostForm('admin/modules/uninstall', [
    'uninstall[node]' => TRUE,
  ], t('Uninstall'));
  $this
    ->drupalPostForm(NULL, [], t('Uninstall'));
  $this
    ->assertText('The selected modules have been uninstalled.');
  $this
    ->assertNoText('Allows content to be submitted to the site and displayed on pages.');

  // Ensure a 404 is returned when accessing a non-existent entity type.
  $this
    ->drupalGet('admin/modules/uninstall/entity/node');
  $this
    ->assertSession()
    ->statusCodeEquals(404);

  // Test an entity type which does not have any existing entities.
  $this
    ->drupalGet('admin/modules/uninstall/entity/entity_test_no_label');
  $this
    ->assertText('There are 0 entity test without label entities to delete.');
  $button_xpath = '//input[@type="submit"][@value="Delete all entity test without label entities"]';
  $this
    ->assertNoFieldByXPath($button_xpath, NULL, 'Button with value "Delete all entity test without label entities" not found');

  // Test an entity type without a label.

  /** @var \Drupal\Core\Entity\EntityStorageInterface $storage */
  $storage = $this->container
    ->get('entity_type.manager')
    ->getStorage('entity_test_no_label');
  $storage
    ->create([
    'id' => mb_strtolower($this
      ->randomMachineName()),
    'name' => $this
      ->randomMachineName(),
  ])
    ->save();
  $this
    ->drupalGet('admin/modules/uninstall/entity/entity_test_no_label');
  $this
    ->assertText('This will delete 1 entity test without label.');
  $this
    ->assertFieldByXPath($button_xpath, NULL, 'Button with value "Delete all entity test without label entities" found');
  $storage
    ->create([
    'id' => mb_strtolower($this
      ->randomMachineName()),
    'name' => $this
      ->randomMachineName(),
  ])
    ->save();
  $this
    ->drupalGet('admin/modules/uninstall/entity/entity_test_no_label');
  $this
    ->assertText('This will delete 2 entity test without label entities.');
}