MDL-31857 phpunit: PHPDoc and typo fixes during integration
[moodle.git] / lib / tests / htmlpurifier_test.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Unit tests for the HTMLPurifier integration
19  *
20  * @package    core
21  * @category   phpunit
22  * @copyright  2012 Petr Skoda {@link http://skodak.org}
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 defined('MOODLE_INTERNAL') || die();
29 /**
30  * HTMLPurifier test case
31  *
32  * @package    core
33  * @category   phpunit
34  * @copyright  2012 Petr Skoda {@link http://skodak.org}
35  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36  */
37 class core_htmlpurifier_testcase extends basic_testcase {
39     /**
40      * Verify _blank target is allowed
41      * @return void
42      */
43     public function test_allow_blank_target() {
44         $text = '<a href="http://moodle.org" target="_blank">Some link</a>';
45         $result = format_text($text, FORMAT_HTML);
46         $this->assertSame($text, $result);
48         $result = format_text('<a href="http://moodle.org" target="some">Some link</a>', FORMAT_HTML);
49         $this->assertSame('<a href="http://moodle.org">Some link</a>', $result);
50     }
52     /**
53      * Verify our nolink tag accepted
54      * @return void
55      */
56     public function test_nolink() {
57         // we can not use format text because nolink changes result
58         $text = '<nolink><div>no filters</div></nolink>';
59         $result = purify_html($text, array());
60         $this->assertSame($text, $result);
62         $text = '<nolink>xxx<em>xx</em><div>xxx</div></nolink>';
63         $result = purify_html($text, array());
64         $this->assertSame($text, $result);
65     }
67     /**
68      * Verify our tex tag accepted
69      * @return void
70      */
71     public function test_tex() {
72         $text = '<tex>a+b=c</tex>';
73         $result = purify_html($text, array());
74         $this->assertSame($text, $result);
75     }
77     /**
78      * Verify our algebra tag accepted
79      * @return void
80      */
81     public function test_algebra() {
82         $text = '<algebra>a+b=c</algebra>';
83         $result = purify_html($text, array());
84         $this->assertSame($text, $result);
85     }
87     /**
88      * Verify our hacky multilang works
89      * @return void
90      */
91     public function test_multilang() {
92         $text = '<lang lang="en">hmmm</lang><lang lang="anything">hm</lang>';
93         $result = purify_html($text, array());
94         $this->assertSame($text, $result);
96         $text = '<span lang="en" class="multilang">hmmm</span><span lang="anything" class="multilang">hm</span>';
97         $result = purify_html($text, array());
98         $this->assertSame($text, $result);
100         $text = '<span lang="en">hmmm</span>';
101         $result = purify_html($text, array());
102         $this->assertNotSame($text, $result);
104         // keep standard lang tags
106         $text = '<span lang="de_DU" class="multilang">asas</span>';
107         $result = purify_html($text, array());
108         $this->assertSame($text, $result);
110         $text = '<lang lang="de_DU">xxxxxx</lang>';
111         $result = purify_html($text, array());
112         $this->assertSame($text, $result);
113     }
115     /**
116      * Tests the 'allowid' option for format_text.
117      * @return void
118      */
119     public function test_format_text_allowid() {
120         // Start off by not allowing ids (default)
121         $options = array(
122             'nocache' => true
123         );
124         $result = format_text('<div id="example">Frog</div>', FORMAT_HTML, $options);
125         $this->assertSame('<div>Frog</div>', $result);
127         // Now allow ids
128         $options['allowid'] = true;
129         $result = format_text('<div id="example">Frog</div>', FORMAT_HTML, $options);
130         $this->assertSame('<div id="example">Frog</div>', $result);
131     }
133     /**
134      * Test if linebreaks kept unchanged.
135      * @return void
136      */
137     public function test_line_breaking() {
138         $text = "\n\raa\rsss\nsss\r";
139         $this->assertSame($text, purify_html($text));
140     }
142     /**
143      * Test fixing of strict problems.
144      * @return void
145      */
146     public function test_tidy() {
147         $text = "<p>xx";
148         $this->assertSame('<p>xx</p>', purify_html($text));
150         $text = "<P>xx</P>";
151         $this->assertSame('<p>xx</p>', purify_html($text));
153         $text = "xx<br>";
154         $this->assertSame('xx<br />', purify_html($text));
155     }
157     /**
158      * Test nesting - this used to cause problems in earlier versions
159      * @return void
160      */
161     public function test_nested_lists() {
162         $text = "<ul><li>One<ul><li>Two</li></ul></li><li>Three</li></ul>";
163         $this->assertSame($text, purify_html($text));
164     }
166     /**
167      * Test that XSS protection works, complete smoke tests are in htmlpurifier itself.
168      * @return void
169      */
170     public function test_cleaning_nastiness() {
171         $text = "x<SCRIPT>alert('XSS')</SCRIPT>x";
172         $this->assertSame('xx', purify_html($text));
174         $text = '<DIV STYLE="background-image:url(javascript:alert(\'XSS\'))">xx</DIV>';
175         $this->assertSame('<div>xx</div>', purify_html($text));
177         $text = '<DIV STYLE="width:expression(alert(\'XSS\'));">xx</DIV>';
178         $this->assertSame('<div>xx</div>', purify_html($text));
180         $text = 'x<IFRAME SRC="javascript:alert(\'XSS\');"></IFRAME>x';
181         $this->assertSame('xx', purify_html($text));
183         $text = 'x<OBJECT TYPE="text/x-scriptlet" DATA="http://ha.ckers.org/scriptlet.html"></OBJECT>x';
184         $this->assertSame('xx', purify_html($text));
186         $text = 'x<EMBED SRC="http://ha.ckers.org/xss.swf" AllowScriptAccess="always"></EMBED>x';
187         $this->assertSame('xx', purify_html($text));
189         $text = 'x<form></form>x';
190         $this->assertSame('xx', purify_html($text));
191     }