720 lines
29 KiB
Plaintext
720 lines
29 KiB
Plaintext
![]() |
<?php
|
||
|
|
||
|
/**
|
||
|
* @file
|
||
|
* Tests for the Facet API module.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Base class for all Facet API test cases.
|
||
|
*/
|
||
|
class FacetapiTestCase extends DrupalWebTestCase {
|
||
|
|
||
|
/**
|
||
|
* Overrides DrupalWebTestCase::setUp().
|
||
|
*
|
||
|
* Enables the "block" and "facetapi_test" modules, creates an administrative
|
||
|
* user with permissions to configure the Faceted Search interface.
|
||
|
*/
|
||
|
public function setUp() {
|
||
|
$modules = func_get_args();
|
||
|
$modules[] = 'block';
|
||
|
$modules[] = 'facetapi_test';
|
||
|
forward_static_call_array('parent::setUp', $modules);
|
||
|
$this->authenticatedUser = $this->drupalCreateUser();
|
||
|
$this->adminUser = $this->drupalCreateUser(array(
|
||
|
'administer blocks',
|
||
|
'administer search',
|
||
|
'access administration pages',
|
||
|
));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Overrides DrupalWebTestCase::drupalPost()
|
||
|
*
|
||
|
* Clears static variables on settings submission. This is OK because the
|
||
|
* script execution persists when the form is submitted by the test unlike a
|
||
|
* real form post where the page has to reload.
|
||
|
*/
|
||
|
public function drupalPost($path, $edit, $submit, array $options = array(), array $headers = array(), $form_html_id = NULL, $extra_post = NULL) {
|
||
|
parent::drupalPost($path, $edit, $submit, $options, $headers, $form_html_id, $extra_post);
|
||
|
if (t('Save configuration') == $submit) {
|
||
|
drupal_static('facetapi_get_searcher_settings', array(), TRUE);
|
||
|
drupal_static('facetapi_get_enabled_facets', array(), TRUE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns adapter, realm, and facet objects and base admin path.
|
||
|
*
|
||
|
* Useful with the list() function.
|
||
|
*
|
||
|
* @return array
|
||
|
* An array containing:
|
||
|
* - The facet definition as retrned by facetapi_facet_load().
|
||
|
* - The realm definition as retrned by facetapi_realm_load().
|
||
|
* - The FacetapiAdapter object as returned by facetapi_adapter_load().
|
||
|
* - The base admin path for facet settings forms.
|
||
|
*/
|
||
|
public function facetapiLoadObjects($facet_name = 'enabled', $realm_name = 'nodisplay', $searcher = 'facetapi_test') {
|
||
|
return array(
|
||
|
facetapi_facet_load($facet_name, $searcher),
|
||
|
facetapi_realm_load($realm_name),
|
||
|
facetapi_adapter_load($searcher),
|
||
|
"admin/config/search/facetapi/$searcher/$realm_name/$facet_name",
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Enables a facet via the UI.
|
||
|
*/
|
||
|
public function facetapiEnableFacet($facet_name = 'enabled', $realm_name = 'block', $searcher = 'facetapi_test') {
|
||
|
// Capture current user, switch to admin user if necessary.
|
||
|
$account = $this->loggedInUser;
|
||
|
if ($account != $this->adminUser) {
|
||
|
$this->drupalLogin($this->adminUser);
|
||
|
}
|
||
|
|
||
|
// Posts the form, ensures it was successfully submitted.
|
||
|
$path = 'admin/config/search/facetapi_test/facets/' . $realm_name;
|
||
|
$values = array('enabled_facets[' . $facet_name . ']' => $facet_name);
|
||
|
$this->drupalPost($path, $values, t('Save configuration'));
|
||
|
$this->assertRaw(t('The configuration options have been saved.'), t('Facet form successfully submitted.'), 'Facet API');
|
||
|
|
||
|
// Test that the facet was successfully enabled.
|
||
|
$value = facetapi_facet_enabled($searcher, $realm_name, $facet_name);
|
||
|
$this->assertTrue($value, t('Facet enabled via the interface.'), 'Facet API');
|
||
|
|
||
|
// Log back in as original user if necessary.
|
||
|
if ($account != $this->adminUser) {
|
||
|
if ($account) {
|
||
|
$this->drupalLogin($account);
|
||
|
}
|
||
|
else {
|
||
|
$this->drupalLogout();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Enables a facet block via the UI.
|
||
|
*/
|
||
|
public function facetapiEnableFacetBlock($facet_name = 'enabled', $realm_name = 'block', $searcher = 'facetapi_test') {
|
||
|
// Capture current user, switch to admin user if necessary.
|
||
|
$account = $this->loggedInUser;
|
||
|
if ($account != $this->adminUser) {
|
||
|
$this->drupalLogin($this->adminUser);
|
||
|
}
|
||
|
|
||
|
// Generates the "key" via the facetapi_hash_delta() function.
|
||
|
module_load_include('inc', 'facetapi', 'facetapi.block');
|
||
|
$detla = facetapi_build_delta($searcher, $realm_name, $facet_name);
|
||
|
$key = 'facetapi_' . facetapi_hash_delta($detla);
|
||
|
|
||
|
// Enables the facet in the "sidebar_first" region.
|
||
|
$edit = array('blocks[' . $key . '][region]' => 'sidebar_first');
|
||
|
$this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
|
||
|
|
||
|
// Log back in as original user if necessary.
|
||
|
if ($account != $this->adminUser) {
|
||
|
if ($account) {
|
||
|
$this->drupalLogin($account);
|
||
|
}
|
||
|
else {
|
||
|
$this->drupalLogout();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets debug message flagging which issue was just tested.
|
||
|
*
|
||
|
* @param string $issue
|
||
|
* The URL to the issue on Drupal.org.
|
||
|
*/
|
||
|
public function facetapiIssueMessage($issue) {
|
||
|
$href = check_plain($issue);
|
||
|
$link = '<a href="' . $href . '">' . $href . '</a>';
|
||
|
$this->pass(t('Tested issue !link', array('!link' => $link)), 'Debug');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Test cases for operations taken through the admin UI.
|
||
|
*/
|
||
|
class FacetapiAdminInterfaceTestCase extends FacetapiTestCase {
|
||
|
protected $authenticatedUser;
|
||
|
protected $adminUser;
|
||
|
|
||
|
public static function getInfo() {
|
||
|
return array(
|
||
|
'name' => 'Administrative UI',
|
||
|
'description' => 'Tests the UI for Facet API administrative pages.',
|
||
|
'group' => 'Facet API',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests access to callbacks.
|
||
|
*
|
||
|
* @todo Test invalid adapters, realms, facets. Test multiple realms.
|
||
|
*/
|
||
|
public function testFormAccess() {
|
||
|
$paths = array(
|
||
|
'admin/config/search/facetapi_test/facets' => t('realm settings'),
|
||
|
'admin/config/search/facetapi/facetapi_test/block/enabled/edit' => t('display settings'),
|
||
|
'admin/config/search/facetapi/facetapi_test/block/enabled/dependencies' => t('dependency settings'),
|
||
|
'admin/config/search/facetapi/facetapi_test/block/enabled/filters' => t('filter settings'),
|
||
|
'admin/config/search/facetapi/facetapi_test/block/enabled/export' => t('export settings'),
|
||
|
'admin/config/search/facetapi/facetapi_test/block/enabled/revert' => t('revert settings')
|
||
|
);
|
||
|
|
||
|
// Test wheter unprivileged user is denied access to forms.
|
||
|
$this->drupalLogin($this->authenticatedUser);
|
||
|
foreach ($paths as $path => $form_name) {
|
||
|
$this->drupalGet($path);
|
||
|
$this->assertResponse(403, t('Unprivileged user does not have access to the @form-name form.', array('@form-name' => $form_name)), 'Facet API');
|
||
|
}
|
||
|
|
||
|
// Common message for privileged access checks.
|
||
|
$privileged_message = t('Privileged user with "@permission" permission is granted access to the @form-name form.');
|
||
|
|
||
|
// Test whether privileged user is granted access for forms.
|
||
|
// NOTE: $this->adminUser has "administer search" permission.
|
||
|
$this->drupalLogin($this->adminUser);
|
||
|
foreach ($paths as $path => $form_name) {
|
||
|
$this->drupalGet($path);
|
||
|
$args = array('@permission' => 'administer search', '@form-name' => $form_name);
|
||
|
$this->assertResponse(200, t($privileged_message, $args));
|
||
|
}
|
||
|
|
||
|
// Tests whether privileged user is granted access for forms.
|
||
|
// Create another user with the "administer facets" permission, test whether
|
||
|
$facet_admin_user = $this->drupalCreateUser(array('administer facets'));
|
||
|
$this->drupalLogin($facet_admin_user);
|
||
|
foreach ($paths as $path => $form_name) {
|
||
|
$this->drupalGet($path);
|
||
|
$args = array('@permission' => 'administer facets', '@form-name' => $form_name);
|
||
|
$this->assertResponse(200, t($privileged_message, $args));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests enabling a facet via the UI.
|
||
|
*/
|
||
|
public function testEnableFacet() {
|
||
|
list($facet) = $this->facetapiLoadObjects();
|
||
|
|
||
|
// Enable the "enabled" facet and block via UI.
|
||
|
$this->drupalLogin($this->adminUser);
|
||
|
$this->facetapiEnableFacet();
|
||
|
$this->facetapiEnableFacetBlock();
|
||
|
|
||
|
// Test that block is positioned on the search page.
|
||
|
$this->drupalLogin($this->authenticatedUser);
|
||
|
$this->drupalGet('facetapi_test/search');
|
||
|
$raw = t('Filter by @title:', array('@title' => drupal_strtolower($facet['label'])));
|
||
|
$this->assertRaw($raw, t('Facet block displayed on search page.'), 'Facet API');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests display form redirects.
|
||
|
*/
|
||
|
public function testDisplayFormRedirect() {
|
||
|
list($facet, $realm, $adapter, $base_path) = $this->facetapiLoadObjects();
|
||
|
$path = "$base_path/edit";
|
||
|
|
||
|
$button_text = t('Save and go back to realm settings');
|
||
|
$this->drupalLogin($this->adminUser);
|
||
|
$this->drupalPost($path, array(), $button_text);
|
||
|
$this->assertRaw($realm['label'], t('Form is redirected to realm settings form when the "@button-text" button is submitted.', array('@button-text' => $button_text)));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests that an admin can selet a valid widget.
|
||
|
*
|
||
|
* In addition to checking that a valid widget can be selected, it also tests
|
||
|
* that an invalid widget cannot be selected by choosing one that does not
|
||
|
* support the "term" query type.
|
||
|
*/
|
||
|
public function testWidgetSelect() {
|
||
|
$this->drupalLogin($this->adminUser);
|
||
|
list($facet, $realm, $adapter, $base_path) = $this->facetapiLoadObjects();
|
||
|
$path = "$base_path/edit";
|
||
|
|
||
|
// Ensure that a valid widget can be selected.
|
||
|
$this->drupalGet($path);
|
||
|
$values = array('widget' => 'facetapi_checkbox_links');
|
||
|
$this->drupalPost($path, $values, t('Save configuration'));
|
||
|
$settings = $adapter->getFacetSettings($facet, $realm);
|
||
|
$this->assertEqual($settings->settings['widget'], 'facetapi_checkbox_links', t('The facetapi_checkbox_links widget was successfully selected.'), 'Facet API');
|
||
|
|
||
|
// Ensure that an invalid widget cannot be selected.
|
||
|
$this->drupalGet($path);
|
||
|
$values = array('widget' => 'facetapi_nonterm');
|
||
|
$this->drupalPost($path, $values, t('Save configuration'));
|
||
|
$validation_message = t('The widget does not support the %type query type', array('%type' => 'term'));
|
||
|
$this->assertRaw($validation_message, t('An invalid widget cannot be selected.'), 'Facet API');
|
||
|
$settings = $adapter->getFacetSettings($facet, $realm);
|
||
|
$this->assertNotEqual($settings->settings['widget'], 'facetapi_nonterm', t('An invalid widget does not get saved.'), 'Facet API');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class FacetapiSearchPageInterfaceTestCase extends FacetapiTestCase {
|
||
|
protected $authenticatedUser;
|
||
|
protected $adminUser;
|
||
|
|
||
|
public static function getInfo() {
|
||
|
return array(
|
||
|
'name' => 'Search page UI',
|
||
|
'description' => 'Tests the UI for search pages.',
|
||
|
'group' => 'Facet API',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
public function testFormAccess() {
|
||
|
|
||
|
// Enable facet and position block.
|
||
|
$this->drupalLogin($this->adminUser);
|
||
|
$this->facetapiEnableFacet();
|
||
|
$this->facetapiEnableFacetBlock();
|
||
|
|
||
|
// Logs in as a normal user.
|
||
|
$this->drupalLogin($this->authenticatedUser);
|
||
|
|
||
|
// Tests breadcrumb trail when search keys are in the path.
|
||
|
$path = 'facetapi_test/search/testkeys';
|
||
|
$options = array('query' => array('f' => array(0 => 'enabled:testone')));
|
||
|
$this->drupalGet($path, $options);
|
||
|
$this->clickLink('testkeys');
|
||
|
$this->assertUrl($path);
|
||
|
|
||
|
// Tests breadcrumb trail when search keys are in the query string.
|
||
|
$path = 'facetapi_test/search';
|
||
|
$options = array('query' => array('keys' => 'testkeys', 'f' => array(0 => 'enabled:testone')));
|
||
|
$this->drupalGet($path, $options);
|
||
|
$this->clickLink('testkeys');
|
||
|
$this->assertUrl($path, array('query' => array('keys' => 'testkeys')));
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
class FacetapiBugFixTestCase extends FacetapiTestCase {
|
||
|
protected $authenticatedUser;
|
||
|
protected $adminUser;
|
||
|
|
||
|
public static function getInfo() {
|
||
|
return array(
|
||
|
'name' => 'Bug Fixes',
|
||
|
'description' => 'Tests fixed bugs to prevent regressions.',
|
||
|
'group' => 'Facet API',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests bug fixed at http://drupal.org/node/1209490.
|
||
|
*/
|
||
|
public function testEnableFacetWithColon() {
|
||
|
$this->facetapiEnableFacet('colon:test');
|
||
|
$this->facetapiIssueMessage('http://drupal.org/node/1209490');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests bug fixed at http://drupal.org/node/1443340.
|
||
|
*/
|
||
|
public function testValidDefaults() {
|
||
|
list($facet, $realm, $adapter, $base_path) = $this->facetapiLoadObjects('defaults');
|
||
|
$this->drupalLogin($this->adminUser);
|
||
|
|
||
|
$path = "$base_path/edit";
|
||
|
$values = array('widget' => 'facetapi_nonterm');
|
||
|
$this->drupalGet($path);
|
||
|
$this->drupalPost($path, $values, t('Save configuration'));
|
||
|
|
||
|
$settings = $adapter->getFacetSettingsGlobal($facet);
|
||
|
$message = t('Defaults settings not hard coded to "term" and FACETAPI_OPERATOR_AND.');
|
||
|
$this->assertEqual($settings->settings['query_type'], 'nonterm', $message, 'Facet API');
|
||
|
|
||
|
$this->facetapiIssueMessage('http://drupal.org/node/1443340');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Test cases for low level API functions.
|
||
|
*/
|
||
|
class FacetapiApiFunctions extends FacetapiTestCase {
|
||
|
protected $authenticatedUser;
|
||
|
protected $adminUser;
|
||
|
|
||
|
public static function getInfo() {
|
||
|
return array(
|
||
|
'name' => 'API Functions',
|
||
|
'description' => 'Tests low level API functions.',
|
||
|
'group' => 'Facet API',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests the facetapi_facet_enabled() function.
|
||
|
*
|
||
|
* @see facetapi_facet_enabled()
|
||
|
*/
|
||
|
public function testFacetEnabled() {
|
||
|
list($facet, $realm, $adapter) = $this->facetapiLoadObjects();
|
||
|
|
||
|
// Ensure the facet is disabled, which it is by default.
|
||
|
$enabled = facetapi_facet_enabled('facetapi_test', 'nodisplay', 'enabled');
|
||
|
$this->assertFalse($enabled, t('Facet flagged as disabled by facetapi_facet_enabled().'), 'Facet API');
|
||
|
|
||
|
// Enable the facet, ensure the API function flags it as enabled.
|
||
|
facetapi_save_facet_enabled($adapter, $realm, $facet);
|
||
|
$enabled = facetapi_facet_enabled('facetapi_test', 'nodisplay', 'enabled');
|
||
|
$this->assertTrue($enabled, t('Facet flagged as enabled by facetapi_facet_enabled().'), 'Facet API');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests facetapi_save_facet_status() API functions.
|
||
|
*
|
||
|
* @see facetapi_save_facet_status()
|
||
|
* @see facetapi_save_facet_enabled()
|
||
|
* @see facetapi_save_facet_disabled()
|
||
|
*/
|
||
|
public function testSaveFacetStatus() {
|
||
|
list($facet, $realm, $adapter) = $this->facetapiLoadObjects();
|
||
|
|
||
|
facetapi_save_facet_enabled($adapter, $realm, $facet);
|
||
|
$enabled = facetapi_facet_enabled('facetapi_test', 'nodisplay', 'enabled');
|
||
|
$this->assertTrue($enabled, t('Facet enabled by facetapi_save_facet_enabled().'), 'Facet API');
|
||
|
|
||
|
facetapi_save_facet_disabled($adapter, $realm, $facet);
|
||
|
$enabled = facetapi_facet_enabled('facetapi_test', 'nodisplay', 'enabled');
|
||
|
$this->assertFalse($enabled, t('Facet disabled by facetapi_save_facet_disabled().'), 'Facet API');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests facetapi_set_facet_status() API functions.
|
||
|
*
|
||
|
* @see facetapi_set_facet_status()
|
||
|
* @see facetapi_set_facet_enabled()
|
||
|
* @see facetapi_set_facet_disabled()
|
||
|
*/
|
||
|
public function testSetFacetStatus() {
|
||
|
list($facet, $realm, $adapter) = $this->facetapiLoadObjects();
|
||
|
|
||
|
// Facet disabled by default, tests temporarily overriding status. Although
|
||
|
// the setting is disabled, status should be TRUE.
|
||
|
facetapi_set_facet_enabled('facetapi_test', 'nodisplay', 'enabled');
|
||
|
$enabled = facetapi_facet_enabled('facetapi_test', 'nodisplay', 'enabled');
|
||
|
$this->assertTrue($enabled, t('Facet temporarily enabled by facetapi_set_facet_disabled().'), 'Facet API');
|
||
|
|
||
|
// Saves facet as enabled, tests temporarily overriding status. Although the
|
||
|
// setting is enabled, status should be FALSE.
|
||
|
facetapi_save_facet_enabled($adapter, $realm, $facet);
|
||
|
facetapi_set_facet_disabled('facetapi_test', 'nodisplay', 'enabled');
|
||
|
$enabled = facetapi_facet_enabled('facetapi_test', 'nodisplay', 'enabled');
|
||
|
$this->assertFalse($enabled, t('Facet temporarily disabled by facetapi_set_facet_disabled().'), 'Facet API');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests the facetapi_translate_string() functionality.
|
||
|
*
|
||
|
* The Facet API Test module is not set as the translator module, so we do it
|
||
|
* by setting the variable in this function. This prevetns it from interfering
|
||
|
* with other tests.
|
||
|
*
|
||
|
* @see facetapi_translate_string().
|
||
|
*/
|
||
|
public function testTranslateString() {
|
||
|
// Sets Facet API Test as the translator module.
|
||
|
variable_set('facetapi:translator_module', 'facetapi_test');
|
||
|
$translated = facetapi_translate_string('name', 'untranslated');
|
||
|
$array = unserialize($translated);
|
||
|
$this->assertEqual($array['return'], 'translated', t('String translated by facetapi_translate_string().'), 'Facet API');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests the facetapi_*_active_searcher() functions.
|
||
|
*
|
||
|
* @see facetapi_add_active_searcher().
|
||
|
* @see facetapi_is_active_searcher().
|
||
|
*/
|
||
|
public function testActiveSearcher() {
|
||
|
// Searcher is not active by default, test that context is FALSE.
|
||
|
$active = facetapi_is_active_searcher('facetapi_test');
|
||
|
$this->assertFalse($active, t('Searcher correctly identified as inactive.'), 'Facet API');
|
||
|
|
||
|
// Sets active searcher, test that context is TRUE.
|
||
|
facetapi_add_active_searcher('facetapi_test');
|
||
|
$active = facetapi_is_active_searcher('facetapi_test');
|
||
|
$this->assertTrue($active, t('Searcher correctly identified as active.'), 'Facet API');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests the requirements system for property existence.
|
||
|
*
|
||
|
* @see facetapi_check_requirements()
|
||
|
* @see facetapi_requirement_property_set()
|
||
|
* @see facetapi_requirement_realm_property_set()
|
||
|
* @see facetapi_requirement_facet_property_set()
|
||
|
*/
|
||
|
public function testPropertySetRequirements() {
|
||
|
list($facet, $realm, $adapter) = $this->facetapiLoadObjects();
|
||
|
|
||
|
$requirements = array(
|
||
|
'facetapi_requirement_facet_property_set' => array('label' => TRUE),
|
||
|
);
|
||
|
$passed = facetapi_check_requirements($requirements, $realm, $facet);
|
||
|
$this->assertTrue($passed, t('Requirements pass when an existing facet property is required to be set.'), 'Facet API');
|
||
|
|
||
|
$requirements = array(
|
||
|
'facetapi_requirement_facet_property_set' => array('label' => FALSE),
|
||
|
);
|
||
|
$passed = facetapi_check_requirements($requirements, $realm, $facet);
|
||
|
$this->assertFalse($passed, t('Requirements fail when an existing facet property is required to not be set.'), 'Facet API');
|
||
|
|
||
|
$requirements = array(
|
||
|
'facetapi_requirement_facet_property_set' => array('nonsense' => FALSE),
|
||
|
);
|
||
|
$passed = facetapi_check_requirements($requirements, $realm, $facet);
|
||
|
$this->assertTrue($passed, t('Requirements pass when a non-existent facet property is required not to be set.'), 'Facet API');
|
||
|
|
||
|
$requirements = array(
|
||
|
'facetapi_requirement_facet_property_set' => array('nonsense' => TRUE),
|
||
|
);
|
||
|
$passed = facetapi_check_requirements($requirements, $realm, $facet);
|
||
|
$this->assertFalse($passed, t('Requirements fail when a facet property that is not set is required.'), 'Facet API');
|
||
|
|
||
|
|
||
|
$requirements = array(
|
||
|
'facetapi_requirement_realm_property_set' => array('label' => TRUE),
|
||
|
);
|
||
|
$passed = facetapi_check_requirements($requirements, $realm, $facet);
|
||
|
$this->assertTrue($passed, t('Requirements pass when an existing realm property is required to be set.'), 'Facet API');
|
||
|
|
||
|
$requirements = array(
|
||
|
'facetapi_requirement_realm_property_set' => array('label' => FALSE),
|
||
|
);
|
||
|
$passed = facetapi_check_requirements($requirements, $realm, $facet);
|
||
|
$this->assertFalse($passed, t('Requirements fail when an existing realm property is required to not be set.'), 'Facet API');
|
||
|
|
||
|
$requirements = array(
|
||
|
'facetapi_requirement_realm_property_set' => array('nonsense' => FALSE),
|
||
|
);
|
||
|
$passed = facetapi_check_requirements($requirements, $realm, $facet);
|
||
|
$this->assertTrue($passed, t('Requirements pass when a non-existent realm property is required not to be set.'), 'Facet API');
|
||
|
|
||
|
$requirements = array(
|
||
|
'facetapi_requirement_realm_property_set' => array('nonsense' => TRUE),
|
||
|
);
|
||
|
$passed = facetapi_check_requirements($requirements, $realm, $facet);
|
||
|
$this->assertFalse($passed, t('Requirements fail when a realm property that is not set is required.'), 'Facet API');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests the requirements system for property equality.
|
||
|
*
|
||
|
* @see facetapi_check_requirements()
|
||
|
* @see facetapi_requirement_property()
|
||
|
* @see facetapi_requirement_realm_property()
|
||
|
* @see facetapi_requirement_facet_property()
|
||
|
*/
|
||
|
public function testPropertyRequirements() {
|
||
|
list($facet, $realm, $adapter) = $this->facetapiLoadObjects();
|
||
|
|
||
|
$requirements = array(
|
||
|
'facetapi_requirement_facet_property' => array('label' => t('Enabled facet')),
|
||
|
);
|
||
|
$passed = facetapi_check_requirements($requirements, $realm, $facet);
|
||
|
$this->assertTrue($passed, t('Requirements pass when a testing whether a facet property equals the same value.'), 'Facet API');
|
||
|
|
||
|
$requirements = array(
|
||
|
'facetapi_requirement_facet_property' => array('label' => 'Does not match'),
|
||
|
);
|
||
|
$passed = facetapi_check_requirements($requirements, $realm, $facet);
|
||
|
$this->assertFalse($passed, t('Requirements fail when a testing whether a facet property equals a different value.'), 'Facet API');
|
||
|
|
||
|
|
||
|
$requirements = array(
|
||
|
'facetapi_requirement_realm_property' => array('label' => t('No display')),
|
||
|
);
|
||
|
$passed = facetapi_check_requirements($requirements, $realm, $facet);
|
||
|
$this->assertTrue($passed, t('Requirements pass when a testing whether a realm property equals the same value.'), 'Facet API');
|
||
|
|
||
|
$requirements = array(
|
||
|
'facetapi_requirement_realm_property' => array('label' => 'Does not match'),
|
||
|
);
|
||
|
$passed = facetapi_check_requirements($requirements, $realm, $facet);
|
||
|
$this->assertFalse($passed, t('Requirements fail when a testing whether a realm property equals a different value.'), 'Facet API');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests the requirements system for hierarchies.
|
||
|
*
|
||
|
* @see facetapi_check_requirements()
|
||
|
* @see facetapi_requirement_facet_property_set()
|
||
|
* @see facetapi_requirement_facet_hierarchical()
|
||
|
*/
|
||
|
public function testHierarchicalRequirements() {
|
||
|
list($e_facet, $realm, $adapter) = $this->facetapiLoadObjects();
|
||
|
$h_facet = facetapi_facet_load('hierarchical', 'facetapi_test');
|
||
|
|
||
|
// Tests facetapi_requirement_facet_hierarchical(). Builds the requirements
|
||
|
// array for the TRUE and FALSE checks.
|
||
|
$requirements_t = array('facetapi_requirement_facet_hierarchical' => TRUE);
|
||
|
$requirements_f = array('facetapi_requirement_facet_hierarchical' => FALSE);
|
||
|
|
||
|
$passed = facetapi_check_requirements($requirements_t, $realm, $h_facet);
|
||
|
$this->assertTrue($passed, t('Requirements pass when checking if a hierarchical facet is hierarchical.'), 'Facet API');
|
||
|
|
||
|
$passed = facetapi_check_requirements($requirements_f, $realm, $h_facet);
|
||
|
$this->assertFalse($passed, t('Requirements fail when checking if a hierarchical facet is not hierarchical.'), 'Facet API');
|
||
|
|
||
|
$passed = facetapi_check_requirements($requirements_f, $realm, $e_facet);
|
||
|
$this->assertTrue($passed, t('Requirements pass when checking if a non-hierarchical facet is not hierarchical.'), 'Facet API');
|
||
|
|
||
|
$passed = facetapi_check_requirements($requirements_t, $realm, $e_facet);
|
||
|
$this->assertFalse($passed, t('Requirements fail when checking if a non-hierarchical facet is hierarchical.'), 'Facet API');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests the facetapi_access_callback() access callback.
|
||
|
*
|
||
|
* @see facetapi_access_callback().
|
||
|
*/
|
||
|
public function testAccessCallback() {
|
||
|
// The $this->adminUser has the "administer search" permission.
|
||
|
$this->drupalLogin($this->adminUser);
|
||
|
$access = facetapi_access_callback($this->loggedInUser);
|
||
|
$this->assertTrue($access, t('The facetapi_access_callback() function returns TRUE for users with the "administer search" permission.'), 'Facet API');
|
||
|
|
||
|
// Create another user with the "administer facets" permission.
|
||
|
$facet_admin_user = $this->drupalCreateUser(array('administer facets'));
|
||
|
$this->drupalLogin($facet_admin_user);
|
||
|
$access = facetapi_access_callback($this->loggedInUser);
|
||
|
$this->assertTrue($access, t('The facetapi_access_callback() function returns TRUE for users with the "administer facets" permission.'), 'Facet API');
|
||
|
|
||
|
// Users without either permission should be denied access.
|
||
|
$this->drupalLogin($this->authenticatedUser);
|
||
|
$access = facetapi_access_callback($this->loggedInUser);
|
||
|
$this->assertFalse($access, t('The facetapi_access_callback() function returns FALSE for users with neither the "administer search" nor "administer facets" permissions.'), 'Facet API');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tests the loading of the adapter.
|
||
|
*
|
||
|
* Performs three tests:
|
||
|
* - A valid adapter can be loaded.
|
||
|
* - An invalid adapter returns FALSE.
|
||
|
* - Only one instance per searcher is loaded.
|
||
|
*/
|
||
|
public function testAdapterLoad() {
|
||
|
// Loads a valid adapter.
|
||
|
$adapter1 = facetapi_adapter_load('facetapi_test');
|
||
|
$value = ($adapter1 instanceof FacetapiAdapter);
|
||
|
$this->assertTrue($value, t('FacetapiAdapter object loaded via facetapi_adapter_load().'), 'Facet API');
|
||
|
|
||
|
// Loads an invalid adapter.
|
||
|
$adapter_bad = facetapi_adapter_load('nonsense');
|
||
|
$this->assertFalse($adapter_bad, t('FacetapiAdapter object loaded via facetapi_adapter_load().'), 'Facet API');
|
||
|
|
||
|
// Sets a semaphore to see if singleton pattern is implemented.\
|
||
|
$adapter1->semaphore = 'test';
|
||
|
$adapter2 = facetapi_adapter_load('facetapi_test');
|
||
|
$value = (isset($adapter2->semaphore) && 'test' == $adapter2->semaphore);
|
||
|
$this->assertTrue($value, t('Singleton pattern implemented by facetapi_adapter_load().'), 'Facet API');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Test active item processing via the url processor plugin.
|
||
|
*
|
||
|
* @see FacetapiUrlProcessorStandard
|
||
|
* @see FacetapiUrlProcessorStandard::fetchParams()
|
||
|
* @see FacetapiUrlProcessorStandard::normalizeParams()
|
||
|
* @see FacetapiUrlProcessorStandard::setParams()
|
||
|
* @see FacetapiUrlProcessorStandard::getParams()
|
||
|
* @see FacetapiAdapter::initUrlProcessor()
|
||
|
* @see FacetapiAdapter::setParams()
|
||
|
* @see FacetapiAdapter::processActiveItems()
|
||
|
* @see FacetapiAdapter::getAllActiveItems()
|
||
|
*/
|
||
|
public function testUrlProcessorDataProcessing() {
|
||
|
list($facet, $realm, $adapter) = $this->facetapiLoadObjects();
|
||
|
facetapi_save_facet_enabled($adapter, $realm, $facet);
|
||
|
|
||
|
// Capture real $_GET.
|
||
|
$get = $_GET;
|
||
|
|
||
|
// Fake the query string.
|
||
|
$_GET = array(
|
||
|
'q' => array(),
|
||
|
'page' => 1,
|
||
|
'f' => array('enabled:testone', 'disabled:testfour', 'enabled:testthree'),
|
||
|
);
|
||
|
|
||
|
// Ensure that the adapter loads the URL processor plugin.
|
||
|
$url_processor = $adapter->getUrlProcessor();
|
||
|
$passed = ($url_processor instanceof FacetapiUrlProcessorStandard);
|
||
|
$this->assertTrue($passed, t('An instance of FacetapiUrlProcessorStandard is returned by the adapter.'), 'Facet API');
|
||
|
|
||
|
// Test fetching params.
|
||
|
$fetched = $url_processor->fetchParams();
|
||
|
$this->assertEqual($fetched, $_GET, t('Parameters fetched from $_GET by FacetapiUrlProcessorStandard::fetchParams().'), 'Facet API');
|
||
|
|
||
|
// Test normalizing fetched params.
|
||
|
$normalized = $url_processor->normalizeParams($fetched);
|
||
|
$this->assertTrue(!isset($normalized['q']), t('The "q" variable is stripped by FacetapiUrlProcessorStandard::normalizeParams().'), 'Facet API');
|
||
|
$this->assertTrue(!isset($normalized['page']), t('The "page" variable is stripped by FacetapiUrlProcessorStandard::normalizeParams().'), 'Facet API');
|
||
|
|
||
|
// Test setting and getting params.
|
||
|
$url_processor->setParams($normalized);
|
||
|
$params = $url_processor->getParams();
|
||
|
$this->assertEqual($normalized, $params, t('Parameters are able to be set and retrieved by getter and setter methods of FacetapiUrlProcessorStandard.'), 'Facet API');
|
||
|
|
||
|
// Test processing of active items.
|
||
|
$adapter->initUrlProcessor();
|
||
|
$active_items = $adapter->getAllActiveItems();
|
||
|
$true = isset($active_items['enabled:testone']);
|
||
|
$this->assertTrue($true, t('Value for enabled facet extracted as an active item.'), 'Facet API');
|
||
|
$false = isset($active_items['disabled:testfour']);
|
||
|
$this->assertFalse($false, t('Value for disabled facet not extracted as an active item.'), 'Facet API');
|
||
|
|
||
|
// Test re-processing of active items.
|
||
|
$facet_d = facetapi_facet_load('disabled', 'facetapi_test');
|
||
|
facetapi_save_facet_enabled($adapter, $realm, $facet_d);
|
||
|
$adapter->initUrlProcessor();
|
||
|
$active_items = $adapter->getAllActiveItems();
|
||
|
$true = isset($active_items['disabled:testfour']);
|
||
|
$this->assertTrue($true, t('Reprocessed value for enabled facet extracted as an active item.'), 'Facet API');
|
||
|
|
||
|
// Reset real $_GET.
|
||
|
$_GET = $get;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Test query string building via the url processor plugin.
|
||
|
*
|
||
|
* @see FacetapiUrlProcessor::getQueryString()
|
||
|
*/
|
||
|
public function testUrlProcessorQueryString() {
|
||
|
list($facet, $realm, $adapter) = $this->facetapiLoadObjects();
|
||
|
facetapi_save_facet_enabled($adapter, $realm, $facet);
|
||
|
|
||
|
// Send params with facet data.
|
||
|
$params = array(
|
||
|
'f' => array('enabled:testone', 'enabled:testthree'),
|
||
|
);
|
||
|
$adapter->setParams($params);
|
||
|
$url_processor = $adapter->getUrlProcessor();
|
||
|
|
||
|
// Tests activating an additional facet item.
|
||
|
$qstring = $url_processor->getQueryString($facet, array('testtwo'), 0);
|
||
|
$expected = array('f' => array('enabled:testone', 'enabled:testthree', 'enabled:testtwo'));
|
||
|
$this->assertEqual($qstring, $expected, t('Facet item is appended to the query string when activated.'), 'Facet API');
|
||
|
|
||
|
// Tests deactivating an additional facet item.
|
||
|
$qstring = $url_processor->getQueryString($facet, array('testone'), 1);
|
||
|
$expected = array('f' => array('enabled:testthree'));
|
||
|
$this->assertEqual($qstring, $expected, t('Facet item is removed from the query string when deactivated.'), 'Facet API');
|
||
|
}
|
||
|
}
|