. /** * Unit test for the filter_urltolink * * @package filter * @subpackage urltolink * @copyright 2010 David Mudrak * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); require_once($CFG->dirroot . '/filter/urltolink/filter.php'); // Include the code to test /** * Test subclass that makes all the protected methods we want to test public. */ class testable_filter_urltolink extends filter_urltolink { public function __construct() { } public function convert_urls_into_links(&$text) { parent::convert_urls_into_links($text); } } /** * Test cases for filter_urltolink class */ class filter_urltolink_test extends UnitTestCase { /** * Helper function that represents the legacy implementation * of convert_urls_into_links() */ protected function old_convert_urls_into_links(&$text) { /// Make lone URLs into links. eg http://moodle.com/ $text = preg_replace("%([[:space:]]|^|\(|\[)([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])%i", '$1$2://$3$4', $text); /// eg www.moodle.com $text = preg_replace("%([[:space:]]|^|\(|\[)www\.([^[:space:]]*)([[:alnum:]#?/&=])%i", '$1www.$2$3', $text); } function test_convert_urls_into_links() { $texts = array ( //just a url 'http://moodle.org - URL' => 'http://moodle.org - URL', 'www.moodle.org - URL' => 'www.moodle.org - URL', //url with params 'URL: http://moodle.org/s/i=1&j=2' => 'URL: http://moodle.org/s/i=1&j=2', //url with escaped params 'URL: www.moodle.org/s/i=1&j=2' => 'URL: www.moodle.org/s/i=1&j=2', //https url with params 'URL: https://moodle.org/s/i=1&j=2' => 'URL: https://moodle.org/s/i=1&j=2', //url with port and params 'URL: http://moodle.org:8080/s/i=1' => 'URL: http://moodle.org:8080/s/i=1', //url in brackets '(http://moodle.org) - URL' => '(http://moodle.org) - URL', '(www.moodle.org) - URL' => '(www.moodle.org) - URL', //url in square brackets '[http://moodle.org] - URL' => '[http://moodle.org] - URL', '[www.moodle.org] - URL' => '[www.moodle.org] - URL', //url in brackets with anchor '[http://moodle.org/main#anchor] - URL' => '[http://moodle.org/main#anchor] - URL', '[www.moodle.org/main#anchor] - URL' => '[www.moodle.org/main#anchor] - URL', //brackets within the url 'URL: http://cc.org/url_(withpar)_go/?i=2' => 'URL: http://cc.org/url_(withpar)_go/?i=2', 'URL: www.cc.org/url_(withpar)_go/?i=2' => 'URL: www.cc.org/url_(withpar)_go/?i=2', 'URL: http://cc.org/url_(with)_(par)_go/?i=2' => 'URL: http://cc.org/url_(with)_(par)_go/?i=2', 'URL: www.cc.org/url_(with)_(par)_go/?i=2' => 'URL: www.cc.org/url_(with)_(par)_go/?i=2', 'http://en.wikipedia.org/wiki/Slash_(punctuation)'=>'http://en.wikipedia.org/wiki/Slash_(punctuation)', 'http://en.wikipedia.org/wiki/%28#Parentheses_.28_.29 - URL' => 'http://en.wikipedia.org/wiki/%28#Parentheses_.28_.29 - URL', 'http://en.wikipedia.org/wiki/(#Parentheses_.28_.29 - URL' => 'http://en.wikipedia.org/wiki/(#Parentheses_.28_.29 - URL', //escaped brackets in url 'http://en.wikipedia.org/wiki/Slash_%28punctuation%29'=>'http://en.wikipedia.org/wiki/Slash_%28punctuation%29', //anchor tag 'URL: http://moodle.org' => 'URL: http://moodle.org', 'URL: www.moodle.org' => 'URL: www.moodle.org', 'URL: http://moodle.org' => 'URL: http://moodle.org', 'URL: www.moodle.org' => 'URL: www.moodle.org', //escaped anchor tag. Commented out as part of MDL-21183 //htmlspecialchars('escaped anchor tag www.moodle.org') => 'escaped anchor tag <a href="http://moodle.org"> www.moodle.org</a>', //trailing fullstop 'URL: http://moodle.org/s/i=1&j=2.' => 'URL: http://moodle.org/s/i=1&j=2.', 'URL: www.moodle.org/s/i=1&j=2.' => 'URL: www.moodle.org/s/i=1&j=2.', //trailing unmatched bracket 'URL: http://moodle.org)
' => 'URL: http://moodle.org)
', //partially escaped html 'URL:

text www.moodle.org</p> text' => 'URL:

text www.moodle.org</p> text', //decimal url parameter 'URL: www.moodle.org?u=1.23' => 'URL: www.moodle.org?u=1.23', //escaped space in url 'URL: www.moodle.org?u=test+param&' => 'URL: www.moodle.org?u=test+param&', //odd characters in url param 'URL: www.moodle.org?param=:)' => 'URL: www.moodle.org?param=:)', //multiple urls 'URL: http://moodle.org www.moodle.org' => 'URL: http://moodle.org www.moodle.org', //containing anchor tags including a class parameter and a url to convert 'URL: http://moodle.org www.moodle.org http://moodle.org' => 'URL: http://moodle.org www.moodle.org http://moodle.org', //subdomain 'http://subdomain.moodle.org - URL' => 'http://subdomain.moodle.org - URL', //multiple subdomains 'http://subdomain.subdomain.moodle.org - URL' => 'http://subdomain.subdomain.moodle.org - URL', //looks almost like a link but isnt 'This contains http, http:// and www but no actual links.'=>'This contains http, http:// and www but no actual links.', //no link at all 'This is a story about moodle.coming to a cinema near you.'=>'This is a story about moodle.coming to a cinema near you.', //URLs containing utf 8 characters 'http://Iñtërnâtiônàlizætiøn.com?ô=nëø'=>'http://Iñtërnâtiônàlizætiøn.com?ô=nëø', 'www.Iñtërnâtiônàlizætiøn.com?ô=nëø'=>'www.Iñtërnâtiônàlizætiøn.com?ô=nëø', //text containing utf 8 characters outside of a url 'Iñtërnâtiônàlizætiøn is important to http://moodle.org'=>'Iñtërnâtiônàlizætiøn is important to http://moodle.org', //too hard to identify without additional regexs 'moodle.org' => 'moodle.org', //some text with no link between related html tags 'no link here' => 'no link here', //some text with a link between related html tags 'a link here www.moodle.org' => 'a link here www.moodle.org', //some text containing a link within unrelated tags '
This is some text. www.moodle.com then some more text
' => '
This is some text. www.moodle.com then some more text
', //check we aren't modifying img tags 'image' => 'image', 'image' => 'image', //and another url within one tag ' ' => ' ', ' ' => ' ', '

