ArgumentValidatorTermNameTest.php

Same filename and directory in other branches
  1. 9 core/modules/taxonomy/tests/src/Kernel/Views/ArgumentValidatorTermNameTest.php
  2. 10 core/modules/taxonomy/tests/src/Kernel/Views/ArgumentValidatorTermNameTest.php

Namespace

Drupal\Tests\taxonomy\Kernel\Views

File

core/modules/taxonomy/tests/src/Kernel/Views/ArgumentValidatorTermNameTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\taxonomy\Kernel\Views;

use Drupal\taxonomy\Entity\Vocabulary;
use Drupal\views\Views;

/**
 * Tests the plugin of the taxonomy: taxonomy_term_name argument validator.
 *
 * @group taxonomy
 */
class ArgumentValidatorTermNameTest extends TaxonomyTestBase {
  
  /**
   * Stores the taxonomy term used by this test.
   *
   * @var array
   */
  protected $terms = [];
  
  /**
   * Stores the taxonomy names used by this test.
   *
   * @var array
   */
  protected $names = [];
  
  /**
   * Stores the taxonomy IDs used by this test.
   *
   * @var array
   */
  protected $ids = [];
  
  /**
   * {@inheritdoc}
   */
  public static $testViews = [
    'test_taxonomy_name_argument',
  ];
  
  /**
   * {@inheritdoc}
   */
  protected function setUp($import_test_views = TRUE) : void {
    parent::setUp($import_test_views);
    // Add three terms to the 'tags' vocabulary.
    for ($i = 0; $i < 3; $i++) {
      $this->terms[] = $term = $this->createTerm();
      $this->names[] = $term->label();
      $this->ids[] = $term->id();
    }
    // Create a second vocabulary.
    $vocabulary2 = Vocabulary::create([
      'name' => 'Views testing tags 2',
      'vid' => 'views_testing_tags_2',
    ]);
    $vocabulary2->save();
    // Add term in this vocabulary that has same name as term 3.
    $duplicate = $this->createTerm([
      'name' => $this->names[2],
      'vid' => 'views_testing_tags_2',
    ]);
    $this->terms[] = $duplicate;
    $this->names[] = $duplicate->label();
    $this->ids[] = $duplicate->id();
    // Add uniquely named term in second vocab as well.
    $unique = $this->createTerm([
      'vid' => 'views_testing_tags_2',
    ]);
    $this->terms[] = $unique;
    $this->names[] = $unique->label();
    $this->ids[] = $unique->id();
  }
  
  /**
   * Tests the term name argument validator plugin.
   */
  public function testArgumentValidatorTermName() : void {
    $view = Views::getView('test_taxonomy_name_argument');
    $view->initHandlers();
    // Test with name that does not correspond to any term.
    $this->assertFalse($view->argument['name']
      ->setArgument('not a term name'));
    $view->argument['name']->validated_title = NULL;
    $view->argument['name']->argument_validated = NULL;
    // Test with term in the wrong vocabulary.
    $this->assertFalse($view->argument['name']
      ->setArgument($this->names[4]));
    $view->argument['name']->validated_title = NULL;
    $view->argument['name']->argument_validated = NULL;
    // Test with a couple valid names.
    $this->assertTrue($view->argument['name']
      ->setArgument($this->names[0]));
    $this->assertEquals($this->names[0], $view->argument['name']
      ->getTitle());
    $view->argument['name']->validated_title = NULL;
    $view->argument['name']->argument_validated = NULL;
    $this->assertTrue($view->argument['name']
      ->setArgument($this->names[1]));
    $this->assertEquals($this->names[1], $view->argument['name']
      ->getTitle());
    $view->argument['name']->validated_title = NULL;
    $view->argument['name']->argument_validated = NULL;
    // Test that multiple valid terms don't validate because multiple arguments
    // are currently not supported.
    $multiple_terms = $this->names[0] . '+' . $this->names[1];
    $this->assertFalse($view->argument['name']
      ->setArgument($multiple_terms));
    $view->argument['name']->validated_title = NULL;
    $view->argument['name']->argument_validated = NULL;
    // Test term whose name is shared by term in disallowed bundle.
    $this->assertTrue($view->argument['name']
      ->setArgument($this->names[2]));
    $this->assertEquals($this->names[2], $view->argument['name']
      ->getTitle());
    $view->argument['name']->validated_title = NULL;
    $view->argument['name']->argument_validated = NULL;
    // Add the second vocabulary as an allowed bundle.
    $view->argument['name']->options['validate_options']['bundles']['views_testing_tags_2'] = 'views_testing_tags_2';
    // Test that an array of bundles is handled by passing terms with unique
    // names in each bundle.
    $this->assertTrue($view->argument['name']
      ->setArgument($this->names[0]));
    $this->assertEquals($this->names[0], $view->argument['name']
      ->getTitle());
    $view->argument['name']->validated_title = NULL;
    $view->argument['name']->argument_validated = NULL;
    $this->assertTrue($view->argument['name']
      ->setArgument($this->names[4]));
    $this->assertEquals($this->names[4], $view->argument['name']
      ->getTitle());
    $view->argument['name']->validated_title = NULL;
    $view->argument['name']->argument_validated = NULL;
    // Allow any and all bundles.
    $view->argument['name']->options['validate_options']['bundles'] = [];
    // Test that an empty array of bundles is handled by testing terms with
    // unique names in each bundle.
    $this->assertTrue($view->argument['name']
      ->setArgument($this->names[0]));
    $this->assertEquals($this->names[0], $view->argument['name']
      ->getTitle());
    $view->argument['name']->validated_title = NULL;
    $view->argument['name']->argument_validated = NULL;
    $this->assertTrue($view->argument['name']
      ->setArgument($this->names[4]));
    $this->assertEquals($this->names[4], $view->argument['name']
      ->getTitle());
  }
  
  /**
   * Tests the access checking in term name argument validator plugin.
   */
  public function testArgumentValidatorTermNameAccess() : void {
    $this->installConfig([
      'user',
    ]);
    $this->setCurrentUser($this->createUser([
      'access content',
    ]));
    $view = Views::getView('test_taxonomy_name_argument');
    $view->initHandlers();
    // Enable access checking on validator.
    $view->argument['name']->options['validate_options']['access'] = TRUE;
    // Allow all bundles.
    $view->argument['name']->options['validate_options']['bundles'] = [];
    // A uniquely named unpublished term in an allowed bundle.
    $this->terms[0]
      ->setUnpublished()
      ->save();
    $this->assertFalse($view->argument['name']
      ->setArgument($this->names[0]));
    $view->argument['name']->validated_title = NULL;
    $view->argument['name']->argument_validated = NULL;
    // A name used by two terms in a single vocabulary. One is unpublished.
    // We re-name the second term to match the first one.
    $this->terms[1]
      ->set('name', $this->names[0])
      ->save();
    $this->names[1] = $this->terms[1]
      ->label();
    $this->assertTrue($view->argument['name']
      ->setArgument($this->names[0]));
    $this->assertEquals($this->names[0], $view->argument['name']
      ->getTitle());
    $view->argument['name']->validated_title = NULL;
    $view->argument['name']->argument_validated = NULL;
    // A name shared by a term in each vocabulary. One is unpublished.
    $this->terms[3]
      ->setUnpublished()
      ->save();
    $this->assertTrue($view->argument['name']
      ->setArgument($this->names[3]));
    $this->assertEquals($this->names[3], $view->argument['name']
      ->getTitle());
  }

}

Classes

Title Deprecated Summary
ArgumentValidatorTermNameTest Tests the plugin of the taxonomy: taxonomy_term_name argument validator.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.