function DevelGenerateCommandsTest::testDrushGenerateContent

Same name 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);
}