improvements-2.x-dev/modules/improvements_views/tests/src/Functional/ImprovementsViewsTest.php
modules/improvements_views/tests/src/Functional/ImprovementsViewsTest.php
<?php
namespace Drupal\Tests\improvements_views\Functional;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\taxonomy\Entity\Vocabulary;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\improvements\Traits\ImprovementsTestTrait;
use Drupal\Tests\node\Traits\NodeCreationTrait;
use Drupal\Tests\taxonomy\Traits\TaxonomyTestTrait;
use Drupal\views\ViewExecutable;
class ImprovementsViewsTest extends BrowserTestBase {
use ImprovementsTestTrait;
use NodeCreationTrait;
use TaxonomyTestTrait;
/**
* {@inheritDoc}
*/
protected $defaultTheme = 'stark';
/**
* {@inheritDoc}
*/
protected static $modules = ['improvements_views'];
/**
* {@inheritDoc}
*/
protected function setUp(): void {
parent::setUp();
}
/**
* Test "entity_reference_views_formatter" formatter.
*
* @covers \Drupal\improvements_views\Plugin\Field\FieldFormatter\EntityReferenceViewsFormatter
*/
public function testFieldFormatterEntityReferenceViews(): void {
$this->installModule('node', 'improvements_views_test', 'field', 'field_ui');
$this->createContentType(['type' => 'page', 'name' => 'Page']);
$field_name = 'field_views_formatter_test';
$views_name = 'test_entity_reference_views_formatter';
$this->createField(
entity_type: 'node',
entity_bundle: 'page',
field_name: $field_name,
field_type: 'entity_reference',
field_label: 'Entity reference',
storage_settings: ['cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED],
formatter_type: 'entity_reference_views_formatter',
formatter_options: ['weight' => 0],
);
$this->drupalLoginAsRoot();
$this->drupalGet('/admin/structure/types/manage/page/display');
$this->dontSeeErrorMessage();
$web_assert = $this->assertSession();
$web_assert->elementExists('css', 'option[value="entity_reference_views_formatter"][selected]');
$this->openEntityDisplayComponentSettings($field_name);
$web_assert->elementExists('css', 'select[name="fields[' . $field_name . '][settings_edit_form][settings][views]"]');
$web_assert->elementExists('css', 'option[value="' . $views_name . ':default"]');
$this->submitForm([
'fields[' . $field_name . '][settings_edit_form][settings][views]' => $views_name . ':default',
], 'Save');
$this->dontSeeErrorMessage();
$web_assert->pageTextContains('Views: ' . $views_name . ':default');
$node1 = $this->createNode(['title' => 'Node 1 for test ' . __FUNCTION__]);
$node2 = $this->createNode(['title' => 'Node 2 for test ' . __FUNCTION__]);
$node3 = $this->createNode(['title' => 'Node 3 for test ' . __FUNCTION__]);
$node4 = $this->createNode([
'title' => 'Node 4 for test ' . __FUNCTION__,
$field_name => [
$node1->id(),
$node2->id(),
],
]);
$this->drupalGetEntityPage($node4);
$web_assert->elementExists('css', '.views-element-container');
$web_assert->pageTextContains($node1->label());
$web_assert->pageTextContains($node2->label());
$web_assert->pageTextNotContains($node3->label());
$this->drupalGetEntityPage($node3);
$web_assert->elementNotExists('css', '.views-element-container');
}
/**
* Test Views field plugin "map".
*
* @covers \Drupal\improvements_views\Plugin\views\field\Map
*/
public function testViewsPluginFieldMap(): void {
$this->installModule('node', 'improvements_views_test');
$this->createContentType(['type' => 'page', 'name' => 'Page']);
$node = $this->createNode([
'title' => 'Node for test ' . __FUNCTION__,
'test_map_field' => [
'foo' => [
'bar' => 'Hello world!',
],
],
]);
$views_build = views_embed_view('test_views_map_field_plugin');
$renderer = $this->container->get('renderer');
$views_output = (string)$renderer->renderRoot($views_build);
$this->assertStringContainsString('<span class="field-content">Hello world!</span>', $views_output);
}
/**
* Test Views extended numeric filter.
*
* @covers \Drupal\improvements_views\Plugin\views\filter\ExtendedNumericFilter
*/
public function testViewsPluginFilterExtendedNumeric(): void {
$this->installModule('node', 'views_ui');
$view_config_entity = $this->createView([
'id' => 'test_extended_numeric_filter',
'label' => 'Test extended numeric filter',
'base_table' => 'node_field_data',
]);
$this->drupalLoginAsRoot();
$this->drupalGet('/admin/structure/views/nojs/add-handler/' . $view_config_entity->id() . '/default/filter');
$this->dontSeeErrorMessage();
$this->submitForm(['name[node_field_data.nid]' => TRUE], 'Add and configure filter criteria');
$this->dontSeeErrorMessage();
$web_assert = $this->assertSession();
$web_assert->elementExists('css', 'select[name="options[operator]"] option[value="in"]');
$this->submitForm([
'options[operator]' => 'in',
'options[value][value]' => '1,2,3',
], 'Apply');
$this->dontSeeErrorMessage();
// @TODO Check generated sql query
}
/**
* Test Views "is_current_user" sort plugin.
*
* @covers \Drupal\improvements_views\Plugin\views\sort\IsCurrentUser
*/
public function testViewsPluginSortIsCurrentUserSort(): void {
$this->installModule('node', 'user', 'improvements_views_test');
// Check view exists
$this->installModule('views_ui');
$this->drupalLoginAsRoot();
$this->drupalGet('/admin/structure/views/view/test_sort_by_current_user');
$web_assert = $this->assertSession();
$web_assert->pageTextContains('Content: Author is current user (asc)');
\Drupal::getContainer()->get('current_user')->setAccount($this->rootUser);
$sql = (string)$this->getViewQuery('test_sort_by_current_user');
$this->assertStringContainsString('IF (node_field_data.uid = 1, ' . $this->rootUser->id() . ', 0) AS "uid_is_current_user"', $sql);
$this->assertStringContainsString('ORDER BY "uid_is_current_user"', $sql);
}
/**
* Test sort by comment author is current user
*
* @covers \Drupal\improvements_views\Plugin\views\sort\IsCurrentUser
*/
public function testViewsPluginSortByCommentAuthorIsCurrentUser(): void {
$this->installModule('node', 'comment', 'user', 'improvements_views_test');
$this->drupalLoginAsRoot();
\Drupal::getContainer()->get('current_user')->setAccount($this->rootUser);
$sql = (string)$this->getViewQuery('test_sort_by_comment_author_is_current_user');
$this->assertStringContainsString('IF (comment_field_data.uid = 1, ' . $this->rootUser->id() . ', 0) AS "uid_is_current_user"', $sql);
$this->assertStringContainsString('ORDER BY "uid_is_current_user"', $sql);
}
/**
* Test Views "greater_than" sort plugin.
*
* @covers \Drupal\improvements_views\Plugin\views\sort\GreaterThan
*/
public function testViewsPluginSortGreaterThan(): void {
$this->installModule('node', 'comment', 'user', 'improvements_views_test');
// Check view exists
$this->installModule('views_ui');
$this->drupalLoginAsRoot();
$this->drupalGet('/admin/structure/views');
$web_assert = $this->assertSession();
$web_assert->pageTextContains('Test sort by comment author is registered');
\Drupal::getContainer()->get('current_user')->setAccount($this->rootUser);
$sql = (string)$this->getViewQuery('test_sort_by_comment_author_is_registered');
$this->assertStringContainsString('IF(comment_field_data.uid > 0, 1, 0) AS "uid_greater_than"', $sql);
$this->assertStringContainsString('ORDER BY "uid_greater_than"', $sql);
}
/**
* Test token [view:total-rows-in-current-page].
*/
public function testViewsTotalRowsToken(): void {
$this->installModule('node', 'improvements_views_test');
$this->createContentType(['type' => 'page', 'name' => 'Page']);
$node1 = $this->createNode(['title' => 'Node 1 for test ' . __FUNCTION__]);
$node2 = $this->createNode(['title' => 'Node 2 for test ' . __FUNCTION__]);
$node3 = $this->createNode(['title' => 'Node 3 for test ' . __FUNCTION__]);
$token_service = $this->container->get('token');
$renderer = $this->container->get('renderer');
$view_executable = $this->getExecutedView('test_total_rows_token');
$total_rows = $token_service->replace('[view:total-rows-in-current-page]', ['view' => $view_executable]);
$this->assertSame('3', $total_rows);
$view_executable = $this->getExecutedView('test_total_rows_token', 'default', [], function (ViewExecutable $view) {
$view->setItemsPerPage(2);
});
$total_rows = $token_service->replace('[view:total-rows-in-current-page]', ['view' => $view_executable]);
$this->assertSame('2', $total_rows);
$view_build = views_embed_view('test_total_rows_token');
$view_output = (string)$renderer->renderRoot($view_build);
$this->assertStringContainsString('<div class="content-css-class total-rows-3">', $view_output);
}
/**
* Test prefix in Views display tab name.
*
* @covers ::improvements_views_ui_display_top_alter()
*/
public function testViewsDisplayTabNamePrefix(): void {
$this->installModule('improvements_views_test', 'views_ui');
$this->drupalLoginAsRoot();
$this->drupalGet('/admin/structure/views/view/test_total_rows_token/edit/default');
$this->dontSeeErrorMessage();
$web_assert = $this->assertSession();
$web_assert->elementTextContains('css', '#views-display-menu-tabs', '(default) Default');
}
/**
* Test Views optional date exposed filter.
*/
public function testViewsOptionalDateExposedFilter(): void {
$this->installModule('improvements_views_test', 'node');
$this->createContentType(['type' => 'page', 'name' => 'Page']);
$nodes = [
1 => $this->createNode(['created' => strtotime('2020-06-01')]),
2 => $this->createNode(['created' => strtotime('2021-08-01')]),
];
$web_assert = $this->assertSession();
$this->drupalGet('/test-optional-date-exposed-filter');
$web_assert->pageTextContains($nodes[1]->label());
$web_assert->pageTextContains($nodes[2]->label());
$this->submitForm([
'created[min]' => '2020-01-01',
'created[max]' => '2022-01-01',
], 'Apply');
$web_assert->pageTextContains($nodes[1]->label());
$web_assert->pageTextContains($nodes[2]->label());
$this->submitForm([
'created[min]' => '2021-01-01',
'created[max]' => '2022-01-01',
], 'Apply');
$web_assert->pageTextContains($nodes[2]->label());
$web_assert->pageTextNotContains($nodes[1]->label());
$this->submitForm([
'created[min]' => '2020-01-01',
'created[max]' => '',
], 'Apply');
$web_assert->pageTextContains($nodes[1]->label());
$web_assert->pageTextContains($nodes[2]->label());
$this->submitForm([
'created[min]' => '2021-01-01',
'created[max]' => '',
], 'Apply');
$web_assert->pageTextContains($nodes[2]->label());
$web_assert->pageTextNotContains($nodes[1]->label());
$this->submitForm([
'created[min]' => '',
'created[max]' => '2021-01-01',
], 'Apply');
$web_assert->pageTextContains($nodes[1]->label());
$web_assert->pageTextNotContains($nodes[2]->label());
}
/**
* Test Views argument plugin "term_with_children".
*
* @covers \Drupal\improvements_views\Plugin\views\argument\TermWithChildrenArgument
*/
public function testViewsPluginArgumentTermWithChildren(): void {
$this->installModule('node', 'taxonomy', 'improvements_views_test', 'views_ui');
$this->createContentType(['type' => 'page', 'name' => 'Page']);
$categories_vocabulary = Vocabulary::create(['name' => 'Categories', 'vid' => 'category']);
$this->createField(
entity_type: 'node',
entity_bundle: 'page',
field_name: 'field_category',
field_type: 'entity_reference',
field_label: 'Test category field',
storage_settings: [
'settings' => [
'target_type' => 'taxonomy_term',
],
],
);
$this->drupalLoginAsRoot();
$this->drupalGet('/admin/structure/views/nojs/add-handler/test_argument_term_with_children/default/argument');
$this->dontSeeErrorMessage();
$web_assert = $this->assertSession();
$web_assert->fieldExists('name[node__field_category.field_category_target_id_with_children]');
$this->submitForm([
'name[node__field_category.field_category_target_id_with_children]' => 'node__field_category.field_category_target_id_with_children',
], 'Add and configure contextual filters');
$this->dontSeeErrorMessage();
$this->drupalGet('/admin/structure/views/view/test_argument_term_with_children');
$this->dontSeeErrorMessage();
$this->submitForm([], 'Save');
$this->dontSeeErrorMessage();
$term_1 = $this->createTerm($categories_vocabulary, ['name' => 'Term 1']);
$term_2 = $this->createTerm($categories_vocabulary, ['name' => 'Term 2']);
$term_1_1 = $this->createTerm($categories_vocabulary, ['name' => 'Term 1.1', 'parent' => [$term_1->id()]]);
$term_1_2 = $this->createTerm($categories_vocabulary, ['name' => 'Term 1.2', 'parent' => [$term_1->id()]]);
$query = $this->getViewQuery('test_argument_term_with_children', 'default', [$term_1->id()]);
$this->assertSame([
(string)$term_1->id(),
(string)$term_1_1->id(),
(string)$term_1_2->id(),
], current($query->getArguments()));
$query = $this->getViewQuery('test_argument_term_with_children', 'default', [$term_2->id()]);
$this->assertSame((string)$term_2->id(), current($query->getArguments()));
}
/**
* Test bulk edit terms Views.
*
* @TODO Move to improvements_taxonomy module?
*/
public function testTermBulkEditViews(): void {
$this->installModule('views', 'block', 'taxonomy', 'user', 'improvements_taxonomy');
$this->placeBlock('local_tasks_block', [
'id' => 'local_tasks_block',
'region' => 'help',
'weight' => 3,
]);
($categories_vocabulary = Vocabulary::create(['name' => 'Categories', 'vid' => 'category']))->save();
($tags_vocabulary = Vocabulary::create(['name' => 'Tags', 'vid' => 'tag']))->save();
$term1 = $this->createTerm($categories_vocabulary, ['name' => 'Test category for ' . __FUNCTION__]);
$term2 = $this->createTerm($tags_vocabulary, ['name' => 'Test tag for ' . __FUNCTION__]);
$this->drupalLoginAsRoot();
$web_assert = $this->assertSession();
$this->installModule('views_ui');
$this->drupalGet('/admin/structure/views');
$web_assert->pageTextContains('Administer terms');
$this->drupalGet("/admin/structure/taxonomy/manage/{$categories_vocabulary->id()}/overview");
$this->dontSeeErrorMessage();
$web_assert->elementExists('css', '#block-local-tasks-block');
$web_assert->elementExists('css', '#block-local-tasks-block a[href="/admin/structure/taxonomy/manage/' . $categories_vocabulary->id() . '/bulk-edit"]');
$this->drupalGet("/admin/structure/taxonomy/manage/{$tags_vocabulary->id()}/overview");
$this->dontSeeErrorMessage();
$web_assert->elementExists('css', '#block-local-tasks-block a[href="/admin/structure/taxonomy/manage/' . $tags_vocabulary->id() . '/bulk-edit"]');
$this->drupalGet("/admin/structure/taxonomy/manage/{$categories_vocabulary->id()}/bulk-edit");
$this->dontSeeErrorMessage();
$web_assert->elementExists('css', "form#views-form-admin-terms-page-{$categories_vocabulary->id()}");
$web_assert->pageTextContains($term1->label());
$web_assert->pageTextNotContains($term2->label());
$this->drupalGet("/admin/structure/taxonomy/manage/{$tags_vocabulary->id()}/bulk-edit");
$this->dontSeeErrorMessage();
$web_assert->elementExists('css', "form#views-form-admin-terms-page-{$tags_vocabulary->id()}");
$web_assert->pageTextContains($term2->label());
$web_assert->pageTextNotContains($term1->label());
}
}
