View source
<?php
namespace Drupal\Tests\core_views_facets\Functional;
use Drupal\views\Tests\ViewTestData;
use Drupal\Core\Url;
class CoreViewsIntegrationTest extends WebTestBase {
public static $modules = [
'views_ui',
'entity_test',
];
public static $testViews = [
'core_views_facets_basic_integration',
];
public function setUp() {
parent::setUp();
$this
->drupalLogin($this->adminUser);
$this
->setUpExampleStructure();
$this
->insertExampleContent();
ViewTestData::createTestViews(get_class($this), [
'core_views_facets_test_views',
]);
$this->blocks = NULL;
}
public function testExposedFilterUrlAlias() {
$facet_name = "Test Facet URL";
$facet_id = 'test_facet_url';
$this
->drupalLogin($this->adminUser);
$this
->createFacet($facet_name, $facet_id);
$this
->drupalGet($this->facetUrl);
$this
->assertSession()
->statusCodeEquals(200);
$this
->assertFacetLabel('item');
$this
->assertFacetLabel('article');
$this
->clickLink('item');
$url = Url::fromUserInput('/' . $this->facetUrl . '/all/all', [
'query' => [
'type' => 'item',
],
]);
$this
->assertSession()
->addressEquals($url);
}
public function testContextualFilterUrlAlias() {
$facet_name = "Test Facet URL";
$facet_id = 'test_facet_url';
$this
->drupalLogin($this->adminUser);
$this
->createFacet($facet_name, $facet_id, 'type', 'page_1', 'core_views_facets_basic_integration', 'contextual');
$this
->drupalGet($this->facetUrl);
$this
->assertSession()
->statusCodeEquals(200);
$this
->assertFacetLabel('item');
$this
->assertFacetLabel('article');
$this
->clickLink('item');
$url = Url::fromUserInput('/' . $this->facetUrl . '/all/item');
$this
->assertSession()
->addressEquals($url);
}
public function testFacetFormValidate() {
$id = 'southern_white_facet_owl';
$name = 'Southern white-faced owl';
$facet_add_page = Url::fromRoute('entity.facets_facet.add_form');
$this
->drupalGet($facet_add_page);
$this
->assertSession()
->statusCodeEquals(200);
$edit = [
'name' => $name,
'id' => $id,
'facet_source_id' => $this->exposedFiltersFacetSourceId,
];
$this
->drupalPostForm(NULL, $edit, 'Save');
$this
->assertSession()
->responseContains('Please select a valid field.');
}
public function testFramework() {
$facet_name = "Test Facet name";
$facet_id = 'test_facet_name';
$this
->checkEmptyOverview();
$this
->addFacet($facet_name);
$this
->editFacet($facet_name);
$this
->drupalGet($this->facetUrl);
$this
->assertSession()
->pageTextContains('Displaying 5 search results');
$this->blocks[$facet_id] = $this
->createBlock($facet_id);
$this
->drupalGet($this->facetUrl);
$this
->assertSession()
->pageTextContains('item');
$this
->assertSession()
->pageTextContains('article');
$this
->assertFacetBlocksAppear();
$this
->setOptionShowOnlyWhenFacetSourceVisible($facet_name);
$this
->drupalGet('user/2');
$this
->assertNoFacetBlocksAppear();
$content_ids = \Drupal::entityQuery('entity_test')
->execute();
$storage = \Drupal::entityTypeManager()
->getStorage('entity_test');
$entities = $storage
->loadMultiple($content_ids);
$storage
->delete($entities);
$this
->drupalGet($this->facetUrl);
$this
->assertNoFacetBlocksAppear();
$this
->setEmptyBehaviorFacetText($facet_name);
$this
->drupalGet($this->facetUrl);
$this
->assertSession()
->responseContains('block-test-facet-name');
$this
->assertSession()
->responseContains('No results found for this block!');
}
protected function setEmptyBehaviorFacetText($facet_name) {
$facet_id = $this
->convertNameToMachineName($facet_name);
$facet_display_page = Url::fromRoute('entity.facets_facet.edit_form', [
'facets_facet' => $facet_id,
]);
$this
->drupalGet($facet_display_page);
$this
->assertSession()
->statusCodeEquals(200);
$edit = [
'facet_settings[empty_behavior]' => 'text',
'facet_settings[empty_behavior_container][empty_behavior_text][value]' => 'No results found for this block!',
];
$this
->drupalPostForm(NULL, $edit, 'Save');
}
protected function setOptionShowOnlyWhenFacetSourceVisible($facet_name) {
$facet_id = $this
->convertNameToMachineName($facet_name);
$facet_edit_page = Url::fromRoute('entity.facets_facet.edit_form', [
'facets_facet' => $facet_id,
]);
$this
->drupalGet($facet_edit_page);
$this
->assertSession()
->statusCodeEquals(200);
$edit = [
'facet_settings[only_visible_when_facet_source_is_visible]' => TRUE,
'widget' => 'links',
'widget_config[show_numbers]' => '0',
];
$this
->drupalPostForm(NULL, $edit, 'Save');
}
protected function checkEmptyOverview() {
$this
->drupalGet(Url::fromRoute('entity.facets_facet.collection'));
$this
->assertSession()
->statusCodeEquals(200);
$this
->assertSession()
->pageTextNotContains('Field:');
}
protected function addFacet($facet_name, $source_type = 'exposed', $facet_type = 'type') {
$facet_id = $this
->convertNameToMachineName($facet_name);
switch ($source_type) {
case 'contextual':
$facet_source_id = $this->contextualFiltersFacetSourceId;
break;
case 'exposed':
default:
$facet_source_id = $this->exposedFiltersFacetSourceId;
break;
}
$facet_source_edit_page = Url::fromRoute('entity.facets_facet_source.edit_form', [
'facets_facet_source' => $facet_source_id,
]);
$this
->drupalGet($facet_source_edit_page);
$this
->assertSession()
->statusCodeEquals(200);
$url_processor_form_values = [
'url_processor' => 'core_views_url_processor',
];
$this
->drupalPostForm($facet_source_edit_page, $url_processor_form_values, 'Save');
$facet_add_page = Url::fromRoute('entity.facets_facet.add_form');
$this
->drupalGet($facet_add_page);
$this
->assertSession()
->statusCodeEquals(200);
$form_values = [
'name' => '',
'id' => $facet_id,
];
$this
->drupalPostForm($facet_add_page, $form_values, 'Save');
$this
->assertSession()
->pageTextContains('Name field is required.');
$this
->assertSession()
->pageTextContains('Facet source field is required.');
$form_values['name'] = $facet_name;
$this
->drupalPostForm(NULL, $form_values, 'Save');
$this
->assertSession()
->pageTextNotContains('Name field is required.');
$this
->drupalGet($facet_add_page);
$this
->drupalPostForm(NULL, [
'facet_source_id' => $facet_source_id,
], 'Configure facet source');
$this
->drupalPostForm(NULL, $form_values, 'Save');
$this
->assertSession()
->pageTextContains('Facet field field is required.');
$facet_source_form = [
'facet_source_id' => $facet_source_id,
'facet_source_configs[' . $facet_source_id . '][field_identifier]' => $facet_type,
];
$this
->drupalPostForm(NULL, $form_values + $facet_source_form, 'Save');
$this
->assertSession()
->pageTextNotContains('field is required.');
$this
->assertSession()
->pageTextContains('Facet ' . $facet_name . ' has been created.');
$url = Url::fromRoute('entity.facets_facet.edit_form', [
'facets_facet' => $facet_id,
]);
$this
->assertSession()
->addressEquals($url);
$this
->drupalGet(Url::fromRoute('entity.facets_facet.collection'));
}
protected function editFacet($facet_name) {
$facet_id = $this
->convertNameToMachineName($facet_name);
$facet_edit_page = Url::fromRoute('entity.facets_facet.settings_form', [
'facets_facet' => $facet_id,
]);
$this
->drupalGet($facet_edit_page);
$this
->assertSession()
->statusCodeEquals(200);
$this
->assertSession()
->responseContains('Facet settings for ' . $facet_name . ' facet');
$elements = $this
->xpath('//form[@id="facets-facet-settings-form"]/div[contains(@class, "form-item-id")]/input[@disabled]');
$this
->assertEquals(count($elements), 1, 'Machine name cannot be changed.');
$form_values = [
'name' => $facet_name . ' - 2',
];
$this
->drupalPostForm($facet_edit_page, $form_values, 'Save');
$this
->assertSession()
->pageTextContains('Facet ' . $facet_name . ' - 2 has been updated.');
$this
->drupalGet($facet_edit_page);
$this
->assertSession()
->responseContains('Facet settings for ' . $facet_name . ' - 2 facet');
$form_values = [
'name' => $facet_name,
];
$this
->drupalPostForm($facet_edit_page, $form_values, 'Save');
$this
->assertSession()
->pageTextContains('Facet ' . $facet_name . ' has been updated.');
}
protected function convertNameToMachineName($facet_name) {
return preg_replace('@[^a-zA-Z0-9_]+@', '_', strtolower($facet_name));
}
protected function goToDeleteFacetPage($facet_name) {
$facet_id = $this
->convertNameToMachineName($facet_name);
$facet_delete_page = Url::fromRoute('entity.facets_facet.delete_form', [
'facets_facet' => $facet_id,
]);
$this
->drupalGet($facet_delete_page);
$this
->assertSession()
->statusCodeEquals(200);
}
}