Commit 7e026d6b authored by Harumi Jang's avatar Harumi Jang 🤠 Committed by Tim Plunkett
Browse files

Issue #3280721 by hooroomoo, fjgarlin, narendraR, tim.plunkett: Create test fixture

parent ba351a18
Loading
Loading
Loading
Loading
+1214 −0

File added.

Preview size limit exceeded, changes collapsed.

+4 −0
Original line number Diff line number Diff line
name: Project Browser test
type: module
description: 'Support module for testing Project Browser.'
core_version_requirement: ^9 || ^10
+66 −0
Original line number Diff line number Diff line
<?php

/**
 * @file
 * Contains install and update functions for testing Project Browser.
 */

use Drupal\Component\Serialization\Json;
use Drupal\Core\Database\Database;

/**
 * Replace Project Browser data with test data.
 */
function project_browser_test_install() {
  $connection = Database::getConnection();
  $connection->truncate('project_browser_projects')->execute();
  $connection->truncate('project_browser_categories')->execute();

  $module_path = \Drupal::service('module_handler')->getModule('project_browser')->getPath();

  $category_values = [];
  $projects = Json::decode(file_get_contents($module_path . '/tests/fixtures/projects_fixture.json'));
  // Insert fixture data to the database.
  $query = $connection->insert('project_browser_projects')->fields([
    'nid',
    'title',
    'author',
    'created',
    'changed',
    'project_usage_total',
    'maintenance_status',
    'development_status',
    'status',
    'field_security_advisory_coverage',
    'flag_project_star_user_count',
    'field_project_type',
    'project_data',
  ]);
  foreach ($projects as $project) {
    // Serialize all the project data.
    $project_data = $project['project_data'];
    unset($project['project_data']);
    $project['project_data'] = serialize($project_data + $project);

    // Gather the module categories.
    if (!empty($project_data['taxonomy_vocabulary_3'])) {
      foreach ($project_data['taxonomy_vocabulary_3'] as $category) {
        $category_values[$category['id'] . '.' . $project['nid']] = [
          'tid' => $category['id'],
          'pid' => $project['nid'],
        ];
      }
    }
    $query->values($project);
  }
  $query->execute();

  $category_query = $connection->insert('project_browser_categories')->fields([
    'tid',
    'pid',
  ]);
  foreach ($category_values as $category) {
    $category_query->values($category);
  }
  $category_query->execute();
}
+146 −2
Original line number Diff line number Diff line
@@ -7,6 +7,11 @@ use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
/**
 * Provides tests for the Project Browser UI.
 *
 * These tests rely on a module that replaces Project Browser data with
 * test data.
 *
 * @see project_browser_test_install()
 *
 * @group project_browser
 */
