You are here

public function DevelGenerateBrowserTest::testDevelGenerateContent in Devel 4.x

Same name and namespace in other branches
  1. 8.3 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));
}