'=>'', //partially escaped img tag 'partially escaped img tag <img src="http://moodle.org/logo/logo-240x60.gif" />' => 'partially escaped img tag <img src="http://moodle.org/logo/logo-240x60.gif" />', //fully escaped img tag. Commented out as part of MDL-21183 //htmlspecialchars('fully escaped img tag ') => 'fully escaped img tag <img src="http://moodle.org/logo/logo-240x60.gif" />', //Double http with www 'One more link like http://www.moodle.org to test' => 'One more link like http://www.moodle.org to test', //Encoded URLs in the path 'URL: http://127.0.0.1/one%28parenthesis%29/path?param=value' => 'URL: http://127.0.0.1/one%28parenthesis%29/path?param=value', 'URL: www.localhost.com/one%28parenthesis%29/path?param=value' => 'URL: www.localhost.com/one%28parenthesis%29/path?param=value', //Encoded URLs in the query 'URL: http://127.0.0.1/path/to?param=value_with%28parenthesis%29¶m2=1' => 'URL: http://127.0.0.1/path/to?param=value_with%28parenthesis%29¶m2=1', 'URL: www.localhost.com/path/to?param=value_with%28parenthesis%29¶m2=1' => 'URL: www.localhost.com/path/to?param=value_with%28parenthesis%29¶m2=1', //URLs in Javascript. Commented out as part of MDL-21183 //'var url="http://moodle.org";'=>'var url="http://moodle.org";', //'var url = "http://moodle.org";'=>'var url = "http://moodle.org";', //'var url="www.moodle.org";'=>'var url="www.moodle.org";', //'var url = "www.moodle.org";'=>'var url = "www.moodle.org";', //doctype. do we care about this failing? //''=>'' ); $testablefilter = new testable_filter_urltolink(); foreach ($texts as $text => $correctresult) { $msg = "Testing text: ". str_replace('%', '%%', $text) . ": %s"; // Escape original '%' so sprintf() wont get confused $testablefilter->convert_urls_into_links($text); $this->assertEqual($text, $correctresult, $msg); } //performance testing $reps = 1000; $text = file_get_contents(dirname(__FILE__) . '/sample.txt'); $time_start = microtime(true); for($i=0;$i<$reps;$i++) { $testablefilter->convert_urls_into_links($text); } $time_end = microtime(true); $new_time = $time_end - $time_start; $time_start = microtime(true); for($i=0;$i<$reps;$i++) { $this->old_convert_urls_into_links($text); } $time_end = microtime(true); $old_time = $time_end - $time_start; $fast_enough = false; if( $new_time < $old_time ) { $fast_enough = true; } $this->assertEqual($fast_enough, true, 'Timing test: ' . $new_time . 'secs (new) < ' . $old_time . 'secs (old)'); } }