You are here

TaxonomyTermFilterDepthTest.php in Drupal 9

File

core/modules/taxonomy/tests/src/Functional/Views/TaxonomyTermFilterDepthTest.php
View source
<?php

namespace Drupal\Tests\taxonomy\Functional\Views;

use Drupal\views\Views;

/**
 * Test the taxonomy term with depth filter.
 *
 * @group taxonomy
 */
class TaxonomyTermFilterDepthTest extends TaxonomyTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'taxonomy',
    'taxonomy_test_views',
    'views',
    'node',
  ];

  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';

  /**
   * {@inheritdoc}
   */
  public static $testViews = [
    'test_filter_taxonomy_index_tid_depth',
  ];

  /**
   * @var \Drupal\taxonomy\TermInterface[]
   */
  protected $terms = [];

  /**
   * @var \Drupal\views\ViewExecutable
   */
  protected $view;

  /**
   * {@inheritdoc}
   */
  protected function setUp($import_test_views = TRUE) : void {
    parent::setUp($import_test_views);

    // Create a hierarchy 3 deep. Note the parent setup function creates two
    // top-level terms w/o children.
    $first = $this
      ->createTerm([
      'name' => 'First',
    ]);
    $second = $this
      ->createTerm([
      'name' => 'Second',
      'parent' => $first
        ->id(),
    ]);
    $third = $this
      ->createTerm([
      'name' => 'Third',
      'parent' => $second
        ->id(),
    ]);

    // Create a node w/o any terms.
    $settings = [
      'type' => 'article',
    ];
    $this->nodes[] = $this
      ->drupalCreateNode($settings);

    // Create a node with only the top level term.
    $settings['field_views_testing_tags'][0]['target_id'] = $first
      ->id();
    $this->nodes[] = $this
      ->drupalCreateNode($settings);

    // Create a node with only the third level term.
    $settings['field_views_testing_tags'][0]['target_id'] = $third
      ->id();
    $this->nodes[] = $this
      ->drupalCreateNode($settings);
    $this->terms[0] = $first;
    $this->terms[1] = $second;
    $this->terms[2] = $third;
    $this->view = Views::getView('test_filter_taxonomy_index_tid_depth');

    // Fix the created date to match the expectations of the order by in the
    // view. Node 1 should be the most recent node and node 6 should be the
    // oldest.
    $request_time = \Drupal::time()
      ->getRequestTime();
    foreach ($this->nodes as $i => $node) {
      $node
        ->setCreatedTime($request_time - $i)
        ->save();
    }
  }

  /**
   * Tests the terms with depth filter.
   */
  public function testTermWithDepthFilter() {
    $column_map = [
      'nid' => 'nid',
    ];
    $assert_method = 'assertIdentical';

    // Default view has an empty value for this filter, so all nodes should be
    // returned.
    $expected = [
      [
        'nid' => 1,
      ],
      [
        'nid' => 2,
      ],
      [
        'nid' => 3,
      ],
      [
        'nid' => 4,
      ],
      [
        'nid' => 5,
      ],
    ];
    $this
      ->executeView($this->view);
    $this
      ->assertIdenticalResultsetHelper($this->view, $expected, $column_map, $assert_method);

    // Set filter to search on top-level term, with depth 0.
    $expected = [
      [
        'nid' => 4,
      ],
    ];
    $this
      ->assertTermWithDepthResult($this->terms[0]
      ->id(), 0, $expected);

    // Top-level term, depth 1.
    $expected = [
      [
        'nid' => 4,
      ],
    ];
    $this
      ->assertTermWithDepthResult($this->terms[0]
      ->id(), 0, $expected);

    // Top-level term, depth 2.
    $expected = [
      [
        'nid' => 4,
      ],
      [
        'nid' => 5,
      ],
    ];
    $this
      ->assertTermWithDepthResult($this->terms[0]
      ->id(), 2, $expected);

    // Second-level term, depth 1.
    $expected = [
      [
        'nid' => 5,
      ],
    ];
    $this
      ->assertTermWithDepthResult($this->terms[1]
      ->id(), 1, $expected);

    // Third-level term, depth 0.
    $expected = [
      [
        'nid' => 5,
      ],
    ];
    $this
      ->assertTermWithDepthResult($this->terms[2]
      ->id(), 0, $expected);

    // Third-level term, depth 1.
    $expected = [
      [
        'nid' => 5,
      ],
    ];
    $this
      ->assertTermWithDepthResult($this->terms[2]
      ->id(), 1, $expected);

    // Third-level term, depth -2.
    $expected = [
      [
        'nid' => 4,
      ],
      [
        'nid' => 5,
      ],
    ];
    $this
      ->assertTermWithDepthResult($this->terms[2]
      ->id(), -2, $expected);
  }

  /**
   * Changes the tid filter to given term and depth.
   *
   * @param int $tid
   *   The term ID to filter on.
   * @param int $depth
   *   The depth to search.
   * @param array $expected
   *   The expected views result.
   */
  protected function assertTermWithDepthResult($tid, $depth, array $expected) {
    $this->view
      ->destroy();
    $this->view
      ->initDisplay();
    $filters = $this->view->displayHandlers
      ->get('default')
      ->getOption('filters');
    $filters['tid_depth']['depth'] = $depth;
    $filters['tid_depth']['value'] = [
      $tid,
    ];
    $this->view->displayHandlers
      ->get('default')
      ->setOption('filters', $filters);
    $this
      ->executeView($this->view);
    $this
      ->assertIdenticalResultsetHelper($this->view, $expected, [
      'nid' => 'nid',
    ], 'assertIdentical');
  }

}

Classes

Namesort descending Description
TaxonomyTermFilterDepthTest Test the taxonomy term with depth filter.