function DevelGenerateBrowserTest::testDevelGenerateContent

Same name in other branches
  1. 5.x devel_generate/tests/src/Functional/DevelGenerateBrowserTest.php \Drupal\Tests\devel_generate\Functional\DevelGenerateBrowserTest::testDevelGenerateContent()

Tests generating content.

File

devel_generate/tests/src/Functional/DevelGenerateBrowserTest.php, line 34

Class

DevelGenerateBrowserTest
Tests the logic to generate data.

Namespace

Drupal\Tests\devel_generate\Functional

Code

public function testDevelGenerateContent() {
    // Tests that if no content types are selected an error message is shown.
    $edit = [
        'num' => 4,
        'title_length' => 4,
    ];
    $this->drupalPostForm('admin/config/development/generate/content', $edit, 'Generate');
    $this->assertText('Please select at least one content type');
    // Create a node in order to test the Delete content checkbox.
    $this->drupalCreateNode([
        'type' => 'article',
    ]);
    // Generate articles with comments and aliases.
    $edit = [
        'num' => 4,
        'kill' => TRUE,
        'node_types[article]' => TRUE,
        'time_range' => 604800,
        'max_comments' => 3,
        'title_length' => 4,
        'add_alias' => 1,
    ];
    $this->drupalPostForm('admin/config/development/generate/content', $edit, 'Generate');
    $this->assertSession()
        ->pageTextContains('Deleted 1 node');
    $this->assertSession()
        ->pageTextContains('Created 4 nodes');
    $this->assertSession()
        ->pageTextContains('Generate process complete.');
    $this->assertSession()
        ->pageTextNotContains('translations');
    // Tests that nodes have been created in the generation process.
    $nodes = Node::loadMultiple();
    $this->assert(count($nodes) == 4, 'Nodes generated successfully.');
    // Tests url alias for the generated nodes.
    foreach ($nodes as $node) {
        $alias = 'node-' . $node->id() . '-' . $node->bundle();
        $this->drupalGet($alias);
        $this->assertSession()
            ->statusCodeEquals('200');
        $this->assertSession()
            ->pageTextContains($node->getTitle(), 'Generated url alias for the node works.');
    }
    // Generate articles with translations.
    $edit = [
        'num' => 3,
        'kill' => TRUE,
        'node_types[article]' => TRUE,
        'add_language[]' => [
            'en',
        ],
        'translate_language[]' => [
            'de',
            'ca',
        ],
        'add_alias' => TRUE,
    ];
    $this->drupalPostForm('admin/config/development/generate/content', $edit, 'Generate');
    $this->assertSession()
        ->pageTextContains('Deleted 4 nodes');
    $this->assertSession()
        ->pageTextContains('Created 3 nodes');
    // Two translations for each node makes six.
    $this->assertSession()
        ->pageTextContains('Created 6 node translations');
    $articles = \Drupal::entityQuery('node')->execute();
    $this->assertCount(3, $articles);
    $node = Node::load(end($articles));
    $this->assertTrue($node->hasTranslation('de'));
    $this->assertTrue($node->hasTranslation('ca'));
    $this->assertFalse($node->hasTranslation('fr'));
    // Check url alias for each of the translations.
    foreach (Node::loadMultiple($articles) as $node) {
        foreach ([
            'de',
            'ca',
        ] as $langcode) {
            $translation_node = $node->getTranslation($langcode);
            $alias = 'node-' . $translation_node->id() . '-' . $translation_node->bundle() . '-' . $langcode;
            $this->drupalGet($langcode . '/' . $alias);
            $this->assertSession()
                ->statusCodeEquals('200');
            $this->assertSession()
                ->pageTextContains($translation_node->getTitle());
        }
    }
    // Create article to make sure it is not deleted when only killing pages.
    $article = $this->drupalCreateNode([
        'type' => 'article',
        'title' => 'Alive',
    ]);
    // The 'page' content type is not enabled for translation.
    $edit = [
        'num' => 2,
        'kill' => TRUE,
        'node_types[page]' => TRUE,
        'add_language[]' => [
            'en',
        ],
        'translate_language[]' => [
            'fr',
        ],
    ];
    $this->drupalPostForm('admin/config/development/generate/content', $edit, 'Generate');
    $this->assertSession()
        ->pageTextNotContains('Deleted');
    $this->assertSession()
        ->pageTextContains('Created 2 nodes');
    $this->assertSession()
        ->pageTextNotContains('node translations');
    // Check that 'kill' has not deleted the article.
    $this->assertNotEmpty(Node::load($article->id()));
    $pages = \Drupal::entityQuery('node')->condition('type', 'page')
        ->execute();
    $this->assertCount(2, $pages);
    $node = Node::load(end($pages));
    $this->assertFalse($node->hasTranslation('fr'));
    // Create articles with add-type-label option.
    $edit = [
        'num' => 5,
        'kill' => TRUE,
        'node_types[article]' => TRUE,
        'add_type_label' => TRUE,
    ];
    $this->drupalPostForm('admin/config/development/generate/content', $edit, 'Generate');
    $this->assertSession()
        ->pageTextContains('Created 5 nodes');
    $this->assertSession()
        ->pageTextContains('Generate process complete');
    // Count the articles created in the generation process.
    $nodes = \Drupal::entityQuery('node')->condition('type', 'article')
        ->execute();
    $this->assertCount(5, $nodes);
    // Load the final node and verify that the title starts with the label.
    $node = Node::load(end($nodes));
    $this->assertEquals('Article - ', substr($node->title->value, 0, 10));
    // Test creating content with specified authors. First create 15 more users
    // making 18 in total, to make the test much stronger.
    for ($i = 0; $i < 15; $i++) {
        $this->drupalCreateUser();
    }
    $edit = [
        'num' => 10,
        'kill' => TRUE,
        'node_types[article]' => TRUE,
        'authors[3]' => TRUE,
        'authors[4]' => TRUE,
    ];
    $this->drupalPostForm('admin/config/development/generate/content', $edit, 'Generate');
    // Display the full content list for information and debug only.
    $this->drupalGet('admin/content');
    // Count all the articles by user 3 and 4 and by others. We count the two
    // users nodes separately to ensure that there are some by each user.
    $nodes_by_user_3 = \Drupal::entityQuery('node')->condition('type', 'article')
        ->condition('uid', [
        '3',
    ], 'IN')
        ->execute();
    $nodes_by_user_4 = \Drupal::entityQuery('node')->condition('type', 'article')
        ->condition('uid', [
        '4',
    ], 'IN')
        ->execute();
    $nodes_by_others = \Drupal::entityQuery('node')->condition('type', 'article')
        ->condition('uid', [
        '3',
        '4',
    ], 'NOT IN')
        ->execute();
    // If the user option was not working correctly and users were assigned at
    // random, then the chance that these assertions will correctly detect the
    // error is 1 - (2/18 ** 10) = 99.99%.
    $this->assertEquals(10, count($nodes_by_user_3) + count($nodes_by_user_4));
    $this->assertCount(0, $nodes_by_others);
    // If the user option is coded correctly the chance of either of these
    // assertions giving a false failure is 1/2 ** 10 = 0.097%.
    $this->assertGreaterThan(0, count($nodes_by_user_3));
    $this->assertGreaterThan(0, count($nodes_by_user_4));
}