t('Link extraction tests'), 'description' => t('Test Link checker module link extraction functionality.'), 'group' => 'Link checker', ); } public function setUp() { parent::setUp('linkchecker', 'path'); $permissions = array( 'create page content', 'edit own page content', 'administer url aliases', 'create url aliases', ); $user = $this->drupalCreateUser($permissions); $this->drupalLogin($user); } public function testLinkCheckerCreateNodeWithLinks() { // Enable all node type page for link extraction. variable_set('linkchecker_scan_nodetypes', array('page')); variable_set('linkchecker_scan_blocks', 1); // Core enables the URL filter for "Full HTML" by default. // -> Blacklist / Disable URL filter for testing. variable_set('linkchecker_filter_blacklist', array('filter/2')); // Extract from all link checker supported HTML tags. variable_set('linkchecker_extract_from_a', 1); variable_set('linkchecker_extract_from_audio', 1); variable_set('linkchecker_extract_from_embed', 1); variable_set('linkchecker_extract_from_iframe', 1); variable_set('linkchecker_extract_from_img', 1); variable_set('linkchecker_extract_from_object', 1); variable_set('linkchecker_extract_from_source', 1); variable_set('linkchecker_extract_from_video', 1); $body = << Send email Execute JavaScript Test image 1 Test image 2 ../foo1/bar1 ./foo2/bar2 ../foo3/../foo4/foo5 ./foo4/../foo5/foo6 ./foo4/./foo5/foo6 URL with uncommon chars
No weather report visible? At MSN you are able to find the weather report missing here and the Flash plugin can be found at Adobe.
/video/foo3.mp4 EOT; // Save folder names in variables for reuse. $folder1 = $this->randomName(10); $folder2 = $this->randomName(5); // Allow the user to use the 'Full HTML' format. db_query("UPDATE {filter_formats} SET roles = '%s' WHERE format = %d", ',2,', 2); // Fill node array. $edit = array(); $edit['title'] = $this->randomName(32); $edit['body'] = $body; $edit['path'] = $folder1 . '/' . $folder2; $edit['format'] = 2; // Extract only full qualified URLs. variable_set('linkchecker_fqdn_only', 1); // Verify path input field appears on add "Basic page" form. $this->drupalGet('node/add/page'); // Verify path input is present. $this->assertFieldByName('path', '', t('Path input field present on add Basic page form.')); // Save node. $this->drupalPost('node/add/page', $edit, t('Save')); $this->assertRaw(t('@type %title has been created.', array('@type' => 'Page', '%title' => $edit['title'])), t('Node was created.')); // Verify if the content links are extracted correctly. $urls_fqdn = array( 'http://www.lagrandeepicerie.fr/#e-boutique/Les_produits_du_moment,2/coffret_vins_doux_naturels,149', 'http://wetterservice.msn.de/phclip.swf?zip=60329&ort=Frankfurt', 'http://www.msn.de/', 'http://www.adobe.com/', 'http://www.apple.com/qtactivex/qtplugin.cab', 'http://example.net/video/foo1.mov', 'http://example.net/video/foo2.mov', 'http://example.net/video/foo3.mov', 'http://example.org/video/foo1.mp4', 'http://example.org/video/foo2.mp4', 'http://example.org/video/foo3.mp4', 'http://example.org/video/foo4.mp4', 'http://example.org/video/foo5.mp4', 'http://example.org/video/foo6.mp4', 'http://example.org/video/player1.swf', 'http://example.org/video/player2.swf', 'http://example.org/video/player3.swf', 'http://example.com/iframe/', 'http://www.theora.org/cortado.jar', 'http://v2v.cc/~j/theora_testsuite/pixel_aspect_ratio.ogg', 'http://v2v.cc/~j/theora_testsuite/pixel_aspect_ratio.mov', 'http://v2v.cc/~j/theora_testsuite/320x240.ogg', ); foreach ($urls_fqdn as $org_url => $check_url) { $link = $this->getLinkCheckerLink($check_url); if ($link) { $this->assertIdentical($link->url, $check_url, t('Absolute URL %org_url matches expected result %check_url.', array('%org_url' => $org_url, '%check_url' => $check_url))); } else { $this->fail(t('URL %check_url not found.', array('%check_url' => $check_url))); } } // Check if the number of links is correct. // - Verifies if all HTML tag regexes matched. // - Verifies that the linkchecker filter blacklist works well. $urls_in_database = $this->getLinkCheckerLinksCount(); $urls_expected_count = count($urls_fqdn); $this->assertEqual($urls_in_database, $urls_expected_count, t('Found @urls_in_database URLs in database matches expected result of @urls_expected_count.', array('@urls_in_database' => $urls_in_database, '@urls_expected_count' => $urls_expected_count))); // Extract all URLs including relative path. variable_set('clean_url', 1); variable_set('linkchecker_fqdn_only', 0); $node = $this->drupalGetNodeByTitle($edit['title']); $this->assertTrue($node, t('Node found in database.')); $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save')); $this->assertRaw(t('@type %title has been updated.', array('@type' => 'Page', '%title' => $edit['title']))); // FIXME: Path alias seems not saved!??? // $this->assertIdentical($node->path, $edit['path'], t('URL alias "@node-path" matches path "@edit-path".', array('@node-path' => $node->path, '@edit-path' => $edit['path']))); // DEBUG $linkchecker_links = db_query("SELECT * FROM {linkchecker_links}"); while ($row = db_fetch_array($linkchecker_links)) { $rows[] = $row['url']; } $this->verbose(theme_item_list($rows, 'URLs in database:')); // $this->fail('DEBUG: ' .implode('
', $rows)); // Verify if the content links are extracted correctly. global $base_root, $base_path; $urls_relative = array( '../foo1/test.png' => $base_root . $base_path . 'foo1/test.png', 'test.png' => $base_root . $base_path . $folder1 . '/test.png', '../foo1/bar1' => $base_root . $base_path . 'foo1/bar1', './foo2/bar2' => $base_root . $base_path . $folder1 . '/foo2/bar2', '../foo3/../foo4/foo5' => $base_root . $base_path . 'foo4/foo5', './foo4/../foo5/foo6' => $base_root . $base_path . $folder1 . '/foo5/foo6', './foo4/./foo5/foo6' => $base_root . $base_path . $folder1 . '/foo4/foo5/foo6', 'flash.png' => $base_root . $base_path . $folder1 . '/flash.png', 'ritmo.mid' => $base_root . $base_path . $folder1 . '/ritmo.mid', 'my_ogg_video.ogg' => $base_root . $base_path . $folder1 . '/my_ogg_video.ogg', 'video.ogv' => $base_root . $base_path . $folder1 . '/video.ogv', 'flvplayer1.swf' => $base_root . $base_path . $folder1 . '/flvplayer1.swf', 'flvplayer2.swf' => $base_root . $base_path . $folder1 . '/flvplayer2.swf', 'foo.ogg' => $base_root . $base_path . $folder1 . '/foo.ogg', ); $this->verbose(theme_item_list($urls_relative, 'Verify if following relative URLs exists:')); foreach ($urls_relative as $org_url => $check_url) { $link = $this->getLinkCheckerLink($check_url); if ($link) { $this->assertIdentical($link->url, $check_url, t('Relative URL %org_url matches expected result %check_url.', array('%org_url' => $org_url, '%check_url' => $check_url))); } else { $this->fail(t('URL %check_url not found.', array('%check_url' => $check_url))); } } // Check if the number of links is correct. $urls_in_database = $this->getLinkCheckerLinksCount(); $urls_expected_count = count($urls_fqdn + $urls_relative); $this->assertEqual($urls_in_database, $urls_expected_count, t('Found @urls_in_database URLs in database matches expected result of @urls_expected_count.', array('@urls_in_database' => $urls_in_database, '@urls_expected_count' => $urls_expected_count))); // Verify if link check has been enabled for normal URLs. $urls = array( 'http://www.lagrandeepicerie.fr/#e-boutique/Les_produits_du_moment,2/coffret_vins_doux_naturels,149', 'http://wetterservice.msn.de/phclip.swf?zip=60329&ort=Frankfurt', 'http://www.msn.de/', 'http://www.adobe.com/', 'http://www.apple.com/qtactivex/qtplugin.cab', 'http://www.theora.org/cortado.jar', 'http://v2v.cc/~j/theora_testsuite/pixel_aspect_ratio.ogg', 'http://v2v.cc/~j/theora_testsuite/pixel_aspect_ratio.mov', 'http://v2v.cc/~j/theora_testsuite/320x240.ogg', $base_root . $base_path . 'foo1/test.png', $base_root . $base_path . $folder1 . '/test.png', $base_root . $base_path . 'foo1/bar1', $base_root . $base_path . $folder1 . '/foo2/bar2', $base_root . $base_path . 'foo4/foo5', $base_root . $base_path . $folder1 . '/foo5/foo6', $base_root . $base_path . $folder1 . '/foo4/foo5/foo6', $base_root . $base_path . $folder1 . '/flash.png', $base_root . $base_path . $folder1 . '/ritmo.mid', $base_root . $base_path . $folder1 . '/my_ogg_video.ogg', $base_root . $base_path . $folder1 . '/video.ogv', $base_root . $base_path . $folder1 . '/flvplayer1.swf', $base_root . $base_path . $folder1 . '/flvplayer2.swf', $base_root . $base_path . $folder1 . '/foo.ogg', ); foreach ($urls as $url) { $this->assertTrue($this->getLinkcheckerLink($url)->status, t('Link check for %url is enabled.', array('%url' => $url))); } // Verify if link check has been disabled for example.com/net/org URLs. $documentation_urls = array( 'http://example.net/video/foo1.mov', 'http://example.net/video/foo2.mov', 'http://example.net/video/foo3.mov', 'http://example.org/video/foo1.mp4', 'http://example.org/video/foo2.mp4', 'http://example.org/video/foo3.mp4', 'http://example.org/video/foo4.mp4', 'http://example.org/video/foo5.mp4', 'http://example.org/video/foo6.mp4', 'http://example.org/video/player1.swf', 'http://example.org/video/player2.swf', 'http://example.org/video/player3.swf', 'http://example.com/iframe/', ); foreach ($documentation_urls as $documentation_url) { $this->assertFalse($this->getLinkcheckerLink($documentation_url)->status, t('Link check for %url is disabled.', array('%url' => $documentation_url))); } } /** * Get linkchecker link by url. * * @param string $url * URL of the link to find. * @return object * Link object. */ function getLinkCheckerLink($url) { return db_fetch_object(db_query("SELECT * FROM {linkchecker_links} WHERE urlhash = '%s'", md5($url))); } /** * Get the current number of links in linkchecker_links table. */ function getLinkCheckerLinksCount() { return db_result(db_query("SELECT COUNT(1) FROM {linkchecker_links}")); } } /** * Test case for impersonating users. * * Based on http://drupal.org/node/287292#comment-3162350 */ class LinkCheckerUserImpersonatingUserTestCase extends DrupalWebTestCase { public static function getInfo() { return array( 'name' => 'Link checker impersonate users', 'description' => 'Temporarily impersonate another user, and then restore the original user.', 'group' => 'Link checker', ); } function setUp() { parent::setUp('linkchecker'); } function testLinkCheckerImpersonateUser() { global $user; $original_user = $user; // If not currently logged in, use linkchecker_impersonate_user() to switch to // user 1. If logged in, switch to the anonymous user instead. if (user_is_anonymous()) { linkchecker_impersonate_user(1); } else { linkchecker_impersonate_user(0); } // Verify that the active user has changed, and that session saving is // disabled. $this->assertEqual($user->uid, ($original_user->uid == 0 ? 1 : 0), t('User switched')); $this->assertFalse(session_save_session(), t('Session saving is disabled.')); // Perform a second (nested) impersonation. linkchecker_impersonate_user(1); $this->assertEqual($user->uid, 1, t('User switched.')); // Revert to the user which was active between the first and second // impersonation attempt. linkchecker_revert_user(); // Since we are still impersonating the user from the first attempt, // session handling still needs to be disabled. $this->assertEqual($user->uid, ($original_user->uid == 0 ? 1 : 0), t('User switched.')); $this->assertFalse(session_save_session(), t('Session saving is disabled.')); // Revert to the original user which was active before the first // impersonation attempt. linkchecker_revert_user(); // Assert that the original user is the active user again, and that session // saving has been re-enabled. $this->assertEqual($user->uid, $original_user->uid, t('Original user successfully restored.')); // Simpletest uses linkchecker_impersonate_user() too, revert the impersonation by // Simpletest to enable session saving again. This is safe because calling // linkchecker_revert_user() too often simply results in returning the active user. linkchecker_revert_user(); $this->assertTrue(session_save_session(), t('Session saving is enabled.')); } }