privilegedUser = $this->drupalCreateUser($this->permissions); $this->drupalLogin($this->privilegedUser); } /** * Update Block CSS class and assert whether it is found when displayed. * * @param bool $anon * (optional) Set to TRUE to view block with anon user, defaults to TRUE. * @param string $module * (optional) Machine name of the module Defaults to * $this->module if set to NULL. * @param string $delta * (optional) Block delta as provided by its module. Defaults to * $this->delta if set to NULL. */ public function assertUpdateBlockClass($anon = FALSE, $module = NULL, $delta = NULL) { // Initialize $module and $delta by default if no value is provided. if (!isset($module)) { $module = $this->module; } if (!isset($delta)) { $delta = $this->delta; } // Test with three random class names. $css_classes = implode(' ', array( $this->randomName(8), $this->randomName(8), $this->randomName(8), )); // Update Block CSS class field. $this->drupalPost("admin/structure/block/manage/$module/$delta/configure", array('css_class' => $css_classes), t('Save block')); // Check Block configuration was saved successfully. $this->assertText(t('The block configuration has been saved.')); // Browse to the homepage. $this->drupalGet(''); // Log out if the test is for anonymous user. if ($anon) { $this->drupalLogout(); // Browse back to the homepage. $this->drupalGet(''); } // Check if the Block CSS classes could be found. $this->assertPattern('/class=\"(.*?)' . $css_classes . '(.*?)\"/', format_string('The CSS classes were found: @css_classes', array('@css_classes' => $css_classes))); // Login again after testing with the anonumous user. if ($anon) { $this->drupalLogin($this->privilegedUser); } } } /** * Test the update and display of the CSS class for a Block. */ class BlockClassUpdateDisplayTestCase extends BlockClassTestCase { /** * Implements DrupalWebTestCase::getInfo(). */ public static function getInfo() { return array( 'name' => 'Block CSS class update and display', 'description' => 'Test the update of a Block CSS class field and the display for the Main Page Content Block.', 'group' => 'Block Class', ); } /** * Update and display a Block multiple times to ensure CSS class is found. * * A Block is updated and displayed several times and with logged in or * anonymous user, with Block cache turned enabled or disabled. */ public function testUpdateDisplayClass() { // Edit the block, change the class and check if the CSS classes are found. $this->assertUpdateBlockClass(); // Now, turn on caching programmatically and set it to 15 min expiry. variable_set('block_cache', TRUE); variable_set('cache_lifetime', 900); variable_set('page_cache_maximum_age', 900); // Edit the block, change the class and check with the anonymous user. $this->assertUpdateBlockClass(TRUE); // Edit the block, change the class and check with the anonymous user. $this->assertUpdateBlockClass(TRUE); } } /** * Test Block Class permissions. */ class BlockClassPermissionTestCase extends BlockClassTestCase { /** * Implements DrupalWebTestCase::getInfo(). */ public static function getInfo() { return array( 'name' => 'Administer block classes permission', 'description' => 'Test the permission added by the module to administer block classes.', 'group' => 'Block Class', ); } /** * Enable modules and create user with specific permissions. */ public function setUp() { // Remove the 'administer block classes' permission from the base class. $this->permissions = array('administer blocks'); parent::setUp(); } /** * Ensure Block CSS classes field is only visible with the right permissions. * * Test if a user without 'administer block classes' permission has access to * the Block CSS classes field on the block configuration page. */ public function testPermission() { // Browse to the "Main page content" block editing form page. $this->drupalGet("admin/structure/block/manage/{$this->module}/{$this->delta}/configure"); // Check that the css_class field couldn't be found. // If the field is not found, it can't be submitted through drupalPost. $this->assertNoFieldById('css_class', 'The Css classes field was not found on the page.'); } } /** * Test Block Class integration with Context. */ class BlockClassContextTestCase extends BlockClassUpdateDisplayTestCase { /** * Implements DrupalWebTestCase::getInfo(). */ public static function getInfo() { return array( 'name' => 'Integration with Context', 'description' => 'Test the integration of Block Class with the Context module and the update/display of a Block CSS class.', // Include required contributed modules context and ctools for the test. 'dependencies' => array('context', 'ctools'), 'group' => 'Block Class', ); } /** * Enable modules and create user with specific permissions. */ public function setUp() { // Override default module and delta to test with the "Who's online" block. $this->module = 'user'; $this->delta = 'online'; // Include the Context module and its dependencies to be loaded. parent::setUp('context'); // Initialize a test context with the test block. $this->initializeContext(); } /** * Helper function to initialize a test Context with a test block. */ public function initializeContext() { // Import a basic context exported through the admin interface. $context = new stdClass(); $context->disabled = FALSE; $context->api_version = 3; $context->name = 'front'; $context->description = 'Frontpage Context'; $context->tag = ''; $context->conditions = array( 'path' => array( 'values' => array( '' => '', ), ), ); $context->reactions = array( 'block' => array( 'blocks' => array( $this->module . '-' . $this->delta => array( 'module' => $this->module, 'delta' => $this->delta, 'region' => 'content', 'weight' => '-10', ), ), ), ); $context->condition_mode = 0; // Translatables // Included for use with string extractors like potx. t('Frontpage Context'); // Save the context. context_save($context); } } /** * Test Block Class integration with Features through FE Block. */ class BlockClassFeaturesTestCase extends BlockClassTestCase { /** * Implements DrupalWebTestCase::getInfo(). */ public static function getInfo() { return array( 'name' => 'Integration with Features', 'description' => 'Test the integration of Block Class with Features through the FE Block module and the update/display of a Block CSS class.', // Include Features related modules required for this Test Case. 'dependencies' => array('features', 'ctools', 'fe_block'), 'group' => 'Block Class', ); } /** * Enable modules and create user with specific permissions. */ public function setUp() { // Override default module and delta to test with the "Who's online" block. $this->module = 'user'; $this->delta = 'online'; // Include all Features related modules and Test Helper feature. parent::setUp('block_class_fe_block_test'); } /** * Test how Block Class reacts when exported to a Feature with FE Block. * * Helper Feature's Block configuration settings are imported, updated and * the display is tested several times, before reverting the feature. */ public function testFeatureDisplayClass() { // Block classes exported to the Test Feature module. $test_classes = 'fe_block-class1 fe_block-class2 fe_block-class3'; // Test helper feature machine name. $test_feature = 'block_class_fe_block_test'; // Browse to the front page and check Block's CSS classes configuration. $this->drupalGet(''); // Check if feature's Block CSS classes could be found. $this->assertPattern('/class=\"(.*?)' . $test_classes . '(.*?)\"/', format_string('The CSS classes from exported feature were found: @css_classes', array('@css_classes' => $test_classes))); // Check Block's configuration form css_class field value. $this->drupalGet("admin/structure/block/manage/{$this->module}/{$this->delta}/configure"); $this->assertFieldByName('css_class', $test_classes, format_string('The CSS classes from exported feature were found for the field css_class in the Block\'s configuration page: @css_classes', array('@css_classes' => $test_classes))); // Run a standard Update/Display Test check with Anon. $this->assertUpdateBlockClass(TRUE); // Ensure Feature's state is overriden for 'fe_block_settings' component. module_load_include('inc', 'features', 'features.export'); $test_feature_state = features_get_storage($test_feature); $this->assertFalse(empty($test_feature_state), 'The state of the Block Class FE Block Integration Test Helper feature is Overridden.'); $test_feature_states = features_get_component_states(array($test_feature)); $this->assertFalse(empty($test_feature_states[$test_feature]['fe_block_settings']), 'The state of the fe_block_settings component of the Block Class FE Block Integration Test Helper feature is Overridden.'); // Revert feature and check again. features_revert_module($test_feature); // Browse to the front page and check Block's CSS classes configuration. $this->drupalGet(''); // Check if feature's Block CSS classes could be found. $this->assertPattern('/class=\"(.*?)' . $test_classes . '(.*?)\"/', format_string('After reverting the feature, the CSS classes from exported feature were found: @css_classes', array('@css_classes' => $test_classes))); // Check Block's configuration form css_class field value. $this->drupalGet("admin/structure/block/manage/{$this->module}/{$this->delta}/configure"); $this->assertFieldByName('css_class', $test_classes, format_string('After reverting the feature, the CSS classes from exported feature were found for the field css_class in the Block\'s configuration page: @css_classes', array('@css_classes' => $test_classes))); } }