Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

/**
 * Skype icons filter phpunit tests
 *
 * @package    filter_emoticon
 * @category   test
 * @copyright  2013 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

> namespace filter_emoticon; defined('MOODLE_INTERNAL') || die(); > > use filter_emoticon; global $CFG; >
require_once($CFG->dirroot . '/filter/emoticon/filter.php'); // Include the code to test. /** * Skype icons filter testcase. */
< class filter_emoticon_testcase extends advanced_testcase {
> class filter_test extends \advanced_testcase { > > /** > * Test that filter ignores nolink/pre element, and processes remaining text > * > * @param string $input > * @param string $expectedprefix > * > * @dataProvider filter_emoticon_filtered_provider > */ > public function test_filter_emoticon_filtered(string $input, string $expectedprefix): void { > $this->resetAfterTest(); > > $filteredtext = (new testable_filter_emoticon())->filter($input, [ > 'originalformat' => FORMAT_HTML, > ]); > > $this->assertStringStartsWith($expectedprefix, $filteredtext); > $this->assertStringEndsWith($this->get_converted_content_for_emoticon('(n)'), $filteredtext); > } > > /** > * Data provider for {@see test_filter_emoticon_filtered} > * > * @return string[] > */ > public function filter_emoticon_filtered_provider(): array { > return [ > 'FORMAT_HTML is filtered' => [ > 'input' => 'Hello(n)', > 'expectedprefix' => 'Hello', > ], > 'Nested nolink should not be processed, emoticon postfix should be' => [ > 'input' => '<span class="nolink"><span>(n)</span>(n)</span>(n)', > 'expectedprefix' => '<span class="nolink"><span>(n)</span>(n)</span>', > ], > 'Nested pre should not be processed, emoticon postfix should be' => [ > 'input' => '<pre><pre>(n)</pre>(n)</pre>(n)', > 'expectedprefix' => '<pre><pre>(n)</pre>(n)</pre>', > ], > ]; > }
/** * Tests the filter doesn't affect nolink classes. * * @dataProvider filter_emoticon_provider */ public function test_filter_emoticon($input, $format, $expected) { $this->resetAfterTest(); $filter = new testable_filter_emoticon(); $this->assertEquals($expected, $filter->filter($input, [ 'originalformat' => $format, ])); } /**
< * The data provider for filter emoticon tests.
> * The data provider for filter emoticon tests, containing input that is not expected to be filtered
* * @return array */ public function filter_emoticon_provider() { $grr = '(grr)'; return [ 'FORMAT_MOODLE is not filtered' => [ 'input' => $grr, 'format' => FORMAT_MOODLE, 'expected' => $grr, ], 'FORMAT_MARKDOWN is not filtered' => [ 'input' => $grr, 'format' => FORMAT_MARKDOWN, 'expected' => $grr, ], 'FORMAT_PLAIN is not filtered' => [ 'input' => $grr, 'format' => FORMAT_PLAIN, 'expected' => $grr, ],
< 'FORMAT_HTML is filtered' => [ < 'input' => $grr, < 'format' => FORMAT_HTML, < 'expected' => $this->get_converted_content_for_emoticon($grr), < ],
'Script tag should not be processed' => [ 'input' => "<script language='javascript'>alert('{$grr}');</script>", 'format' => FORMAT_HTML, 'expected' => "<script language='javascript'>alert('{$grr}');</script>", ], 'Basic nolink should not be processed' => [ 'input' => '<span class="nolink">(n)</span>', 'format' => FORMAT_HTML, 'expected' => '<span class="nolink">(n)</span>', ], 'Nested nolink should not be processed' => [ 'input' => '<span class="nolink"><span>(n)</span>(n)</span>', 'format' => FORMAT_HTML, 'expected' => '<span class="nolink"><span>(n)</span>(n)</span>', ],
< 'Nested nolink should not be processed but following emoticon' => [ < 'input' => '<span class="nolink"><span>(n)</span>(n)</span>(n)', < 'format' => FORMAT_HTML, < 'expected' => '<span class="nolink"><span>(n)</span>(n)</span>' . $this->get_converted_content_for_emoticon('(n)'), < ],
'Basic pre should not be processed' => [ 'input' => '<pre>(n)</pre>', 'format' => FORMAT_HTML, 'expected' => '<pre>(n)</pre>', ], 'Nested pre should not be processed' => [ 'input' => '<pre><pre>(n)</pre>(n)</pre>', 'format' => FORMAT_HTML, 'expected' => '<pre><pre>(n)</pre>(n)</pre>', ],
< 'Nested pre should not be processed but following emoticon' => [ < 'input' => '<pre><pre>(n)</pre>(n)</pre>(n)', < 'format' => FORMAT_HTML, < 'expected' => '<pre><pre>(n)</pre>(n)</pre>' . $this->get_converted_content_for_emoticon('(n)'), < ],
]; } /** * Translate the text for a single emoticon into the rendered value. * * @param string $text The text to translate. * @return string */ public function get_converted_content_for_emoticon($text) { global $OUTPUT; $manager = get_emoticon_manager(); $emoticons = $manager->get_emoticons(); foreach ($emoticons as $emoticon) { if ($emoticon->text == $text) { return $OUTPUT->render($manager->prepare_renderable_emoticon($emoticon)); } } return $text; } /** * Tests the filter doesn't break anything if activated but invalid format passed. * */ public function test_filter_invalidformat() { global $PAGE; $this->resetAfterTest(); $filter = new testable_filter_emoticon(); $input = '(grr)'; $expected = '(grr)'; $this->assertEquals($expected, $filter->filter($input, [ 'originalformat' => 'ILLEGALFORMAT', ])); } /** * Tests the filter doesn't break anything if activated but no emoticons available. * */ public function test_filter_emptyemoticons() { global $CFG; $this->resetAfterTest(); // Empty the emoticons array. $CFG->emoticons = null;
< $filter = new filter_emoticon(context_system::instance(), array('originalformat' => FORMAT_HTML));
> $filter = new filter_emoticon(\context_system::instance(), array('originalformat' => FORMAT_HTML));
$input = '(grr)'; $expected = '(grr)'; $this->assertEquals($expected, $filter->filter($input, [ 'originalformat' => FORMAT_HTML, ])); } } /** * Subclass for easier testing. */ class testable_filter_emoticon extends filter_emoticon { public function __construct() { // Reset static emoticon caches. parent::$emoticontexts = array(); parent::$emoticonimgs = array(); // Use this context for filtering.
< $this->context = context_system::instance();
> $this->context = \context_system::instance();
// Define FORMAT_HTML as only one filtering in DB. set_config('formats', implode(',', array(FORMAT_HTML)), 'filter_emoticon'); } }