X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Flinkchecker%2Fsrc%2FTests%2FLinkCheckerLinkExtractionTest.php;fp=web%2Fmodules%2Fcontrib%2Flinkchecker%2Fsrc%2FTests%2FLinkCheckerLinkExtractionTest.php;h=de937e001cc640ac869908b00591000e5829bec7;hb=8acec36f19c470dfcda1ae2336826a782f41874c;hp=0000000000000000000000000000000000000000;hpb=e0411c4e83ba0d079034db83c3f7f55be24a0e35;p=yaffs-website diff --git a/web/modules/contrib/linkchecker/src/Tests/LinkCheckerLinkExtractionTest.php b/web/modules/contrib/linkchecker/src/Tests/LinkCheckerLinkExtractionTest.php new file mode 100644 index 000000000..de937e001 --- /dev/null +++ b/web/modules/contrib/linkchecker/src/Tests/LinkCheckerLinkExtractionTest.php @@ -0,0 +1,395 @@ +admin_user = $this->drupalCreateUser($permissions); + $this->drupalLogin($this->admin_user); + } + + public function testLinkCheckerCreateNodeWithLinks() { + + // Enable all node type page for link extraction. + variable_set('linkchecker_scan_node_page', TRUE); + 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_url' => 'filter_url')); + + // 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_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 +./test/foo bar/is_valid-hack.test + + +URL with uncommon chars +URL with space +URL with ajax query params +URL with standard anchor + + + + +
+ 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); + + // Fill node array. + $langcode = LANGUAGE_NONE; + $edit = array(); + $edit['title'] = $this->randomName(32); + $edit["body[$langcode][0][value]"] = $body; + $edit['path[alias]'] = $folder1 . '/' . $folder2; + $edit["body[$langcode][0][format]"] = 'full_html'; + + // Extract only full qualified URLs. + variable_set('linkchecker_check_links_types', 1); + + // Verify path input field appears on add "Basic page" form. + $this->drupalGet('node/add/page'); + // Verify path input is present. + $this->assertFieldByName('path[alias]', '', 'Path input field present on add Basic page form.'); + + // Save node. + $this->drupalPost('node/add/page', $edit, t('Save')); + $this->assertText(t('@type @title has been created.', array('@type' => 'Basic page', '@title' => $edit['title'])), 'Node was created.'); + + // Verify if the content links are extracted properly. + $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', + 'http://example.com/foo bar/is_valid-hack.test', + 'http://example.com/ajax.html#key1=value1&key2=value2', + 'http://example.com/test.html#test', + ); + + foreach ($urls_fqdn as $org_url => $check_url) { + $link = $this->getLinkCheckerLink($check_url); + if ($link) { + $this->assertIdentical($link->url, $check_url, format_string('Absolute URL %org_url matches expected result %check_url.', array('%org_url' => $org_url, '%check_url' => $check_url))); + } + else { + $this->fail(format_string('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, format_string('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_check_links_types', 0); + + $node = $this->drupalGetNodeByTitle($edit['title']); + $this->assertTrue($node, 'Node found in database.'); + $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save')); + $this->assertRaw(t('@type %title has been updated.', array('@type' => 'Basic page', '%title' => $edit['title']))); + + // @todo Path alias seems not saved!??? + // $this->assertIdentical($node->path, $edit['path'], format_string('URL alias "@node-path" matches path "@edit-path".', array('@node-path' => $node->path, '@edit-path' => $edit['path']))); + + // Verify if the content links are extracted properly. + 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', + './test/foo bar/is_valid-hack.test' => $base_root . $base_path . $folder1 . '/test/foo bar/is_valid-hack.test', + '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', array('items' => $urls_relative, 'title' => 'Verify if following relative URLs exists:'))); + + $links_debug = array(); + $result = db_query('SELECT url FROM {linkchecker_link}'); + foreach ($result as $row) { + $links_debug[] = $row->url; + } + $this->verbose(theme('item_list', array('items' => $links_debug, 'title' => 'Following URLs exists:'))); + + foreach ($urls_relative as $org_url => $check_url) { + $link = $this->getLinkCheckerLink($check_url); + if ($link) { + $this->assertIdentical($link->url, $check_url, format_string('Relative URL %org_url matches expected result %check_url.', array('%org_url' => $org_url, '%check_url' => $check_url))); + } + else { + $this->fail(format_string('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, format_string('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 . '/test/foo bar/is_valid-hack.test', + $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, format_string('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/', + 'http://example.com/foo bar/is_valid-hack.test', + 'http://example.com/ajax.html#key1=value1&key2=value2', + 'http://example.com/test.html#test', + ); + + foreach ($documentation_urls as $documentation_url) { + $this->assertFalse($this->getLinkcheckerLink($documentation_url)->status, format_string('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 + * The link object. + */ + function getLinkCheckerLink($url) { + return db_query('SELECT * FROM {linkchecker_link} WHERE urlhash = :urlhash', array(':urlhash' => drupal_hash_base64($url)))->fetchObject(); + } + + /** + * Get the current number of links in linkchecker_links table. + */ + function getLinkCheckerLinksCount() { + return db_query('SELECT COUNT(1) FROM {linkchecker_link}')->fetchField(); + } +}