class ProjectBrowserUiTest extends WebDriverTestBase {
@@ -16,6 +21,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase {
   */
  protected static $modules = [
    'project_browser',
    'project_browser_test',
  ];

  /**
@@ -28,7 +34,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase {
   */
  protected function setUp(): void {
    parent::setUp();

    $this->config('project_browser.admin_settings')->set('enabled_source', 'drupalorg_mockapi')->save(TRUE);
    $this->drupalLogin($this->drupalCreateUser([
      'administer modules',
    ]));
@@ -45,7 +51,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase {
    $grid_text = $this->getSession()->getPage()->find('css', '#project-browser .toggle-buttons .grid-button')->getText();
    $this->assertEquals('Grid', $grid_text);
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->elementsCount('css', '#project-browser .project', 12);
    $assert_session->elementsCount('css', '#project-browser .project', 3);
    $assert_session->pageTextNotContains('No records available');
  }

@@ -60,4 +66,142 @@ class ProjectBrowserUiTest extends WebDriverTestBase {
    $assert_session->elementsCount('css', '.views-exposed-form__item input[type="checkbox"]', 54);
  }

  /**
   * Tests paging through results.
   */
  public function testPaging(): void {
    $page = $this->getSession()->getPage();
    $assert_session = $this->assertSession();

    $this->drupalGet('admin/modules/browse');
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->pageTextContains('3 Results');
    $assert_session->elementsCount('css', '.pager__item--number', 1);

    $page->clickLink('Clear filters');
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->pageTextContains('25 Results');
    $assert_session->elementsCount('css', '.pager__item--number', 3);

    $assert_session->elementTextContains('css', '#project-browser .project', 'Jazz');
    $assert_session->elementsCount('css', '#project-browser .project', 12);
    $assert_session->elementTextContains('css', '.pager__item--active', 'Page 1');

    $page->clickLink('Go to next page');
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->elementTextContains('css', '#project-browser .project', '9 Starts With a Higher Number');
    $assert_session->elementsCount('css', '#project-browser .project', 12);

    $page->clickLink('Go to next page');
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->elementTextContains('css', '#project-browser .project', 'Astronaut Simulator');
    $assert_session->elementsCount('css', '#project-browser .project', 1);
  }

  /**
   * Tests advanced filtering.
   */
  public function testAdvancedFiltering(): void {
    $page = $this->getSession()->getPage();
    $assert_session = $this->assertSession();

    $this->drupalGet('admin/modules/browse');
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->pageTextContains('3 Results');
    $assert_session->elementTextContains('css', '#project-browser', 'Kangaroo');
    $assert_session->elementTextContains('css', '#project-browser', '9 Starts With a Higher Number');
    $assert_session->elementTextContains('css', '#project-browser', 'Astronaut Simulator');
    $second_filter_selector = 'p.filters-applied:nth-child(3)';
    $second_filter_element = $page->find('css', $second_filter_selector);
    // Make sure the second filter applied is the security covered filter.
    $this->assertEquals('Covered', $second_filter_element->getText());
    // Clear the security covered filter.
    $this->click("$second_filter_selector > button");
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->pageTextContains('5 Results');
    $assert_session->elementTextContains('css', '#project-browser', 'Jazz');
    $assert_session->elementTextContains('css', '#project-browser', 'Kangaroo');
    $assert_session->elementTextContains('css', '#project-browser', '9 Starts With a Higher Number');
    $assert_session->elementTextContains('css', '#project-browser', '1 Starts With a Number');
    $assert_session->elementTextContains('css', '#project-browser', 'Astronaut Simulator');
    $filter_icon_selector = $page->find('css', '.filter-icon');
    $filter_icon_selector->click();

    // Click the Seeking new maintainer filter.
    $seeking_new_maintainer_element = $page->find('css', '.filter-group:nth-child(2) .filter-option:nth-child(4) > input');
    $seeking_new_maintainer_element->click();
    // Make sure the correct filter was applied.
    $this->assertEquals('Seeking new maintainer', $second_filter_element->getText());
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->pageTextContains('8 Results');
    $assert_session->elementTextContains('css', '#project-browser', 'Jazz');
    $assert_session->elementTextContains('css', '#project-browser', 'Kangaroo');
    $assert_session->elementTextContains('css', '#project-browser', '9 Starts With a Higher Number');
    $assert_session->elementTextContains('css', '#project-browser', '1 Starts With a Number');
    $assert_session->elementTextContains('css', '#project-browser', 'Astronaut Simulator');
    $assert_session->elementTextContains('css', '#project-browser', 'Eggman');
    $assert_session->elementTextContains('css', '#project-browser', 'Looper');
    $assert_session->elementTextContains('css', '#project-browser', 'Doomer');

    // Click the Not covered filter.
    $not_covered_element = $page->find('css', 'input#not-covered');
    $not_covered_element->click();
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->pageTextContains('3 Results');
    $assert_session->elementTextContains('css', '#project-browser', 'Jazz');
    $assert_session->elementTextContains('css', '#project-browser', '1 Starts With a Number');
    $assert_session->elementTextContains('css', '#project-browser', 'Doomer');

    // Clear all filters.
    $page->clickLink('Clear filters');
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->pageTextContains('25 Results');

    // Click the No further development filter.
    $no_further_development_element = $page->find('css', '.filter-group:nth-child(1) .filter-option:nth-child(3) > input');
    $no_further_development_element->click();
    $first_filter_element = $page->find('css', 'p.filters-applied:nth-child(2)');
    // Make sure the correct filter was applied.
    $this->assertEquals('No Further Development', $first_filter_element->getText());
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->pageTextContains('4 Results');
    $assert_session->elementTextContains('css', '#project-browser', 'Pinky and the Brain');
    $assert_session->elementTextContains('css', '#project-browser', 'Soup');
    $assert_session->elementTextContains('css', '#project-browser', 'Quiznos');
    $assert_session->elementTextContains('css', '#project-browser', 'Ruh roh');

    // Add the Obsolete filter.
    $obsolete_element = $page->find('css', '.filter-group:nth-child(1) .filter-option:nth-child(4) > input');
    $obsolete_element->click();
    $this->assertEquals('Obsolete', $second_filter_element->getText());
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->pageTextContains('7 Results');
    $assert_session->elementTextContains('css', '#project-browser', 'Pinky and the Brain');
    $assert_session->elementTextContains('css', '#project-browser', 'Soup');
    $assert_session->elementTextContains('css', '#project-browser', 'Quiznos');
    $assert_session->elementTextContains('css', '#project-browser', 'Ruh roh');
    $assert_session->elementTextContains('css', '#project-browser', 'Tooth Fairy');
    $assert_session->elementTextContains('css', '#project-browser', 'Vitamin C');
    $assert_session->elementTextContains('css', '#project-browser', 'Unwritten');

    // Click the Unsupported filter.
    $obsolete_element = $page->find('css', '.filter-group:nth-child(2) .filter-option:nth-child(5) > input');
    $obsolete_element->click();
    $third_filter_element = $page->find('css', 'p.filters-applied:nth-child(4)');
    $this->assertEquals('Unsupported', $third_filter_element->getText());
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->pageTextContains('3 Results');
    $assert_session->elementTextContains('css', '#project-browser', 'Tooth Fairy');
    $assert_session->elementTextContains('css', '#project-browser', 'Soup');
    $assert_session->elementTextContains('css', '#project-browser', 'Ruh roh');

    // Clear the Obsolete filter.
    $this->assertEquals('Obsolete', $second_filter_element->getText());
    $this->click("$second_filter_selector > button");
    $assert_session->waitForElementVisible('css', '#project-browser .project');
    $assert_session->pageTextContains('2 Results');
    $assert_session->elementTextContains('css', '#project-browser', 'Soup');
    $assert_session->elementTextContains('css', '#project-browser', 'Ruh roh');
  }

}