function DevelGenerateCommandsTest::testDrushGenerateContent

Same name and namespace in other branches
  1. 4.x devel_generate/tests/src/Functional/DevelGenerateCommandsTest.php \Drupal\Tests\devel_generate\Functional\DevelGenerateCommandsTest::testDrushGenerateContent()

Tests generating content.

File

devel_generate/tests/src/Functional/DevelGenerateCommandsTest.php, line 148

Class

DevelGenerateCommandsTest
Test class for the Devel Generate drush commands.

Namespace

Drupal\Tests\devel_generate\Functional

Code

public function testDrushGenerateContent() : void {
  // Generate content using the minimum parameters.
  $this->drush(DevelGenerateCommands::CONTENT, [
    '21',
  ]);
  $node = Node::load(21);
  $this->assertNotEmpty($node);
  // Make sure articles get comments. Only one third of articles will have
  // comment status 'open' and therefore the ability to receive a comment.
  // However, generating 30 articles will give the likelihood of test failure
  // (i.e. no article gets a comment) as 2/3 ^ 30 = 0.00052% or 1 in 191751.
  $this->drush(DevelGenerateCommands::CONTENT, [
    '30',
    '9',
  ], [
    'kill' => NULL,
    'bundles' => 'article',
  ]);
  $comment = Comment::load(1);
  $this->assertNotEmpty($comment);
  // Generate content with a higher number that triggers batch running.
  $this->drush(DevelGenerateCommands::CONTENT, [
    '55',
  ], [
    'kill' => NULL,
  ]);
  $nodes = \Drupal::entityQuery('node')->accessCheck(FALSE)
    ->execute();
  $this->assertCount(55, $nodes);
  $messages = $this->getErrorOutput();
  $this->assertStringContainsStringIgnoringCase('Finished 55 elements created successfully.', $messages, 'devel-generate-content batch ending message not found');
  // Generate specified language. Verify base field is populated.
  $this->drush(DevelGenerateCommands::CONTENT, [
    '10',
  ], [
    'kill' => NULL,
    'languages' => 'fr',
    'base-fields' => 'phish',
  ]);
  $nodes = \Drupal::entityQuery('node')->accessCheck(FALSE)
    ->execute();
  $node = Node::load(end($nodes));
  $this->assertEquals('fr', $node->language()
    ->getId());
  $this->assertNotEmpty($node->get('phish')
    ->getString());
  // Generate content with translations.
  $this->drush(DevelGenerateCommands::CONTENT, [
    '18',
  ], [
    'kill' => NULL,
    'languages' => 'fr',
    'translations' => 'de',
  ]);
  // Only articles are enabled for translations.
  $articles = \Drupal::entityQuery('node')->accessCheck(FALSE)
    ->condition('type', 'article')
    ->execute();
  $pages = \Drupal::entityQuery('node')->accessCheck(FALSE)
    ->condition('type', 'page')
    ->execute();
  $this->assertCount(18, $articles + $pages);
  // Check that the last article has 'de' and 'fr' but no 'ca' translation.
  $node = Node::load(end($articles));
  $this->assertTrue($node->hasTranslation('de'));
  $this->assertTrue($node->hasTranslation('fr'));
  $this->assertFalse($node->hasTranslation('ca'));
  // Generate just page content with option --add-type-label.
  // Note: Use the -v verbose option to get the ending message shown when not
  // generating enough to trigger batch mode.
  // @todo Remove -v when the messages are shown for both run types.
  $this->drush(DevelGenerateCommands::CONTENT . ' -v', [
    '9',
  ], [
    'kill' => NULL,
    'bundles' => 'page',
    'add-type-label' => NULL,
  ]);
  // Count the page nodes.
  $nodes = \Drupal::entityQuery('node')->accessCheck(FALSE)
    ->condition('type', 'page')
    ->execute();
  $this->assertCount(9, $nodes);
  $messages = $this->getErrorOutput();
  $this->assertStringContainsStringIgnoringCase('Created 9 nodes', $messages, 'batch end message not found');
  // Load the final node and verify that the title starts with the label.
  $node = Node::load(end($nodes));
  $this->assertEquals('Basic Page - ', substr($node->title->value, 0, 13));
  // Generate articles with a specified users.
  $this->drush(DevelGenerateCommands::CONTENT . ' -v', [
    '10',
  ], [
    'kill' => NULL,
    'bundles' => 'article',
    'authors' => '2',
  ]);
  // Count the nodes assigned to user 2. We have two other users (0 and 1) so
  // if the code was broken and users were assigned randomly the chance that
  // this fauly would be detected is 1 - (1/3 ** 10) = 99.998%.
  $nodes = \Drupal::entityQuery('node')->accessCheck(FALSE)
    ->condition('type', 'article')
    ->condition('uid', [
    '2',
  ], 'IN')
    ->execute();
  $this->assertCount(10, $nodes);
  // Generate page content using the 'roles' option to select authors based
  // on the roles that the user has. For this we need a new user with a
  // distinct role.
  $userA = $this->drupalCreateUser([
    'access content',
  ]);
  $roleA = $userA->getRoles()[1];
  $this->drush(DevelGenerateCommands::CONTENT . ' -v', [
    '8',
  ], [
    'kill' => NULL,
    'bundles' => 'page',
    'roles' => $roleA,
  ]);
  // Count the number of nodes assigned to User A. There are three other users
  // so if the code was broken and authors assigned randomly, the chance that
  // this test would detect the fault is 1 - (1/4 ^ 8) = 99.998%.
  $nodesA = \Drupal::entityQuery('node')->accessCheck(FALSE)
    ->condition('type', 'page')
    ->condition('uid', $userA->id())
    ->execute();
  $this->assertCount(8, $nodesA, 'User A should have all the generated content');
  // Repeat the above using two roles and two users.
  $userB = $this->drupalCreateUser([
    'create page content',
  ]);
  $roleB = $userB->getRoles()[1];
  $this->drush(DevelGenerateCommands::CONTENT . ' -v', [
    '20',
  ], [
    'kill' => NULL,
    'bundles' => 'page',
    'roles' => sprintf('%s, %s', $roleA, $roleB),
  ]);
  // Count the nodes assigned to users A and B.  There are three other users
  // so if the code was broken and users were assigned randomly the chance
  // that the test would detect the fault is 1 - (2/5 ^ 20) = 99.999%.
  $nodesA = \Drupal::entityQuery('node')->accessCheck(FALSE)
    ->condition('type', 'page')
    ->condition('uid', $userA->id())
    ->execute();
  $nodesB = \Drupal::entityQuery('node')->accessCheck(FALSE)
    ->condition('type', 'page')
    ->condition('uid', $userB->id())
    ->execute();
  $this->assertGreaterThan(0, count($nodesA), 'User A should have some content');
  $this->assertGreaterThan(0, count($nodesB), 'User B should have some content');
  $this->assertCount(20, $nodesA + $nodesB);
}