'Filter CRUD operations', 'description' => 'Test creation, loading, updating, deleting of text formats and filters.', 'group' => 'Filter', ); } function setUp() { parent::setUp('filter_test'); } /** * Tests CRUD operations for text formats and filters. */ function testTextFormatCRUD() { // Add a text format with minimum data only. $format = new stdClass(); $format->format = 'empty_format'; $format->name = 'Empty format'; filter_format_save($format); $this->verifyTextFormat($format); $this->verifyFilters($format); // Add another text format specifying all possible properties. $format = new stdClass(); $format->format = 'custom_format'; $format->name = 'Custom format'; $format->filters = array( 'filter_url' => array( 'status' => 1, 'settings' => array( 'filter_url_length' => 30, ), ), ); filter_format_save($format); $this->verifyTextFormat($format); $this->verifyFilters($format); // Alter some text format properties and save again. $format->name = 'Altered format'; $format->filters['filter_url']['status'] = 0; $format->filters['filter_autop']['status'] = 1; filter_format_save($format); $this->verifyTextFormat($format); $this->verifyFilters($format); // Add a uncacheable filter and save again. $format->filters['filter_test_uncacheable']['status'] = 1; filter_format_save($format); $this->verifyTextFormat($format); $this->verifyFilters($format); // Disable the text format. filter_format_disable($format); $db_format = db_query("SELECT * FROM {filter_format} WHERE format = :format", array(':format' => $format->format))->fetchObject(); $this->assertFalse($db_format->status, 'Database: Disabled text format is marked as disabled.'); $formats = filter_formats(); $this->assertTrue(!isset($formats[$format->format]), 'filter_formats: Disabled text format no longer exists.'); // Add a new format to check for Xss in format name. $format = new stdClass(); $format->format = 'xss_format'; $format->name = ''; filter_format_save($format); user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(filter_permission_name($format) => 1)); $this->drupalGet('filter/tips'); $this->assertNoRaw($format->name, 'Text format name contains no xss.'); } /** * Verifies that a text format is properly stored. */ function verifyTextFormat($format) { $t_args = array('%format' => $format->name); // Verify text format database record. $db_format = db_select('filter_format', 'ff') ->fields('ff') ->condition('format', $format->format) ->execute() ->fetchObject(); $this->assertEqual($db_format->format, $format->format, format_string('Database: Proper format id for text format %format.', $t_args)); $this->assertEqual($db_format->name, $format->name, format_string('Database: Proper title for text format %format.', $t_args)); $this->assertEqual($db_format->cache, $format->cache, format_string('Database: Proper cache indicator for text format %format.', $t_args)); $this->assertEqual($db_format->weight, $format->weight, format_string('Database: Proper weight for text format %format.', $t_args)); // Verify filter_format_load(). $filter_format = filter_format_load($format->format); $this->assertEqual($filter_format->format, $format->format, format_string('filter_format_load: Proper format id for text format %format.', $t_args)); $this->assertEqual($filter_format->name, $format->name, format_string('filter_format_load: Proper title for text format %format.', $t_args)); $this->assertEqual($filter_format->cache, $format->cache, format_string('filter_format_load: Proper cache indicator for text format %format.', $t_args)); $this->assertEqual($filter_format->weight, $format->weight, format_string('filter_format_load: Proper weight for text format %format.', $t_args)); // Verify the 'cache' text format property according to enabled filters. $filter_info = filter_get_filters(); $filters = filter_list_format($filter_format->format); $cacheable = TRUE; foreach ($filters as $name => $filter) { // If this filter is not cacheable, update $cacheable accordingly, so we // can verify $format->cache after iterating over all filters. if ($filter->status && isset($filter_info[$name]['cache']) && !$filter_info[$name]['cache']) { $cacheable = FALSE; break; } } $this->assertEqual($filter_format->cache, $cacheable, 'Text format contains proper cache property.'); } /** * Verifies that filters are properly stored for a text format. */ function verifyFilters($format) { // Verify filter database records. $filters = db_query("SELECT * FROM {filter} WHERE format = :format", array(':format' => $format->format))->fetchAllAssoc('name'); $format_filters = $format->filters; foreach ($filters as $name => $filter) { $t_args = array('%format' => $format->name, '%filter' => $name); // Verify that filter status is properly stored. $this->assertEqual($filter->status, $format_filters[$name]['status'], format_string('Database: Proper status for %filter in text format %format.', $t_args)); // Verify that filter settings were properly stored. $this->assertEqual(unserialize($filter->settings), isset($format_filters[$name]['settings']) ? $format_filters[$name]['settings'] : array(), format_string('Database: Proper filter settings for %filter in text format %format.', $t_args)); // Verify that each filter has a module name assigned. $this->assertTrue(!empty($filter->module), format_string('Database: Proper module name for %filter in text format %format.', $t_args)); // Remove the filter from the copy of saved $format to check whether all // filters have been processed later. unset($format_filters[$name]); } // Verify that all filters have been processed. $this->assertTrue(empty($format_filters), 'Database contains values for all filters in the saved format.'); // Verify filter_list_format(). $filters = filter_list_format($format->format); $format_filters = $format->filters; foreach ($filters as $name => $filter) { $t_args = array('%format' => $format->name, '%filter' => $name); // Verify that filter status is properly stored. $this->assertEqual($filter->status, $format_filters[$name]['status'], format_string('filter_list_format: Proper status for %filter in text format %format.', $t_args)); // Verify that filter settings were properly stored. $this->assertEqual($filter->settings, isset($format_filters[$name]['settings']) ? $format_filters[$name]['settings'] : array(), format_string('filter_list_format: Proper filter settings for %filter in text format %format.', $t_args)); // Verify that each filter has a module name assigned. $this->assertTrue(!empty($filter->module), format_string('filter_list_format: Proper module name for %filter in text format %format.', $t_args)); // Remove the filter from the copy of saved $format to check whether all // filters have been processed later. unset($format_filters[$name]); } // Verify that all filters have been processed. $this->assertTrue(empty($format_filters), 'filter_list_format: Loaded filters contain values for all filters in the saved format.'); } } /** * Tests the administrative functionality of the Filter module. */ class FilterAdminTestCase extends DrupalWebTestCase { public static function getInfo() { return array( 'name' => 'Filter administration functionality', 'description' => 'Thoroughly test the administrative interface of the filter module.', 'group' => 'Filter', ); } function setUp() { parent::setUp(); // Create users. $filtered_html_format = filter_format_load('filtered_html'); $full_html_format = filter_format_load('full_html'); $this->admin_user = $this->drupalCreateUser(array( 'administer filters', filter_permission_name($filtered_html_format), filter_permission_name($full_html_format), )); $this->web_user = $this->drupalCreateUser(array('create page content', 'edit own page content')); $this->drupalLogin($this->admin_user); } /** * Tests the format administration functionality. */ function testFormatAdmin() { // Add text format. $this->drupalGet('admin/config/content/formats'); $this->clickLink('Add text format'); $format_id = drupal_strtolower($this->randomName()); $name = $this->randomName(); $edit = array( 'format' => $format_id, 'name' => $name, ); $this->drupalPost(NULL, $edit, t('Save configuration')); // Verify default weight of the text format. $this->drupalGet('admin/config/content/formats'); $this->assertFieldByName("formats[$format_id][weight]", 0, 'Text format weight was saved.'); // Change the weight of the text format. $edit = array( "formats[$format_id][weight]" => 5, ); $this->drupalPost('admin/config/content/formats', $edit, t('Save changes')); $this->assertFieldByName("formats[$format_id][weight]", 5, 'Text format weight was saved.'); // Edit text format. $this->drupalGet('admin/config/content/formats'); $this->assertLinkByHref('admin/config/content/formats/' . $format_id); $this->drupalGet('admin/config/content/formats/' . $format_id); $this->drupalPost(NULL, array(), t('Save configuration')); // Verify that the custom weight of the text format has been retained. $this->drupalGet('admin/config/content/formats'); $this->assertFieldByName("formats[$format_id][weight]", 5, 'Text format weight was retained.'); // Disable text format. $this->assertLinkByHref('admin/config/content/formats/' . $format_id . '/disable'); $this->drupalGet('admin/config/content/formats/' . $format_id . '/disable'); $this->drupalPost(NULL, array(), t('Disable')); // Verify that disabled text format no longer exists. $this->drupalGet('admin/config/content/formats/' . $format_id); $this->assertResponse(404, 'Disabled text format no longer exists.'); // Attempt to create a format of the same machine name as the disabled // format but with a different human readable name. $edit = array( 'format' => $format_id, 'name' => 'New format', ); $this->drupalPost('admin/config/content/formats/add', $edit, t('Save configuration')); $this->assertText('The machine-readable name is already in use. It must be unique.'); // Attempt to create a format of the same human readable name as the // disabled format but with a different machine name. $edit = array( 'format' => 'new_format', 'name' => $name, ); $this->drupalPost('admin/config/content/formats/add', $edit, t('Save configuration')); $this->assertRaw(t('Text format names must be unique. A format named %name already exists.', array( '%name' => $name, ))); } /** * Tests filter administration functionality. */ function testFilterAdmin() { // URL filter. $first_filter = 'filter_url'; // Line filter. $second_filter = 'filter_autop'; $filtered = 'filtered_html'; $full = 'full_html'; $plain = 'plain_text'; // Check that the fallback format exists and cannot be disabled. $this->assertTrue($plain == filter_fallback_format(), 'The fallback format is set to plain text.'); $this->drupalGet('admin/config/content/formats'); $this->assertNoRaw('admin/config/content/formats/' . $plain . '/disable', 'Disable link for the fallback format not found.'); $this->drupalGet('admin/config/content/formats/' . $plain . '/disable'); $this->assertResponse(403, 'The fallback format cannot be disabled.'); // Verify access permissions to Full HTML format. $this->assertTrue(filter_access(filter_format_load($full), $this->admin_user), 'Admin user may use Full HTML.'); $this->assertFalse(filter_access(filter_format_load($full), $this->web_user), 'Web user may not use Full HTML.'); // Add an additional tag. $edit = array(); $edit['filters[filter_html][settings][allowed_html]'] = '