From 4d992e8cae472e26495de65feacaff03d4a52523 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Fri, 9 Feb 2024 12:17:08 +0800 Subject: [PATCH 1/2] MDL-80871 tool_usertours: Coding style fixes --- admin/tool/usertours/classes/cache.php | 15 +- .../tool/usertours/classes/configuration.php | 27 +- .../usertours/classes/event/step_shown.php | 11 - .../usertours/classes/event/tour_ended.php | 11 - .../usertours/classes/event/tour_reset.php | 11 - .../usertours/classes/event/tour_started.php | 11 - .../tool/usertours/classes/external/tour.php | 165 +++-- admin/tool/usertours/classes/helper.php | 168 ++--- .../clientside_filter/clientside_filter.php | 15 +- .../local/clientside_filter/cssselector.php | 10 +- .../classes/local/filter/accessdate.php | 30 +- .../usertours/classes/local/filter/base.php | 11 +- .../classes/local/filter/category.php | 11 +- .../usertours/classes/local/filter/course.php | 11 +- .../classes/local/filter/courseformat.php | 11 +- .../usertours/classes/local/filter/role.php | 13 +- .../usertours/classes/local/filter/theme.php | 11 +- .../classes/local/forms/editstep.php | 4 +- .../classes/local/forms/edittour.php | 2 +- .../classes/local/table/step_list.php | 34 +- .../classes/local/table/tour_list.php | 31 +- .../usertours/classes/local/target/base.php | 11 +- .../usertours/classes/local/target/block.php | 24 +- .../classes/local/target/selector.php | 24 +- .../classes/local/target/unattached.php | 15 +- admin/tool/usertours/classes/manager.php | 25 +- .../usertours/classes/output/renderer.php | 13 +- admin/tool/usertours/classes/output/step.php | 31 +- admin/tool/usertours/classes/output/tour.php | 18 +- .../usertours/classes/privacy/provider.php | 21 +- admin/tool/usertours/classes/step.php | 42 +- admin/tool/usertours/classes/target.php | 14 +- admin/tool/usertours/classes/tour.php | 32 +- admin/tool/usertours/configure.php | 4 +- admin/tool/usertours/db/access.php | 6 +- admin/tool/usertours/db/caches.php | 12 +- admin/tool/usertours/db/services.php | 20 +- .../tests/accessdate_filter_test.php | 27 +- .../tests/behat/behat_tool_usertours.php | 8 +- admin/tool/usertours/tests/cache_test.php | 42 +- admin/tool/usertours/tests/helper_test.php | 16 +- admin/tool/usertours/tests/helper_trait.php | 12 +- admin/tool/usertours/tests/manager_test.php | 234 +++--- .../usertours/tests/privacy/provider_test.php | 30 +- .../tool/usertours/tests/role_filter_test.php | 18 +- admin/tool/usertours/tests/step_test.php | 554 +++++++------- .../usertours/tests/theme_filter_test.php | 6 +- admin/tool/usertours/tests/tour_test.php | 699 ++++++++---------- 48 files changed, 1122 insertions(+), 1449 deletions(-) diff --git a/admin/tool/usertours/classes/cache.php b/admin/tool/usertours/classes/cache.php index 28f5eb34e10..a053fc5fd11 100644 --- a/admin/tool/usertours/classes/cache.php +++ b/admin/tool/usertours/classes/cache.php @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . +namespace tool_usertours; + /** * Cache manager. * @@ -21,17 +23,6 @@ * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ - -namespace tool_usertours; - -defined('MOODLE_INTERNAL') || die(); - -/** - * Cache manager. - * - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ class cache { /** * @var CACHENAME_TOUR The name of the cache used for storing tours. @@ -97,7 +88,7 @@ EOF; } $target = $targetmatch->out_as_local_url(); - return array_filter($tours, function($tour) use ($possiblematches, $target) { + return array_filter($tours, function ($tour) use ($possiblematches, $target) { if (in_array($tour->pathmatch, $possiblematches)) { return true; } diff --git a/admin/tool/usertours/classes/configuration.php b/admin/tool/usertours/classes/configuration.php index ae63554eb30..2f18c29be7b 100644 --- a/admin/tool/usertours/classes/configuration.php +++ b/admin/tool/usertours/classes/configuration.php @@ -14,26 +14,16 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Step configuration detail class. - * - * @package tool_usertours - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours; -defined('MOODLE_INTERNAL') || die(); - /** * Step configuration detail class. * - * @copyright 2016 Andrew Nicols + * @package tool_usertours + * @copyright 2024 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class configuration { - /** * @var TOURDEFAULT */ @@ -60,7 +50,7 @@ class configuration { * @return mixed */ public static function get_default_value($key) { - switch($key) { + switch ($key) { case 'placement': return 'bottom'; case 'orphan': @@ -77,7 +67,7 @@ class configuration { * @return mixed */ public static function get_step_default_value($key) { - switch($key) { + switch ($key) { case 'placement': case 'orphan': case 'backdrop': @@ -94,10 +84,10 @@ class configuration { */ public static function get_placement_options($default = null) { $values = [ - 'top' => get_string('above', 'tool_usertours'), - 'bottom' => get_string('below', 'tool_usertours'), - 'left' => get_string('left', 'tool_usertours'), - 'right' => get_string('right', 'tool_usertours'), + 'top' => get_string('above', 'tool_usertours'), + 'bottom' => get_string('below', 'tool_usertours'), + 'left' => get_string('left', 'tool_usertours'), + 'right' => get_string('right', 'tool_usertours'), ]; if ($default === null) { @@ -114,5 +104,4 @@ class configuration { return $values; } - } diff --git a/admin/tool/usertours/classes/event/step_shown.php b/admin/tool/usertours/classes/event/step_shown.php index 3537b61f7b7..72ff3b4a6d5 100644 --- a/admin/tool/usertours/classes/event/step_shown.php +++ b/admin/tool/usertours/classes/event/step_shown.php @@ -14,18 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * The tool_usertours step_shown event. - * - * @package tool_usertours - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\event; -defined('MOODLE_INTERNAL') || die(); - /** * The tool_usertours step_shown event. * @@ -41,7 +31,6 @@ defined('MOODLE_INTERNAL') || die(); * } */ class step_shown extends \core\event\base { - /** * Init method. */ diff --git a/admin/tool/usertours/classes/event/tour_ended.php b/admin/tool/usertours/classes/event/tour_ended.php index 945d1e4eeb9..6853dd4a860 100644 --- a/admin/tool/usertours/classes/event/tour_ended.php +++ b/admin/tool/usertours/classes/event/tour_ended.php @@ -14,18 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * The tool_usertours tour_ended event. - * - * @package tool_usertours - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\event; -defined('MOODLE_INTERNAL') || die(); - /** * The tool_usertours tour_ended event. * @@ -41,7 +31,6 @@ defined('MOODLE_INTERNAL') || die(); * } */ class tour_ended extends \core\event\base { - /** * Init method. */ diff --git a/admin/tool/usertours/classes/event/tour_reset.php b/admin/tool/usertours/classes/event/tour_reset.php index bd9e60d02c2..660f35f5db1 100644 --- a/admin/tool/usertours/classes/event/tour_reset.php +++ b/admin/tool/usertours/classes/event/tour_reset.php @@ -14,18 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * The tool_usertours tour_reset event. - * - * @package tool_usertours - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\event; -defined('MOODLE_INTERNAL') || die(); - /** * The tool_usertours tour_reset event. * @@ -41,7 +31,6 @@ defined('MOODLE_INTERNAL') || die(); * } */ class tour_reset extends \core\event\base { - /** * Init method. */ diff --git a/admin/tool/usertours/classes/event/tour_started.php b/admin/tool/usertours/classes/event/tour_started.php index 915cb586de3..d44114f051c 100644 --- a/admin/tool/usertours/classes/event/tour_started.php +++ b/admin/tool/usertours/classes/event/tour_started.php @@ -14,18 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * The tool_usertours tour_started event. - * - * @package tool_usertours - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\event; -defined('MOODLE_INTERNAL') || die(); - /** * The tool_usertours tour_started event. * @@ -41,7 +31,6 @@ defined('MOODLE_INTERNAL') || die(); * } */ class tour_started extends \core\event\base { - /** * Init method. */ diff --git a/admin/tool/usertours/classes/external/tour.php b/admin/tool/usertours/classes/external/tour.php index 649becb5de8..0430b1febe4 100644 --- a/admin/tool/usertours/classes/external/tour.php +++ b/admin/tool/usertours/classes/external/tour.php @@ -43,10 +43,10 @@ class tour extends external_api { global $PAGE; $params = self::validate_parameters(self::fetch_and_start_tour_parameters(), [ - 'tourid' => $tourid, - 'context' => $context, - 'pageurl' => $pageurl, - ]); + 'tourid' => $tourid, + 'context' => $context, + 'pageurl' => $pageurl, + ]); $context = \context_helper::instance_by_id($params['context']); self::validate_context($context); @@ -60,8 +60,8 @@ class tour extends external_api { \tool_usertours\event\tour_started::create([ 'contextid' => $context->id, - 'objectid' => $tour->get_id(), - 'other' => [ + 'objectid' => $tour->get_id(), + 'other' => [ 'pageurl' => $params['pageurl'], ], ])->trigger(); @@ -78,9 +78,9 @@ class tour extends external_api { */ public static function fetch_and_start_tour_parameters() { return new external_function_parameters([ - 'tourid' => new external_value(PARAM_INT, 'Tour ID'), - 'context' => new external_value(PARAM_INT, 'Context ID'), - 'pageurl' => new external_value(PARAM_URL, 'Page URL'), + 'tourid' => new external_value(PARAM_INT, 'Tour ID'), + 'context' => new external_value(PARAM_INT, 'Context ID'), + 'pageurl' => new external_value(PARAM_URL, 'Page URL'), ]); } @@ -91,12 +91,12 @@ class tour extends external_api { */ public static function fetch_and_start_tour_returns() { return new external_single_structure([ - 'tourconfig' => new external_single_structure([ - 'name' => new external_value(PARAM_RAW, 'Tour Name'), - 'steps' => new external_multiple_structure(self::step_structure_returns()), - 'endtourlabel' => new external_value(PARAM_RAW, 'Label of the end tour button'), + 'tourconfig' => new external_single_structure([ + 'name' => new external_value(PARAM_RAW, 'Tour Name'), + 'steps' => new external_multiple_structure(self::step_structure_returns()), + 'endtourlabel' => new external_value(PARAM_RAW, 'Label of the end tour button'), 'displaystepnumbers' => new external_value(PARAM_BOOL, 'display step number'), - ], 'Tour config', VALUE_OPTIONAL) + ], 'Tour config', VALUE_OPTIONAL), ]); } @@ -110,10 +110,10 @@ class tour extends external_api { */ public static function reset_tour($tourid, $context, $pageurl) { $params = self::validate_parameters(self::reset_tour_parameters(), [ - 'tourid' => $tourid, - 'context' => $context, - 'pageurl' => $pageurl, - ]); + 'tourid' => $tourid, + 'context' => $context, + 'pageurl' => $pageurl, + ]); $context = \context_helper::instance_by_id($params['context']); self::validate_context($context); @@ -130,9 +130,9 @@ class tour extends external_api { \tool_usertours\event\tour_reset::create([ 'contextid' => $context->id, - 'objectid' => $params['tourid'], - 'other' => [ - 'pageurl' => $params['pageurl'], + 'objectid' => $params['tourid'], + 'other' => [ + 'pageurl' => $params['pageurl'], ], ])->trigger(); break; @@ -149,9 +149,9 @@ class tour extends external_api { */ public static function reset_tour_parameters() { return new external_function_parameters([ - 'tourid' => new external_value(PARAM_INT, 'Tour ID'), - 'context' => new external_value(PARAM_INT, 'Context ID'), - 'pageurl' => new external_value(PARAM_URL, 'Current page location'), + 'tourid' => new external_value(PARAM_INT, 'Tour ID'), + 'context' => new external_value(PARAM_INT, 'Context ID'), + 'pageurl' => new external_value(PARAM_URL, 'Current page location'), ]); } @@ -162,7 +162,7 @@ class tour extends external_api { */ public static function reset_tour_returns() { return new external_single_structure([ - 'startTour' => new external_value(PARAM_INT, 'Tour ID', VALUE_OPTIONAL), + 'startTour' => new external_value(PARAM_INT, 'Tour ID', VALUE_OPTIONAL), ]); } @@ -178,12 +178,12 @@ class tour extends external_api { */ public static function complete_tour($tourid, $context, $pageurl, $stepid, $stepindex) { $params = self::validate_parameters(self::complete_tour_parameters(), [ - 'tourid' => $tourid, - 'context' => $context, - 'pageurl' => $pageurl, - 'stepid' => $stepid, - 'stepindex' => $stepindex, - ]); + 'tourid' => $tourid, + 'context' => $context, + 'pageurl' => $pageurl, + 'stepid' => $stepid, + 'stepindex' => $stepindex, + ]); $context = \context_helper::instance_by_id($params['context']); self::validate_context($context); @@ -193,10 +193,10 @@ class tour extends external_api { \tool_usertours\event\tour_ended::create([ 'contextid' => $context->id, - 'objectid' => $params['tourid'], - 'other' => [ - 'pageurl' => $params['pageurl'], - 'stepid' => $params['stepid'], + 'objectid' => $params['tourid'], + 'other' => [ + 'pageurl' => $params['pageurl'], + 'stepid' => $params['stepid'], 'stepindex' => $params['stepindex'], ], ])->trigger(); @@ -211,10 +211,10 @@ class tour extends external_api { */ public static function complete_tour_parameters() { return new external_function_parameters([ - 'tourid' => new external_value(PARAM_INT, 'Tour ID'), - 'context' => new external_value(PARAM_INT, 'Context ID'), - 'pageurl' => new external_value(PARAM_LOCALURL, 'Page URL'), - 'stepid' => new external_value(PARAM_INT, 'Step ID'), + 'tourid' => new external_value(PARAM_INT, 'Tour ID'), + 'context' => new external_value(PARAM_INT, 'Context ID'), + 'pageurl' => new external_value(PARAM_LOCALURL, 'Page URL'), + 'stepid' => new external_value(PARAM_INT, 'Step ID'), 'stepindex' => new external_value(PARAM_INT, 'Step Number'), ]); } @@ -240,12 +240,12 @@ class tour extends external_api { */ public static function step_shown($tourid, $context, $pageurl, $stepid, $stepindex) { $params = self::validate_parameters(self::step_shown_parameters(), [ - 'tourid' => $tourid, - 'context' => $context, - 'pageurl' => $pageurl, - 'stepid' => $stepid, - 'stepindex' => $stepindex, - ]); + 'tourid' => $tourid, + 'context' => $context, + 'pageurl' => $pageurl, + 'stepid' => $stepid, + 'stepindex' => $stepindex, + ]); $context = \context_helper::instance_by_id($params['context']); self::validate_context($context); @@ -257,11 +257,11 @@ class tour extends external_api { \tool_usertours\event\step_shown::create([ 'contextid' => $context->id, - 'objectid' => $params['stepid'], + 'objectid' => $params['stepid'], - 'other' => [ - 'pageurl' => $params['pageurl'], - 'tourid' => $params['tourid'], + 'other' => [ + 'pageurl' => $params['pageurl'], + 'tourid' => $params['tourid'], 'stepindex' => $params['stepindex'], ], ])->trigger(); @@ -276,10 +276,10 @@ class tour extends external_api { */ public static function step_shown_parameters() { return new external_function_parameters([ - 'tourid' => new external_value(PARAM_INT, 'Tour ID'), - 'context' => new external_value(PARAM_INT, 'Context ID'), - 'pageurl' => new external_value(PARAM_URL, 'Page URL'), - 'stepid' => new external_value(PARAM_INT, 'Step ID'), + 'tourid' => new external_value(PARAM_INT, 'Tour ID'), + 'context' => new external_value(PARAM_INT, 'Context ID'), + 'pageurl' => new external_value(PARAM_URL, 'Page URL'), + 'stepid' => new external_value(PARAM_INT, 'Step ID'), 'stepindex' => new external_value(PARAM_INT, 'Step Number'), ]); } @@ -300,24 +300,47 @@ class tour extends external_api { */ public static function step_structure_returns() { return new external_single_structure([ - 'title' => new external_value(PARAM_RAW, - 'Step Title'), - 'content' => new external_value(PARAM_RAW, - 'Step Content'), - 'element' => new external_value(PARAM_TEXT, - 'Step Target'), - 'placement' => new external_value(PARAM_TEXT, - 'Step Placement'), - 'delay' => new external_value(PARAM_INT, - 'Delay before showing the step (ms)', VALUE_OPTIONAL), - 'backdrop' => new external_value(PARAM_BOOL, - 'Whether a backdrop should be used', VALUE_OPTIONAL), - 'reflex' => new external_value(PARAM_BOOL, - 'Whether to move to the next step when the target element is clicked', VALUE_OPTIONAL), - 'orphan' => new external_value(PARAM_BOOL, - 'Whether to display the step even if it could not be found', VALUE_OPTIONAL), - 'stepid' => new external_value(PARAM_INT, - 'The actual ID of the step', VALUE_OPTIONAL), + 'title' => new external_value( + PARAM_RAW, + 'Step Title' + ), + 'content' => new external_value( + PARAM_RAW, + 'Step Content' + ), + 'element' => new external_value( + PARAM_TEXT, + 'Step Target' + ), + 'placement' => new external_value( + PARAM_TEXT, + 'Step Placement' + ), + 'delay' => new external_value( + PARAM_INT, + 'Delay before showing the step (ms)', + VALUE_OPTIONAL + ), + 'backdrop' => new external_value( + PARAM_BOOL, + 'Whether a backdrop should be used', + VALUE_OPTIONAL + ), + 'reflex' => new external_value( + PARAM_BOOL, + 'Whether to move to the next step when the target element is clicked', + VALUE_OPTIONAL + ), + 'orphan' => new external_value( + PARAM_BOOL, + 'Whether to display the step even if it could not be found', + VALUE_OPTIONAL + ), + 'stepid' => new external_value( + PARAM_INT, + 'The actual ID of the step', + VALUE_OPTIONAL + ), ]); } } diff --git a/admin/tool/usertours/classes/helper.php b/admin/tool/usertours/classes/helper.php index 6c2befa697a..f782127cc89 100644 --- a/admin/tool/usertours/classes/helper.php +++ b/admin/tool/usertours/classes/helper.php @@ -14,6 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . +namespace tool_usertours; + +use core\output\inplace_editable; + /** * Tour helper. * @@ -21,22 +25,7 @@ * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ - -namespace tool_usertours; - -use core\output\inplace_editable; -use tool_usertours\local\clientside_filter\clientside_filter; - -defined('MOODLE_INTERNAL') || die(); - -/** - * Tour helper. - * - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ class helper { - /** * @var MOVE_UP */ @@ -158,10 +147,10 @@ class helper { */ public static function get_reset_tour_for_all_link($tourid) { return new \moodle_url('/admin/tool/usertours/configure.php', [ - 'id' => $tourid, - 'action' => manager::ACTION_RESETFORALL, - 'sesskey' => sesskey(), - ]); + 'id' => $tourid, + 'action' => manager::ACTION_RESETFORALL, + 'sesskey' => sesskey(), + ]); } /** @@ -204,9 +193,9 @@ class helper { */ public static function get_export_tour_link($tourid) { $link = new \moodle_url('/admin/tool/usertours/configure.php', [ - 'action' => manager::ACTION_EXPORTTOUR, - 'id' => $tourid, - ]); + 'action' => manager::ACTION_EXPORTTOUR, + 'id' => $tourid, + ]); return $link; } @@ -219,8 +208,8 @@ class helper { */ public static function get_duplicate_tour_link($tourid) { $link = new \moodle_url('/admin/tool/usertours/configure.php', [ - 'action' => manager::ACTION_DUPLICATETOUR, - 'id' => $tourid, + 'action' => manager::ACTION_DUPLICATETOUR, + 'id' => $tourid, ]); return $link; @@ -234,10 +223,10 @@ class helper { */ public static function get_delete_tour_link($tourid) { return new \moodle_url('/admin/tool/usertours/configure.php', [ - 'id' => $tourid, - 'action' => manager::ACTION_DELETETOUR, - 'sesskey' => sesskey(), - ]); + 'id' => $tourid, + 'action' => manager::ACTION_DELETETOUR, + 'sesskey' => sesskey(), + ]); } /** @@ -262,18 +251,17 @@ class helper { * @param array $options Display options. * @return string */ - public static function format_icon_link($url, $icon, $alt, $iconcomponent = 'moodle', $options = array()) { + public static function format_icon_link($url, $icon, $alt, $iconcomponent = 'moodle', $options = []) { global $OUTPUT; return $OUTPUT->action_icon( - $url, - new \pix_icon($icon, $alt, $iconcomponent, [ - 'title' => $alt, - ]), - null, - $options - ); - + $url, + new \pix_icon($icon, $alt, $iconcomponent, [ + 'title' => $alt, + ]), + null, + $options + ); } /** @@ -282,7 +270,7 @@ class helper { * @param array $options Display options. * @return string */ - public static function get_filler_icon($options = array()) { + public static function get_filler_icon($options = []) { global $OUTPUT; return \html_writer::span( @@ -299,10 +287,10 @@ class helper { */ public static function get_delete_step_link($stepid) { return new \moodle_url('/admin/tool/usertours/configure.php', [ - 'action' => manager::ACTION_DELETESTEP, - 'id' => $stepid, - 'sesskey' => sesskey(), - ]); + 'action' => manager::ACTION_DELETESTEP, + 'id' => $stepid, + 'sesskey' => sesskey(), + ]); } /** @@ -314,16 +302,16 @@ class helper { public static function render_tourname_inplace_editable(tour $tour): inplace_editable { $name = format_text(static::get_string_from_input($tour->get_name()), FORMAT_HTML); return new inplace_editable( - 'tool_usertours', - 'tourname', - $tour->get_id(), - true, - \html_writer::link( - $tour->get_view_link(), - $name - ), - $tour->get_name() - ); + 'tool_usertours', + 'tourname', + $tour->get_id(), + true, + \html_writer::link( + $tour->get_view_link(), + $name + ), + $tour->get_name() + ); } /** @@ -335,13 +323,13 @@ class helper { public static function render_tourdescription_inplace_editable(tour $tour): inplace_editable { $description = format_text(static::get_string_from_input($tour->get_description()), FORMAT_HTML); return new inplace_editable( - 'tool_usertours', - 'tourdescription', - $tour->get_id(), - true, - $description, - $tour->get_description() - ); + 'tool_usertours', + 'tourdescription', + $tour->get_id(), + true, + $description, + $tour->get_description() + ); } /** @@ -364,15 +352,15 @@ class helper { } $editable = new inplace_editable( - 'tool_usertours', - 'tourenabled', - $tour->get_id(), - true, - $OUTPUT->pix_icon($icon, $alt, 'moodle', [ - 'title' => $alt, - ]), - $value - ); + 'tool_usertours', + 'tourenabled', + $tour->get_id(), + true, + $OUTPUT->pix_icon($icon, $alt, 'moodle', [ + 'title' => $alt, + ]), + $value + ); $editable->set_type_toggle(); return $editable; @@ -388,16 +376,16 @@ class helper { $title = format_text(static::get_string_from_input($step->get_title()), FORMAT_HTML); return new inplace_editable( - 'tool_usertours', - 'stepname', - $step->get_id(), - true, - \html_writer::link( - $step->get_edit_link(), - $title - ), - $step->get_title() - ); + 'tool_usertours', + 'stepname', + $step->get_id(), + true, + \html_writer::link( + $step->get_edit_link(), + $title + ), + $step->get_title() + ); } /** @@ -408,7 +396,7 @@ class helper { public static function get_tours() { global $DB; - $tours = $DB->get_records('tool_usertours_tours', array(), 'sortorder ASC'); + $tours = $DB->get_records('tool_usertours_tours', [], 'sortorder ASC'); $return = []; foreach ($tours as $tour) { $return[$tour->id] = tour::load_from_record($tour); @@ -435,7 +423,7 @@ class helper { public static function get_tour_from_sortorder($sortorder) { global $DB; - $tour = $DB->get_record('tool_usertours_tours', array('sortorder' => $sortorder)); + $tour = $DB->get_record('tool_usertours_tours', ['sortorder' => $sortorder]); return tour::load_from_record($tour); } @@ -460,7 +448,7 @@ class helper { $index = 0; foreach ($tours as $tour) { if ($tour->sortorder != $index) { - $DB->set_field('tool_usertours_tours', 'sortorder', $index, array('id' => $tour->id)); + $DB->set_field('tool_usertours_tours', 'sortorder', $index, ['id' => $tour->id]); } $index++; } @@ -508,7 +496,7 @@ class helper { public static function get_step_from_sortorder($tourid, $sortorder) { global $DB; - $step = $DB->get_record('tool_usertours_steps', array('tourid' => $tourid, 'sortorder' => $sortorder)); + $step = $DB->get_record('tool_usertours_steps', ['tourid' => $tourid, 'sortorder' => $sortorder]); return step::load_from_record($step); } @@ -538,11 +526,11 @@ class helper { if ($tours) { $filters = static::get_all_clientside_filters(); - $tourdetails = array_map(function($tour) use ($filters) { + $tourdetails = array_map(function ($tour) use ($filters) { return [ - 'tourId' => $tour->get_id(), - 'startTour' => $tour->should_show_for_user(), - 'filtervalues' => $tour->get_client_filter_values($filters), + 'tourId' => $tour->get_id(), + 'startTour' => $tour->should_show_for_user(), + 'filtervalues' => $tour->get_client_filter_values($filters), ]; }, $tours); @@ -552,8 +540,8 @@ class helper { } $PAGE->requires->js_call_amd('tool_usertours/usertours', 'init', [ - $tourdetails, - $filternames, + $tourdetails, + $filternames, ]); } } @@ -567,7 +555,7 @@ class helper { $filters = \core_component::get_component_classes_in_namespace('tool_usertours', 'local\filter'); $filters = array_keys($filters); - $filters = array_filter($filters, function($filterclass) { + $filters = array_filter($filters, function ($filterclass) { $rc = new \ReflectionClass($filterclass); return $rc->isInstantiable(); }); @@ -586,7 +574,7 @@ class helper { $filters = \core_component::get_component_classes_in_namespace('tool_usertours', 'local\clientside_filter'); $filters = array_keys($filters); - $filters = array_filter($filters, function($filterclass) { + $filters = array_filter($filters, function ($filterclass) { $rc = new \ReflectionClass($filterclass); return $rc->isInstantiable(); }); diff --git a/admin/tool/usertours/classes/local/clientside_filter/clientside_filter.php b/admin/tool/usertours/classes/local/clientside_filter/clientside_filter.php index 6fa403ac57a..ed394f29be6 100644 --- a/admin/tool/usertours/classes/local/clientside_filter/clientside_filter.php +++ b/admin/tool/usertours/classes/local/clientside_filter/clientside_filter.php @@ -14,18 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Clientside filter base. - * - * @package tool_usertours - * @copyright 2020 The Open University - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\local\clientside_filter; -defined('MOODLE_INTERNAL') || die(); - use stdClass; use tool_usertours\local\filter\base; use tool_usertours\tour; @@ -33,6 +23,7 @@ use tool_usertours\tour; /** * Clientside filter base. * + * @package tool_usertours * @copyright 2020 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ @@ -46,10 +37,10 @@ abstract class clientside_filter extends base { public static function get_client_side_values(tour $tour): stdClass { $data = (object) []; - if (is_a(static::class, clientside_filter::class, true)) { + if (is_a(static::class, self::class, true)) { $data->filterdata = $tour->get_filter_values(static::get_filter_name()); } return $data; } -} \ No newline at end of file +} diff --git a/admin/tool/usertours/classes/local/clientside_filter/cssselector.php b/admin/tool/usertours/classes/local/clientside_filter/cssselector.php index e6d6c2d778e..ef30c589592 100644 --- a/admin/tool/usertours/classes/local/clientside_filter/cssselector.php +++ b/admin/tool/usertours/classes/local/clientside_filter/cssselector.php @@ -14,13 +14,6 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Selector filter. - * - * @package tool_usertours - * @copyright 2020 The Open University - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ namespace tool_usertours\local\clientside_filter; use stdClass; @@ -29,6 +22,7 @@ use tool_usertours\tour; /** * Course filter. * + * @package tool_usertours * @copyright 2020 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ @@ -107,7 +101,7 @@ class cssselector extends clientside_filter { // Filter values might not exist for tours that were created before this filter existed. if (!$filtervalues) { - return new stdClass; + return new stdClass(); } return (object) $filtervalues; diff --git a/admin/tool/usertours/classes/local/filter/accessdate.php b/admin/tool/usertours/classes/local/filter/accessdate.php index 26fecd4b8c7..7ca30008d65 100644 --- a/admin/tool/usertours/classes/local/filter/accessdate.php +++ b/admin/tool/usertours/classes/local/filter/accessdate.php @@ -13,29 +13,19 @@ // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . - -/** - * Access Date filter. - * - * @package tool_usertours - * @copyright 2019 Tom Dickman - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ namespace tool_usertours\local\filter; -defined('MOODLE_INTERNAL') || die(); - use context; use tool_usertours\tour; /** * Access date filter. Used to determine if USER should see a tour based on a particular access date. * + * @package tool_usertours * @copyright 2019 Tom Dickman * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class accessdate extends base { - /** * Access date filtering constant for setting base date as account creation date. */ @@ -74,12 +64,11 @@ class accessdate extends base { */ public static function get_filter_options() { - return array( + return [ self::FILTER_ACCOUNT_CREATION => get_string('filter_date_account_creation', 'tool_usertours'), self::FILTER_FIRST_LOGIN => get_string('filter_date_first_login', 'tool_usertours'), self::FILTER_LAST_LOGIN => get_string('filter_date_last_login', 'tool_usertours'), - ); - + ]; } /** @@ -96,8 +85,14 @@ class accessdate extends base { $range = "{$key}_range"; $enabled = "{$key}_enabled"; - $mform->addElement('advcheckbox', $enabled, get_string($key, 'tool_usertours'), - get_string('filter_accessdate_enabled', 'tool_usertours'), null, array(0, 1)); + $mform->addElement( + 'advcheckbox', + $enabled, + get_string($key, 'tool_usertours'), + get_string('filter_accessdate_enabled', 'tool_usertours'), + null, + [0, 1] + ); $mform->addHelpButton($enabled, $enabled, 'tool_usertours'); $mform->addElement('select', $key, ' ', self::get_filter_options()); @@ -110,7 +105,6 @@ class accessdate extends base { ]); $mform->setDefault($range, 90 * DAYSECS); $mform->hideIf($range, $enabled, 'notchecked'); - } /** @@ -224,4 +218,4 @@ class accessdate extends base { } return $result; } -} \ No newline at end of file +} diff --git a/admin/tool/usertours/classes/local/filter/base.php b/admin/tool/usertours/classes/local/filter/base.php index ff1de4442a9..fc73c58dedd 100644 --- a/admin/tool/usertours/classes/local/filter/base.php +++ b/admin/tool/usertours/classes/local/filter/base.php @@ -14,24 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Filter base. - * - * @package tool_usertours - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\local\filter; -defined('MOODLE_INTERNAL') || die(); - use tool_usertours\tour; use context; /** * Filter base. * + * @package tool_usertours * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ diff --git a/admin/tool/usertours/classes/local/filter/category.php b/admin/tool/usertours/classes/local/filter/category.php index 0b1f119853d..fd5566d998c 100644 --- a/admin/tool/usertours/classes/local/filter/category.php +++ b/admin/tool/usertours/classes/local/filter/category.php @@ -14,24 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Category filter. - * - * @package tool_usertours - * @copyright 2017 The Open University - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\local\filter; -defined('MOODLE_INTERNAL') || die(); - use tool_usertours\tour; use context; /** * Category filter. * + * @package tool_usertours * @copyright 2017 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ diff --git a/admin/tool/usertours/classes/local/filter/course.php b/admin/tool/usertours/classes/local/filter/course.php index 32fb21ddb5d..a440bc0598c 100644 --- a/admin/tool/usertours/classes/local/filter/course.php +++ b/admin/tool/usertours/classes/local/filter/course.php @@ -14,24 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Course filter. - * - * @package tool_usertours - * @copyright 2017 The Open University - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\local\filter; -defined('MOODLE_INTERNAL') || die(); - use tool_usertours\tour; use context; /** * Course filter. * + * @package tool_usertours * @copyright 2017 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ diff --git a/admin/tool/usertours/classes/local/filter/courseformat.php b/admin/tool/usertours/classes/local/filter/courseformat.php index 95e2b7c8613..de2ca143523 100644 --- a/admin/tool/usertours/classes/local/filter/courseformat.php +++ b/admin/tool/usertours/classes/local/filter/courseformat.php @@ -14,24 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Course format filter. - * - * @package tool_usertours - * @copyright 2017 The Open University - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\local\filter; -defined('MOODLE_INTERNAL') || die(); - use tool_usertours\tour; use context; /** * Course format filter. * + * @package tool_usertours * @copyright 2017 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ diff --git a/admin/tool/usertours/classes/local/filter/role.php b/admin/tool/usertours/classes/local/filter/role.php index a64ee83585c..e3c67ebe5a2 100644 --- a/admin/tool/usertours/classes/local/filter/role.php +++ b/admin/tool/usertours/classes/local/filter/role.php @@ -14,24 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Theme filter. - * - * @package tool_usertours - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\local\filter; -defined('MOODLE_INTERNAL') || die(); - use tool_usertours\tour; use context; /** * Theme filter. * + * @package tool_usertours * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ @@ -106,7 +97,7 @@ class role extends base { } // Use a request cache to save on DB queries. - // We may be checking multiple tours and they'll all be for the same userid, and contextid + // We may be checking multiple tours and they'll all be for the same userid, and contextid. $cache = \cache::make_from_params(\cache_store::MODE_REQUEST, 'tool_usertours', 'filter_role'); // Get all of the roles used in this context, including special roles such as user, and frontpageuser. diff --git a/admin/tool/usertours/classes/local/filter/theme.php b/admin/tool/usertours/classes/local/filter/theme.php index 786684c9c13..e041d172cc3 100644 --- a/admin/tool/usertours/classes/local/filter/theme.php +++ b/admin/tool/usertours/classes/local/filter/theme.php @@ -14,24 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Theme filter. - * - * @package tool_usertours - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\local\filter; -defined('MOODLE_INTERNAL') || die(); - use tool_usertours\tour; use context; /** * Theme filter. * + * @package tool_usertours * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ diff --git a/admin/tool/usertours/classes/local/forms/editstep.php b/admin/tool/usertours/classes/local/forms/editstep.php index b9418e75e22..8c586101f33 100644 --- a/admin/tool/usertours/classes/local/forms/editstep.php +++ b/admin/tool/usertours/classes/local/forms/editstep.php @@ -98,7 +98,7 @@ class editstep extends \moodleform { // Content type. $typeoptions = [ static::CONTENTTYPE_LANGSTRING => get_string('content_type_langstring', 'tool_usertours'), - static::CONTENTTYPE_MANUAL => get_string('content_type_manual', 'tool_usertours') + static::CONTENTTYPE_MANUAL => get_string('content_type_manual', 'tool_usertours'), ]; $mform->addElement('select', 'contenttype', get_string('content_type', 'tool_usertours'), $typeoptions); $mform->addHelpButton('contenttype', 'content_type', 'tool_usertours'); @@ -114,7 +114,7 @@ class editstep extends \moodleform { 'maxbytes' => $CFG->maxbytes, 'maxfiles' => EDITOR_UNLIMITED_FILES, 'changeformat' => 1, - 'trusttext' => true + 'trusttext' => true, ]; $objs = $mform->createElement('editor', 'content', get_string('content', 'tool_usertours'), null, $editoroptions); // TODO: MDL-68540 We need to add the editor to a group element because editor element will not work with hideIf. diff --git a/admin/tool/usertours/classes/local/forms/edittour.php b/admin/tool/usertours/classes/local/forms/edittour.php index 80409b1aa78..165de32bc55 100644 --- a/admin/tool/usertours/classes/local/forms/edittour.php +++ b/admin/tool/usertours/classes/local/forms/edittour.php @@ -28,7 +28,7 @@ defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.'); require_once($CFG->libdir . '/formslib.php'); -use \tool_usertours\helper; +use tool_usertours\helper; /** * Form for editing tours. diff --git a/admin/tool/usertours/classes/local/table/step_list.php b/admin/tool/usertours/classes/local/table/step_list.php index c774c6e63f6..87937d7b0e1 100644 --- a/admin/tool/usertours/classes/local/table/step_list.php +++ b/admin/tool/usertours/classes/local/table/step_list.php @@ -39,7 +39,6 @@ require_once($CFG->libdir . '/tablelib.php'); * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class step_list extends \flexible_table { - /** * @var int $tourid The id of the tour. */ @@ -54,25 +53,25 @@ class step_list extends \flexible_table { parent::__construct('steps'); $this->tourid = $tourid; - $baseurl = new \moodle_url('/tool/usertours/configure.php', array( + $baseurl = new \moodle_url('/tool/usertours/configure.php', [ 'id' => $tourid, - )); + ]); $this->define_baseurl($baseurl); // Column definition. - $this->define_columns(array( + $this->define_columns([ 'title', 'content', 'target', 'actions', - )); + ]); - $this->define_headers(array( - get_string('title', 'tool_usertours'), + $this->define_headers([ + get_string('title', 'tool_usertours'), get_string('content', 'tool_usertours'), - get_string('target', 'tool_usertours'), + get_string('target', 'tool_usertours'), get_string('actions', 'tool_usertours'), - )); + ]); $this->set_attribute('class', 'admintable generaltable steptable'); $this->setup(); @@ -98,8 +97,14 @@ class step_list extends \flexible_table { protected function col_content(step $step) { $content = $step->get_content(); $systemcontext = \context_system::instance(); - $content = file_rewrite_pluginfile_urls($content, 'pluginfile.php', $systemcontext->id, - 'tool_usertours', 'stepcontent', $step->get_id()); + $content = file_rewrite_pluginfile_urls( + $content, + 'pluginfile.php', + $systemcontext->id, + 'tool_usertours', + 'stepcontent', + $step->get_id() + ); $content = helper::get_string_from_input($content); $content = step::get_step_image_from_input($content); @@ -135,8 +140,11 @@ class step_list extends \flexible_table { if ($step->is_last_step()) { $actions[] = helper::get_filler_icon(); } else { - $actions[] = helper::format_icon_link($step->get_movedown_link(), 't/down', - get_string('movestepdown', 'tool_usertours')); + $actions[] = helper::format_icon_link( + $step->get_movedown_link(), + 't/down', + get_string('movestepdown', 'tool_usertours') + ); } $actions[] = helper::format_icon_link($step->get_edit_link(), 't/edit', get_string('edit')); diff --git a/admin/tool/usertours/classes/local/table/tour_list.php b/admin/tool/usertours/classes/local/table/tour_list.php index 0ea20a13dbc..dd5298cd8d1 100644 --- a/admin/tool/usertours/classes/local/table/tour_list.php +++ b/admin/tool/usertours/classes/local/table/tour_list.php @@ -38,7 +38,6 @@ require_once($CFG->libdir . '/tablelib.php'); * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class tour_list extends \flexible_table { - /** @var int The count of all tours. */ protected int $tourcount = 0; @@ -52,21 +51,21 @@ class tour_list extends \flexible_table { $this->define_baseurl($baseurl); // Column definition. - $this->define_columns(array( + $this->define_columns([ 'name', 'description', 'appliesto', 'enabled', 'actions', - )); + ]); - $this->define_headers(array( + $this->define_headers([ get_string('name', 'tool_usertours'), get_string('description', 'tool_usertours'), get_string('appliesto', 'tool_usertours'), get_string('enabled', 'tool_usertours'), get_string('actions', 'tool_usertours'), - )); + ]); $this->set_attribute('class', 'admintable generaltable'); $this->setup(); @@ -129,22 +128,32 @@ class tour_list extends \flexible_table { if ($tour->is_first_tour()) { $actions[] = helper::get_filler_icon(); } else { - $actions[] = helper::format_icon_link($tour->get_moveup_link(), 't/up', - get_string('movetourup', 'tool_usertours')); + $actions[] = helper::format_icon_link( + $tour->get_moveup_link(), + 't/up', + get_string('movetourup', 'tool_usertours') + ); } if ($tour->is_last_tour($this->tourcount)) { $actions[] = helper::get_filler_icon(); } else { - $actions[] = helper::format_icon_link($tour->get_movedown_link(), 't/down', - get_string('movetourdown', 'tool_usertours')); + $actions[] = helper::format_icon_link( + $tour->get_movedown_link(), + 't/down', + get_string('movetourdown', 'tool_usertours') + ); } $actions[] = helper::format_icon_link($tour->get_view_link(), 't/viewdetails', get_string('view')); $actions[] = helper::format_icon_link($tour->get_edit_link(), 't/edit', get_string('edit')); $actions[] = helper::format_icon_link($tour->get_duplicate_link(), 't/copy', get_string('duplicate')); - $actions[] = helper::format_icon_link($tour->get_export_link(), 't/export', - get_string('exporttour', 'tool_usertours'), 'tool_usertours'); + $actions[] = helper::format_icon_link( + $tour->get_export_link(), + 't/export', + get_string('exporttour', 'tool_usertours'), + 'tool_usertours' + ); $actions[] = helper::format_icon_link($tour->get_delete_link(), 't/delete', get_string('delete'), null, [ 'data-action' => 'delete', 'data-id' => $tour->get_id(), diff --git a/admin/tool/usertours/classes/local/target/base.php b/admin/tool/usertours/classes/local/target/base.php index 663e5bf03b6..e3b829bfb04 100644 --- a/admin/tool/usertours/classes/local/target/base.php +++ b/admin/tool/usertours/classes/local/target/base.php @@ -14,23 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Target base. - * - * @package tool_usertours - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\local\target; -defined('MOODLE_INTERNAL') || die(); - use tool_usertours\step; /** * Target base. * + * @package tool_usertours * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ diff --git a/admin/tool/usertours/classes/local/target/block.php b/admin/tool/usertours/classes/local/target/block.php index 095e9018c4c..06071c7d5cb 100644 --- a/admin/tool/usertours/classes/local/target/block.php +++ b/admin/tool/usertours/classes/local/target/block.php @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . +namespace tool_usertours\local\target; + /** * Block target. * @@ -21,21 +23,7 @@ * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ - -namespace tool_usertours\local\target; - -defined('MOODLE_INTERNAL') || die(); - -use tool_usertours\step; - -/** - * Block target. - * - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ class block extends base { - /** * Convert the target value to a valid CSS selector for use in the * output configuration. @@ -101,8 +89,12 @@ class block extends base { * @param MoodleQuickForm $mform The form to add configuration to. */ public static function add_disabled_constraints_to_form(\MoodleQuickForm $mform) { - $mform->hideIf('targetvalue_block', 'targettype', 'noteq', - \tool_usertours\target::get_target_constant_for_class(self::class)); + $mform->hideIf( + 'targetvalue_block', + 'targettype', + 'noteq', + \tool_usertours\target::get_target_constant_for_class(self::class) + ); } /** diff --git a/admin/tool/usertours/classes/local/target/selector.php b/admin/tool/usertours/classes/local/target/selector.php index b0cc92682f0..16057c0e04c 100644 --- a/admin/tool/usertours/classes/local/target/selector.php +++ b/admin/tool/usertours/classes/local/target/selector.php @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . +namespace tool_usertours\local\target; + /** * Selector target. * @@ -21,21 +23,7 @@ * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ - -namespace tool_usertours\local\target; - -defined('MOODLE_INTERNAL') || die(); - -use tool_usertours\step; - -/** - * Selector target. - * - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ class selector extends base { - /** * Convert the target value to a valid CSS selector for use in the * output configuration. @@ -91,8 +79,12 @@ class selector extends base { * @param MoodleQuickForm $mform The form to add configuration to. */ public static function add_disabled_constraints_to_form(\MoodleQuickForm $mform) { - $mform->hideIf('targetvalue_selector', 'targettype', 'noteq', - \tool_usertours\target::get_target_constant_for_class(self::class)); + $mform->hideIf( + 'targetvalue_selector', + 'targettype', + 'noteq', + \tool_usertours\target::get_target_constant_for_class(self::class) + ); } /** diff --git a/admin/tool/usertours/classes/local/target/unattached.php b/admin/tool/usertours/classes/local/target/unattached.php index 316fdea4b85..0c530368710 100644 --- a/admin/tool/usertours/classes/local/target/unattached.php +++ b/admin/tool/usertours/classes/local/target/unattached.php @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . +namespace tool_usertours\local\target; + /** * A step designed to be orphaned. * @@ -21,19 +23,6 @@ * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ - -namespace tool_usertours\local\target; - -defined('MOODLE_INTERNAL') || die(); - -use tool_usertours\step; - -/** - * A step designed to be orphaned. - * - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ class unattached extends base { /** * @var array $forcedsettings The settings forced by this type. diff --git a/admin/tool/usertours/classes/manager.php b/admin/tool/usertours/classes/manager.php index ab207e6ce5c..7ce2915c351 100644 --- a/admin/tool/usertours/classes/manager.php +++ b/admin/tool/usertours/classes/manager.php @@ -14,18 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Tour manager. - * - * @package tool_usertours - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours; -defined('MOODLE_INTERNAL') || die(); - use tool_usertours\local\forms; use tool_usertours\local\table; use core\notification; @@ -33,11 +23,11 @@ use core\notification; /** * Tour manager. * + * @package tool_usertours * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class manager { - /** * @var ACTION_LISTTOURS The action to get the list of tours. */ @@ -163,7 +153,7 @@ class manager { $PAGE->set_primary_active_tab('siteadminnode'); // Add the main content. - switch($action) { + switch ($action) { case self::ACTION_NEWTOUR: case self::ACTION_EDITTOUR: $this->edit_tour(optional_param('id', null, PARAM_INT)); @@ -356,7 +346,6 @@ class manager { if ($id) { $tour = tour::instance($id); $PAGE->navbar->add(helper::get_string_from_input($tour->get_name()), $tour->get_edit_link()); - } else { $tour = new tour(); $PAGE->navbar->add(get_string('newtour', 'tool_usertours'), $tour->get_edit_link()); @@ -403,6 +392,7 @@ class manager { foreach (helper::get_all_filters() as $filterclass) { $filterclass::prepare_filter_values_for_form($tour, $data); } + $form->set_data($data); } @@ -568,7 +558,7 @@ class manager { require_sesskey(); - $tour = $DB->get_record('tool_usertours_tours', array('id' => $tourid)); + $tour = $DB->get_record('tool_usertours_tours', ['id' => $tourid]); $tour->enabled = $visibility; $DB->update_record('tool_usertours_tours', $tour); @@ -784,9 +774,10 @@ class manager { */ protected static function _move_tour(tour $tour, $direction) { // We can't move the first tour higher, nor the last tour any lower. - if (($tour->is_first_tour() && $direction == helper::MOVE_UP) || - ($tour->is_last_tour() && $direction == helper::MOVE_DOWN)) { - + if ( + ($tour->is_first_tour() && $direction == helper::MOVE_UP) || + ($tour->is_last_tour() && $direction == helper::MOVE_DOWN) + ) { return; } diff --git a/admin/tool/usertours/classes/output/renderer.php b/admin/tool/usertours/classes/output/renderer.php index 27c1ae37901..6c9ed28f8ba 100644 --- a/admin/tool/usertours/classes/output/renderer.php +++ b/admin/tool/usertours/classes/output/renderer.php @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . +namespace tool_usertours\output; + /** * Renderer. * @@ -21,16 +23,5 @@ * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ - -namespace tool_usertours\output; - -defined('MOODLE_INTERNAL') || die(); - -/** - * Renderer. - * - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ class renderer extends \plugin_renderer_base { } diff --git a/admin/tool/usertours/classes/output/step.php b/admin/tool/usertours/classes/output/step.php index a3f5f81a024..a85a0a5664a 100644 --- a/admin/tool/usertours/classes/output/step.php +++ b/admin/tool/usertours/classes/output/step.php @@ -38,7 +38,6 @@ use tool_usertours\step as stepsource; * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class step implements \renderable { - /** * @var The step instance. */ @@ -65,8 +64,14 @@ class step implements \renderable { $content = $step->get_content(); $systemcontext = \context_system::instance(); - $content = file_rewrite_pluginfile_urls($content, 'pluginfile.php', $systemcontext->id, - 'tool_usertours', 'stepcontent', $step->get_id()); + $content = file_rewrite_pluginfile_urls( + $content, + 'pluginfile.php', + $systemcontext->id, + 'tool_usertours', + 'stepcontent', + $step->get_id() + ); $content = helper::get_string_from_input($content); $content = $step::get_step_image_from_input($content); @@ -74,17 +79,17 @@ class step implements \renderable { $result = (object) [ 'stepid' => $step->get_id(), 'title' => \core_external\util::format_text( - helper::get_string_from_input($step->get_title()), - FORMAT_HTML, - $PAGE->context->id, - 'tool_usertours' - )[0], + helper::get_string_from_input($step->get_title()), + FORMAT_HTML, + $PAGE->context->id, + 'tool_usertours' + )[0], 'content' => \core_external\util::format_text( - $content, - $step->get_contentformat(), - $PAGE->context->id, - 'tool_usertours' - )[0], + $content, + $step->get_contentformat(), + $PAGE->context->id, + 'tool_usertours' + )[0], 'element' => $step->get_target()->convert_to_css(), ]; diff --git a/admin/tool/usertours/classes/output/tour.php b/admin/tool/usertours/classes/output/tour.php index 6e933fb7cc4..d232e44d163 100644 --- a/admin/tool/usertours/classes/output/tour.php +++ b/admin/tool/usertours/classes/output/tour.php @@ -14,6 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . +namespace tool_usertours\output; + +use tool_usertours\tour as toursource; + /** * Tour renderable. * @@ -21,21 +25,7 @@ * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ - -namespace tool_usertours\output; - -defined('MOODLE_INTERNAL') || die(); - -use tool_usertours\tour as toursource; - -/** - * Tour renderable. - * - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ class tour implements \renderable { - /** * @var The tour instance. */ diff --git a/admin/tool/usertours/classes/privacy/provider.php b/admin/tool/usertours/classes/privacy/provider.php index db71ee9a1a9..c65b204860f 100644 --- a/admin/tool/usertours/classes/privacy/provider.php +++ b/admin/tool/usertours/classes/privacy/provider.php @@ -14,25 +14,16 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Privacy Subsystem implementation for tool_usertours. - * - * @package tool_usertours - * @copyright 2018 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours\privacy; -use \core_privacy\local\request\writer; -use \core_privacy\local\metadata\collection; -use \core_privacy\local\request\transform; - -defined('MOODLE_INTERNAL') || die(); +use core_privacy\local\request\writer; +use core_privacy\local\metadata\collection; +use core_privacy\local\request\transform; /** * Implementation of the privacy subsystem plugin provider for the user tours feature. * + * @package tool_usertours * @copyright 2018 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ @@ -41,9 +32,7 @@ class provider implements \core_privacy\local\metadata\provider, // This plugin has some sitewide user preferences to export. - \core_privacy\local\request\user_preference_provider -{ - + \core_privacy\local\request\user_preference_provider { /** * Returns meta data about this system. * diff --git a/admin/tool/usertours/classes/step.php b/admin/tool/usertours/classes/step.php index 95715e177ad..485bc081536 100644 --- a/admin/tool/usertours/classes/step.php +++ b/admin/tool/usertours/classes/step.php @@ -14,6 +14,11 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . +namespace tool_usertours; + +use context_system; +use stdClass; + /** * Step class. * @@ -21,22 +26,7 @@ * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ - -namespace tool_usertours; - -use context_system; -use stdClass; - -defined('MOODLE_INTERNAL') || die(); - -/** - * Step class. - * - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ class step { - /** * @var int $id The id of the step. */ @@ -137,7 +127,7 @@ class step { global $DB; return $this->reload_from_record( - $DB->get_record('tool_usertours_steps', array('id' => $id)) + $DB->get_record('tool_usertours_steps', ['id' => $id]) ); } @@ -414,7 +404,7 @@ class step { */ public function get_config($key = null, $default = null) { if ($this->config === null) { - $this->config = (object) array(); + $this->config = (object) []; } if ($key === null) { @@ -448,7 +438,7 @@ class step { */ public function set_config($key, $value) { if ($this->config === null) { - $this->config = (object) array(); + $this->config = (object) []; } if ($value === null) { @@ -497,7 +487,7 @@ class step { 'name' => $file->get_filename(), 'path' => $file->get_filepath(), 'content' => base64_encode($file->get_content()), - 'encode' => 'base64' + 'encode' => 'base64', ]; } @@ -635,7 +625,7 @@ class step { return; } - $DB->delete_records('tool_usertours_steps', array('id' => $this->id)); + $DB->delete_records('tool_usertours_steps', ['id' => $this->id]); $this->get_tour()->reset_step_sortorder(); // Notify of a change to the step configuration. @@ -817,15 +807,19 @@ class step { return $content; } - $content = preg_replace_callback('%@@PIXICON::(?P([^::]*))::(?P([^@@]*))@@%', - function(array $matches) { + $content = preg_replace_callback( + '%@@PIXICON::(?P([^::]*))::(?P([^@@]*))@@%', + function (array $matches) { global $OUTPUT; $component = $matches['component']; if ($component == 'moodle') { $component = 'core'; } - return \html_writer::img($OUTPUT->image_url($matches['identifier'], $component)->out(false), '', - ['class' => 'img-fluid']); + return \html_writer::img( + $OUTPUT->image_url($matches['identifier'], $component)->out(false), + '', + ['class' => 'img-fluid'] + ); }, $content ); diff --git a/admin/tool/usertours/classes/target.php b/admin/tool/usertours/classes/target.php index f65c2caa0e2..9299ca5180c 100644 --- a/admin/tool/usertours/classes/target.php +++ b/admin/tool/usertours/classes/target.php @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . +namespace tool_usertours; + /** * Target class. * @@ -21,19 +23,7 @@ * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ - -namespace tool_usertours; - -defined('MOODLE_INTERNAL') || die(); - -/** - * Target class. - * - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ class target { - /** * @var TARGET_SELECTOR The target is a CSS selector. */ diff --git a/admin/tool/usertours/classes/tour.php b/admin/tool/usertours/classes/tour.php index c51f9e85f0d..e9cb318fae1 100644 --- a/admin/tool/usertours/classes/tour.php +++ b/admin/tool/usertours/classes/tour.php @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . +namespace tool_usertours; + /** * Tour class. * @@ -21,21 +23,7 @@ * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ - -namespace tool_usertours; - -use tool_usertours\local\clientside_filter\clientside_filter; - -defined('MOODLE_INTERNAL') || die(); - -/** - * Tour class. - * - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ class tour { - /** * The tour is currently disabled * @@ -157,7 +145,7 @@ class tour { global $DB; return $this->reload_from_record( - $DB->get_record('tool_usertours_tours', array('id' => $id), '*', MUST_EXIST) + $DB->get_record('tool_usertours_tours', ['id' => $id], '*', MUST_EXIST) ); } @@ -424,7 +412,7 @@ class tour { * @return object */ public function to_record() { - return (object) array( + return (object) [ 'id' => $this->id, 'name' => $this->name, 'description' => $this->description, @@ -434,7 +422,7 @@ class tour { 'endtourlabel' => $this->endtourlabel, 'configdata' => json_encode($this->config), 'displaystepnumbers' => $this->displaystepnumbers, - ); + ]; } /** @@ -519,7 +507,7 @@ class tour { */ public function get_config($key = null, $default = null) { if ($this->config === null) { - $this->config = (object) array(); + $this->config = (object) []; } if ($key === null) { return $this->config; @@ -545,7 +533,7 @@ class tour { */ public function set_config($key, $value) { if ($this->config === null) { - $this->config = (object) array(); + $this->config = (object) []; } $this->config->$key = $value; $this->dirty = true; @@ -602,7 +590,7 @@ class tour { } // Remove the configuration for the tour. - $DB->delete_records('tool_usertours_tours', array('id' => $this->id)); + $DB->delete_records('tool_usertours_tours', ['id' => $this->id]); helper::reset_tour_sortorder(); $this->remove_user_preferences(); @@ -617,11 +605,11 @@ class tour { */ public function reset_step_sortorder() { global $DB; - $steps = $DB->get_records('tool_usertours_steps', array('tourid' => $this->id), 'sortorder ASC', 'id'); + $steps = $DB->get_records('tool_usertours_steps', ['tourid' => $this->id], 'sortorder ASC', 'id'); $index = 0; foreach ($steps as $step) { - $DB->set_field('tool_usertours_steps', 'sortorder', $index, array('id' => $step->id)); + $DB->set_field('tool_usertours_steps', 'sortorder', $index, ['id' => $step->id]); $index++; } diff --git a/admin/tool/usertours/configure.php b/admin/tool/usertours/configure.php index cb7bc983218..5ff066b18e9 100644 --- a/admin/tool/usertours/configure.php +++ b/admin/tool/usertours/configure.php @@ -31,5 +31,5 @@ $pluginmanager = new \tool_usertours\manager(); $PAGE->set_context(context_system::instance()); $pluginmanager->execute( - $action - ); + $action +); diff --git a/admin/tool/usertours/db/access.php b/admin/tool/usertours/db/access.php index 1e8e6b927c9..4dd38c2245d 100644 --- a/admin/tool/usertours/db/access.php +++ b/admin/tool/usertours/db/access.php @@ -24,13 +24,13 @@ defined('MOODLE_INTERNAL') || die(); -$capabilities = array( +$capabilities = [ 'tool/usertours:managetours' => [ 'captype' => 'write', 'riskbitmask' => RISK_XSS, 'contextlevel' => CONTEXT_SYSTEM, 'archetypes' => [ 'manager' => CAP_ALLOW, - ] + ], ], -); +]; diff --git a/admin/tool/usertours/db/caches.php b/admin/tool/usertours/db/caches.php index 3ae3c8fb4c7..28e38465699 100644 --- a/admin/tool/usertours/db/caches.php +++ b/admin/tool/usertours/db/caches.php @@ -24,19 +24,19 @@ defined('MOODLE_INTERNAL') || die(); -$definitions = array( - 'tourdata' => array( +$definitions = [ + 'tourdata' => [ 'mode' => cache_store::MODE_APPLICATION, 'simplekeys' => true, 'simpledata' => true, 'staticacceleration' => true, 'staticaccelerationsize' => 1, - ), - 'stepdata' => array( + ], + 'stepdata' => [ 'mode' => cache_store::MODE_APPLICATION, 'simplekeys' => true, 'simpledata' => true, 'staticacceleration' => true, 'staticaccelerationsize' => 1, - ), -); + ], +]; diff --git a/admin/tool/usertours/db/services.php b/admin/tool/usertours/db/services.php index 38e65eaa5a5..9b47633c5d6 100644 --- a/admin/tool/usertours/db/services.php +++ b/admin/tool/usertours/db/services.php @@ -24,40 +24,40 @@ defined('MOODLE_INTERNAL') || die(); -$functions = array( - 'tool_usertours_fetch_and_start_tour' => array( +$functions = [ + 'tool_usertours_fetch_and_start_tour' => [ 'classname' => 'tool_usertours\external\tour', 'methodname' => 'fetch_and_start_tour', 'description' => 'Fetch the specified tour', 'type' => 'read', 'capabilities' => '', 'ajax' => true, - ), + ], - 'tool_usertours_step_shown' => array( + 'tool_usertours_step_shown' => [ 'classname' => 'tool_usertours\external\tour', 'methodname' => 'step_shown', 'description' => 'Mark the specified step as completed for the current user', 'type' => 'write', 'capabilities' => '', 'ajax' => true, - ), + ], - 'tool_usertours_complete_tour' => array( + 'tool_usertours_complete_tour' => [ 'classname' => 'tool_usertours\external\tour', 'methodname' => 'complete_tour', 'description' => 'Mark the specified tour as completed for the current user', 'type' => 'write', 'capabilities' => '', 'ajax' => true, - ), + ], - 'tool_usertours_reset_tour' => array( + 'tool_usertours_reset_tour' => [ 'classname' => 'tool_usertours\external\tour', 'methodname' => 'reset_tour', 'description' => 'Remove the specified tour', 'type' => 'write', 'capabilities' => '', 'ajax' => true, - ), -); + ], +]; diff --git a/admin/tool/usertours/tests/accessdate_filter_test.php b/admin/tool/usertours/tests/accessdate_filter_test.php index 52b44c3c31b..1458ee14763 100644 --- a/admin/tool/usertours/tests/accessdate_filter_test.php +++ b/admin/tool/usertours/tests/accessdate_filter_test.php @@ -24,9 +24,9 @@ use tool_usertours\local\filter\accessdate; * @package tool_usertours * @copyright 2019 Tom Dickman * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \tool_usertours\local\filter\accessdate */ class accessdate_filter_test extends \advanced_testcase { - public function setUp(): void { $this->resetAfterTest(true); } @@ -36,7 +36,7 @@ class accessdate_filter_test extends \advanced_testcase { * * @return array */ - public function filter_matches_provider() { + public static function filter_matches_provider(): array { return [ 'No config set; Matches' => [ [], @@ -45,61 +45,61 @@ class accessdate_filter_test extends \advanced_testcase { ], 'Filter is not enabled; Match' => [ ['filter_accessdate' => accessdate::FILTER_ACCOUNT_CREATION, 'filter_accessdate_range' => 90 * DAYSECS, - 'filter_accessdate_enabled' => 0], + 'filter_accessdate_enabled' => 0, ], ['timecreated' => time() - (89 * DAYSECS)], true, ], 'Filter is not enabled (tour would not be displayed if it was); Match' => [ ['filter_accessdate' => accessdate::FILTER_ACCOUNT_CREATION, 'filter_accessdate_range' => 90 * DAYSECS, - 'filter_accessdate_enabled' => 0], + 'filter_accessdate_enabled' => 0, ], ['timecreated' => time() - (91 * DAYSECS)], true, ], 'Inside range of account creation date; Match' => [ ['filter_accessdate' => accessdate::FILTER_ACCOUNT_CREATION, 'filter_accessdate_range' => 90 * DAYSECS, - 'filter_accessdate_enabled' => 1], + 'filter_accessdate_enabled' => 1, ], ['timecreated' => time() - (89 * DAYSECS)], true, ], 'Outside range of account creation date; No match' => [ ['filter_accessdate' => accessdate::FILTER_ACCOUNT_CREATION, 'filter_accessdate_range' => 90 * DAYSECS, - 'filter_accessdate_enabled' => 1], + 'filter_accessdate_enabled' => 1, ], ['timecreated' => time() - (91 * DAYSECS)], false, ], 'Inside range of first login date; Match' => [ ['filter_accessdate' => accessdate::FILTER_FIRST_LOGIN, 'filter_accessdate_range' => 90 * DAYSECS, - 'filter_accessdate_enabled' => 1], + 'filter_accessdate_enabled' => 1, ], ['firstaccess' => time() - (89 * DAYSECS)], true, ], 'Outside range of first login date; No match' => [ ['filter_accessdate' => accessdate::FILTER_FIRST_LOGIN, 'filter_accessdate_range' => 90 * DAYSECS, - 'filter_accessdate_enabled' => 1], + 'filter_accessdate_enabled' => 1, ], ['firstaccess' => time() - (91 * DAYSECS)], false, ], 'Inside range of last login date; Match' => [ ['filter_accessdate' => accessdate::FILTER_LAST_LOGIN, 'filter_accessdate_range' => 90 * DAYSECS, - 'filter_accessdate_enabled' => 1], + 'filter_accessdate_enabled' => 1, ], ['lastlogin' => time() - (89 * DAYSECS)], true, ], 'Outside range of last login date; No match' => [ ['filter_accessdate' => accessdate::FILTER_LAST_LOGIN, 'filter_accessdate_range' => 90 * DAYSECS, - 'filter_accessdate_enabled' => 1], + 'filter_accessdate_enabled' => 1, ], ['lastlogin' => time() - (91 * DAYSECS)], false, ], 'User has never logged in, but tour should be visible; Match' => [ ['filter_accessdate' => accessdate::FILTER_LAST_LOGIN, 'filter_accessdate_range' => 90 * DAYSECS, - 'filter_accessdate_enabled' => 1], + 'filter_accessdate_enabled' => 1, ], ['lastlogin' => 0, 'timecreated' => time() - (89 * DAYSECS)], true, ], 'User has never logged in, and tour should not be visible; No match' => [ ['filter_accessdate' => accessdate::FILTER_LAST_LOGIN, 'filter_accessdate_range' => 90 * DAYSECS, - 'filter_accessdate_enabled' => 1], + 'filter_accessdate_enabled' => 1, ], ['lastlogin' => 0, 'timecreated' => time() - (91 * DAYSECS)], false, ], @@ -115,7 +115,7 @@ class accessdate_filter_test extends \advanced_testcase { * @param array $userstate any user state required for test. * @param bool $expected result expected. */ - public function test_filter_matches($filtervalues, $userstate, $expected) { + public function test_filter_matches($filtervalues, $userstate, $expected): void { $course = $this->getDataGenerator()->create_course(); $context = \context_course::instance($course->id); @@ -127,5 +127,4 @@ class accessdate_filter_test extends \advanced_testcase { $this->assertEquals($expected, accessdate::filter_matches($tour, $context)); } - } diff --git a/admin/tool/usertours/tests/behat/behat_tool_usertours.php b/admin/tool/usertours/tests/behat/behat_tool_usertours.php index ef00bd2f7a0..797f5b5142a 100644 --- a/admin/tool/usertours/tests/behat/behat_tool_usertours.php +++ b/admin/tool/usertours/tests/behat/behat_tool_usertours.php @@ -25,7 +25,7 @@ require_once(__DIR__ . '/../../../../../lib/behat/behat_base.php'); -use Behat\Gherkin\Node\TableNode as TableNode; +use Behat\Gherkin\Node\TableNode; /** * User tour related steps definitions. * @@ -35,7 +35,6 @@ use Behat\Gherkin\Node\TableNode as TableNode; * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class behat_tool_usertours extends behat_base { - /** * Add a new user tour. * @@ -90,8 +89,9 @@ class behat_tool_usertours extends behat_base { * @Given /^I open the User tour settings page$/ */ public function i_open_the_user_tour_settings_page() { - $this->execute('behat_navigation::i_navigate_to_in_site_administration', - get_string('appearance', 'admin') . ' > ' . + $this->execute( + 'behat_navigation::i_navigate_to_in_site_administration', + get_string('appearance', 'admin') . ' > ' . get_string('usertours', 'tool_usertours') ); } diff --git a/admin/tool/usertours/tests/cache_test.php b/admin/tool/usertours/tests/cache_test.php index 27f96008d12..54cadfaf578 100644 --- a/admin/tool/usertours/tests/cache_test.php +++ b/admin/tool/usertours/tests/cache_test.php @@ -27,6 +27,7 @@ require_once(__DIR__ . '/helper_trait.php'); * @package tool_usertours * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \tool_usertours\cache */ class cache_test extends \advanced_testcase { // There are shared helpers for these tests in the helper trait. @@ -35,7 +36,7 @@ class cache_test extends \advanced_testcase { /** * Test that get_enabled_tourdata does not return disabled tours. */ - public function test_get_enabled_tourdata_disabled() { + public function test_get_enabled_tourdata_disabled(): void { $this->resetAfterTest(); $tour = $this->helper_create_tour((object)['enabled' => false]); @@ -48,7 +49,7 @@ class cache_test extends \advanced_testcase { /** * Test that get_enabled_tourdata does not return an enabled but empty tour. */ - public function test_get_enabled_tourdata_enabled_no_steps() { + public function test_get_enabled_tourdata_enabled_no_steps(): void { $this->resetAfterTest(); $this->helper_create_tour(); @@ -60,7 +61,7 @@ class cache_test extends \advanced_testcase { /** * Test that get_enabled_tourdata returns a tour with steps. */ - public function test_get_enabled_tourdata_enabled() { + public function test_get_enabled_tourdata_enabled(): void { $this->resetAfterTest(); // Create two tours. Only the second has steps. @@ -79,7 +80,7 @@ class cache_test extends \advanced_testcase { /** * Test that get_enabled_tourdata returns tours in the correct sortorder */ - public function test_get_enabled_tourdata_enabled_sortorder() { + public function test_get_enabled_tourdata_enabled_sortorder(): void { $this->resetAfterTest(); $tour1 = $this->helper_create_tour(); @@ -100,7 +101,7 @@ class cache_test extends \advanced_testcase { /** * Test that caching prevents additional DB reads. */ - public function test_get_enabled_tourdata_single_fetch() { + public function test_get_enabled_tourdata_single_fetch(): void { global $DB; $this->resetAfterTest(); @@ -118,7 +119,6 @@ class cache_test extends \advanced_testcase { // No subsequent reads for any further calls. $matches = \tool_usertours\cache::get_enabled_tourdata(); $this->assertEquals(1, $DB->perf_get_reads() - $startreads); - } /** @@ -126,31 +126,31 @@ class cache_test extends \advanced_testcase { * * @return array */ - public function get_matching_tourdata_provider() { + public static function get_matching_tourdata_provider(): array { $tourconfigs = [ (object) [ 'name' => 'my_exact_1', - 'pathmatch' => '/my/view.php' + 'pathmatch' => '/my/view.php', ], (object) [ 'name' => 'my_failed_regex', - 'pathmatch' => '/my/*.php' + 'pathmatch' => '/my/*.php', ], (object) [ 'name' => 'my_glob_1', - 'pathmatch' => '/my/%' + 'pathmatch' => '/my/%', ], (object) [ 'name' => 'my_glob_2', - 'pathmatch' => '/my/%' + 'pathmatch' => '/my/%', ], (object) [ 'name' => 'frontpage_only', - 'pathmatch' => 'FRONTPAGE' + 'pathmatch' => 'FRONTPAGE', ], (object) [ 'name' => 'frontpage_match', - 'pathmatch' => '/?%' + 'pathmatch' => '/?%', ], ]; @@ -186,7 +186,7 @@ class cache_test extends \advanced_testcase { * @param string $targetmatch The match to be tested * @param array $expected An array containing the ordered names of the expected tours */ - public function test_get_matching_tourdata($tourconfigs, $targetmatch, $expected) { + public function test_get_matching_tourdata($tourconfigs, $targetmatch, $expected): void { $this->resetAfterTest(); foreach ($tourconfigs as $tourconfig) { $tour = $this->helper_create_tour($tourconfig); @@ -205,7 +205,7 @@ class cache_test extends \advanced_testcase { /** * Test that notify_tour_change clears the cache. */ - public function test_notify_tour_change() { + public function test_notify_tour_change(): void { global $DB; $this->resetAfterTest(); @@ -236,7 +236,7 @@ class cache_test extends \advanced_testcase { /** * Test that get_stepdata returns an empty array when no steps were found. */ - public function test_get_stepdata_no_steps() { + public function test_get_stepdata_no_steps(): void { $this->resetAfterTest(); $tour = $this->helper_create_tour((object)['enabled' => false]); @@ -249,7 +249,7 @@ class cache_test extends \advanced_testcase { /** * Test that get_stepdata returns an empty array when no steps were found. */ - public function test_get_stepdata_correct_tour() { + public function test_get_stepdata_correct_tour(): void { $this->resetAfterTest(); $tour1 = $this->helper_create_tour((object)['enabled' => false]); @@ -274,7 +274,7 @@ class cache_test extends \advanced_testcase { * This is very difficult to determine because the act of changing the * order will likely change the DB natural sorting. */ - public function test_get_stepdata_ordered_steps() { + public function test_get_stepdata_ordered_steps(): void { $this->resetAfterTest(); $tour = $this->helper_create_tour((object)['enabled' => false]); @@ -290,7 +290,7 @@ class cache_test extends \advanced_testcase { $this->assertCount(4, $data); // Re-order the steps. - usort($steps, function($a, $b) { + usort($steps, function ($a, $b) { return ($a->get_sortorder() < $b->get_sortorder()) ? -1 : 1; }); @@ -303,7 +303,7 @@ class cache_test extends \advanced_testcase { /** * Test that caching prevents additional DB reads. */ - public function test_get_stepdata_single_fetch() { + public function test_get_stepdata_single_fetch(): void { global $DB; $this->resetAfterTest(); @@ -324,7 +324,7 @@ class cache_test extends \advanced_testcase { /** * Test that notify_step_change clears the cache. */ - public function test_notify_step_change() { + public function test_notify_step_change(): void { global $DB; $this->resetAfterTest(); diff --git a/admin/tool/usertours/tests/helper_test.php b/admin/tool/usertours/tests/helper_test.php index f6c574b3077..3a2f1cdad26 100644 --- a/admin/tool/usertours/tests/helper_test.php +++ b/admin/tool/usertours/tests/helper_test.php @@ -14,35 +14,25 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Tests for helper. - * - * @package tool_usertours - * @copyright 2022 Huong Nguyen - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - namespace tool_usertours; use advanced_testcase; -defined('MOODLE_INTERNAL') || die(); - /** * Tests for helper. * * @package tool_usertours * @copyright 2022 Huong Nguyen * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \tool_usertours\helper */ class helper_test extends advanced_testcase { - /** * Data Provider for get_string_from_input. * * @return array */ - public function get_string_from_input_provider(): array { + public static function get_string_from_input_provider(): array { return [ 'Text' => [ 'example', @@ -78,7 +68,7 @@ class helper_test extends advanced_testcase { * @param string $string The string to test * @param string $expected The expected result */ - public function test_get_string_from_input($string, $expected) { + public function test_get_string_from_input($string, $expected): void { $this->assertEquals($expected, helper::get_string_from_input($string)); } } diff --git a/admin/tool/usertours/tests/helper_trait.php b/admin/tool/usertours/tests/helper_trait.php index c3638a1d41b..988ace5abcd 100644 --- a/admin/tool/usertours/tests/helper_trait.php +++ b/admin/tool/usertours/tests/helper_trait.php @@ -14,16 +14,6 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Helpers for unit tests. - * - * @package tool_usertours - * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - -defined('MOODLE_INTERNAL') || die(); - /** * Helpers for unit tests. * @@ -47,7 +37,7 @@ trait tool_usertours_helper_trait { 'name' => '', 'description' => '', 'configdata' => '', - 'displaystepnumbers' => true + 'displaystepnumbers' => true, ]; if ($tourconfig === null) { diff --git a/admin/tool/usertours/tests/manager_test.php b/admin/tool/usertours/tests/manager_test.php index 17751f0aa74..a9582b3273c 100644 --- a/admin/tool/usertours/tests/manager_test.php +++ b/admin/tool/usertours/tests/manager_test.php @@ -28,6 +28,7 @@ require_once(__DIR__ . '/helper_trait.php'); * @package tool_usertours * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \tool_usertours\manager */ class manager_test extends \advanced_testcase { // There are shared helpers for these tests in the helper trait. @@ -74,28 +75,28 @@ class manager_test extends \advanced_testcase { * * @return array */ - public function sesskey_required_provider() { + public static function sesskey_required_provider(): array { $tourid = rand(1, 100); $stepid = rand(1, 100); return [ - 'Tour removal' => [ - 'delete_tour', - [$tourid], - ], - 'Step removal' => [ - 'delete_step', - [$stepid], - ], - 'Tour visibility' => [ - 'show_hide_tour', - [$tourid, true], - ], - 'Move step' => [ - 'move_step', - [$stepid], - ], - ]; + 'Tour removal' => [ + 'delete_tour', + [$tourid], + ], + 'Step removal' => [ + 'delete_step', + [$stepid], + ], + 'Tour visibility' => [ + 'show_hide_tour', + [$tourid, true], + ], + 'Move step' => [ + 'move_step', + [$stepid], + ], + ]; } /** @@ -105,7 +106,7 @@ class manager_test extends \advanced_testcase { * @param string $function The function to test * @param array $arguments The arguments to pass with it */ - public function test_sesskey_required($function, $arguments) { + public function test_sesskey_required($function, $arguments): void { $manager = new \tool_usertours\manager(); $rc = new \ReflectionClass('\tool_usertours\manager'); @@ -121,7 +122,7 @@ class manager_test extends \advanced_testcase { * * @return array */ - public function move_tour_provider() { + public static function move_tour_provider(): array { $alltours = [ ['name' => 'Tour 1'], ['name' => 'Tour 2'], @@ -167,7 +168,7 @@ class manager_test extends \advanced_testcase { * @param int $expectedsortorder * @return void */ - public function test_move_tour($alltours, $movetourname, $direction, $expectedsortorder) { + public function test_move_tour($alltours, $movetourname, $direction, $expectedsortorder): void { global $DB; $this->resetAfterTest(); @@ -198,114 +199,115 @@ class manager_test extends \advanced_testcase { * * @return array */ - public function get_matching_tours_provider() { + public static function get_matching_tours_provider(): array { global $CFG; $alltours = [ [ - 'pathmatch' => '/my/%', - 'enabled' => false, - 'name' => 'Failure', - 'description' => '', - 'configdata' => '', - ], + 'pathmatch' => '/my/%', + 'enabled' => false, + 'name' => 'Failure', + 'description' => '', + 'configdata' => '', + ], [ - 'pathmatch' => '/my/%', - 'enabled' => true, - 'name' => 'My tour enabled', - 'description' => '', - 'configdata' => '', - ], + 'pathmatch' => '/my/%', + 'enabled' => true, + 'name' => 'My tour enabled', + 'description' => '', + 'configdata' => '', + ], [ - 'pathmatch' => '/my/%', - 'enabled' => true, - 'name' => 'My tour enabled 2', - 'description' => '', - 'configdata' => '', - ], + 'pathmatch' => '/my/%', + 'enabled' => true, + 'name' => 'My tour enabled 2', + 'description' => '', + 'configdata' => '', + ], [ - 'pathmatch' => '/my/%', - 'enabled' => false, - 'name' => 'Failure', - 'description' => '', - 'configdata' => '', - ], + 'pathmatch' => '/my/%', + 'enabled' => false, + 'name' => 'Failure', + 'description' => '', + 'configdata' => '', + ], [ - 'pathmatch' => '/course/?id=%foo=bar', - 'enabled' => false, - 'name' => 'Failure', - 'description' => '', - 'configdata' => '', - ], + 'pathmatch' => '/course/?id=%foo=bar', + 'enabled' => false, + 'name' => 'Failure', + 'description' => '', + 'configdata' => '', + ], [ - 'pathmatch' => '/course/?id=%foo=bar', - 'enabled' => true, - 'name' => 'course tour with additional params enabled', - 'description' => '', - 'configdata' => '', - ], + 'pathmatch' => '/course/?id=%foo=bar', + 'enabled' => true, + 'name' => 'course tour with additional params enabled', + 'description' => '', + 'configdata' => '', + ], [ - 'pathmatch' => '/course/?id=%foo=bar', - 'enabled' => false, - 'name' => 'Failure', - 'description' => '', - 'configdata' => '', - ], + 'pathmatch' => '/course/?id=%foo=bar', + 'enabled' => false, + 'name' => 'Failure', + 'description' => '', + 'configdata' => '', + ], [ - 'pathmatch' => '/course/?id=%', - 'enabled' => false, - 'name' => 'Failure', - 'description' => '', - 'configdata' => '', - ], + 'pathmatch' => '/course/?id=%', + 'enabled' => false, + 'name' => 'Failure', + 'description' => '', + 'configdata' => '', + ], [ - 'pathmatch' => '/course/?id=%', - 'enabled' => true, - 'name' => 'course tour enabled', - 'description' => '', - 'configdata' => '', - ], + 'pathmatch' => '/course/?id=%', + 'enabled' => true, + 'name' => 'course tour enabled', + 'description' => '', + 'configdata' => '', + ], [ - 'pathmatch' => '/course/?id=%', - 'enabled' => false, - 'name' => 'Failure', - 'description' => '', - 'configdata' => '', - ], + 'pathmatch' => '/course/?id=%', + 'enabled' => false, + 'name' => 'Failure', + 'description' => '', + 'configdata' => '', + ], ]; - return [ - 'No matches found' => [ - $alltours, - $CFG->wwwroot . '/some/invalid/value', - [], - ], - 'Never return a disabled tour' => [ - $alltours, - $CFG->wwwroot . '/my/index.php', - ['My tour enabled', 'My tour enabled 2'], - ], - 'My not course' => [ - $alltours, - $CFG->wwwroot . '/my/index.php', - ['My tour enabled', 'My tour enabled 2'], - ], - 'My with params' => [ - $alltours, - $CFG->wwwroot . '/my/index.php?id=42', - ['My tour enabled', 'My tour enabled 2'], - ], - 'Course with params' => [ - $alltours, - $CFG->wwwroot . '/course/?id=42', - ['course tour enabled'], - ], - 'Course with params and trailing content' => [ - $alltours, - $CFG->wwwroot . '/course/?id=42&foo=bar', - ['course tour with additional params enabled', 'course tour enabled'], - ], - ]; + return + [ + 'No matches found' => [ + $alltours, + $CFG->wwwroot . '/some/invalid/value', + [], + ], + 'Never return a disabled tour' => [ + $alltours, + $CFG->wwwroot . '/my/index.php', + ['My tour enabled', 'My tour enabled 2'], + ], + 'My not course' => [ + $alltours, + $CFG->wwwroot . '/my/index.php', + ['My tour enabled', 'My tour enabled 2'], + ], + 'My with params' => [ + $alltours, + $CFG->wwwroot . '/my/index.php?id=42', + ['My tour enabled', 'My tour enabled 2'], + ], + 'Course with params' => [ + $alltours, + $CFG->wwwroot . '/course/?id=42', + ['course tour enabled'], + ], + 'Course with params and trailing content' => [ + $alltours, + $CFG->wwwroot . '/course/?id=42&foo=bar', + ['course tour with additional params enabled', 'course tour enabled'], + ], + ]; } /** @@ -316,7 +318,7 @@ class manager_test extends \advanced_testcase { * @param string $url The URL to test. * @param array $expected List of names of the expected matching tours. */ - public function test_get_matching_tours(array $alltours, string $url, array $expected) { + public function test_get_matching_tours(array $alltours, string $url, array $expected): void { $this->resetAfterTest(); $this->setGuestUser(); @@ -336,7 +338,7 @@ class manager_test extends \advanced_testcase { /** * Test that no matching tours are returned if there is pending site policy agreement. */ - public function test_get_matching_tours_for_user_without_site_policy_agreed() { + public function test_get_matching_tours_for_user_without_site_policy_agreed(): void { global $CFG; $this->resetAfterTest(); diff --git a/admin/tool/usertours/tests/privacy/provider_test.php b/admin/tool/usertours/tests/privacy/provider_test.php index 907feb48352..e63ace554d3 100644 --- a/admin/tool/usertours/tests/privacy/provider_test.php +++ b/admin/tool/usertours/tests/privacy/provider_test.php @@ -14,18 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Unit tests for the tool_usertours implementation of the privacy API. - * - * @package tool_usertours - * @category test - * @copyright 2018 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ namespace tool_usertours\privacy; -defined('MOODLE_INTERNAL') || die(); - use core_privacy\local\metadata\collection; use core_privacy\local\request\writer; use tool_usertours\tour; @@ -34,11 +24,13 @@ use tool_usertours\privacy\provider; /** * Unit tests for the tool_usertours implementation of the privacy API. * + * @package tool_usertours + * @category test * @copyright 2018 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \tool_usertours\privacy\provider */ class provider_test extends \core_privacy\tests\provider_testcase { - /** * Helper method for creating a tour * @@ -56,7 +48,7 @@ class provider_test extends \core_privacy\tests\provider_testcase { /** * Ensure that get_metadata exports valid content. */ - public function test_get_metadata() { + public function test_get_metadata(): void { $items = new collection('tool_usertours'); $result = provider::get_metadata($items); $this->assertSame($items, $result); @@ -66,7 +58,7 @@ class provider_test extends \core_privacy\tests\provider_testcase { /** * Ensure that export_user_preferences returns no data if the user has completed no tours. */ - public function test_export_user_preferences_no_pref() { + public function test_export_user_preferences_no_pref(): void { $user = \core_user::get_user_by_username('admin'); provider::export_user_preferences($user->id); @@ -78,7 +70,7 @@ class provider_test extends \core_privacy\tests\provider_testcase { /** * Ensure that export_user_preferences returns request completion data. */ - public function test_export_user_preferences_completed() { + public function test_export_user_preferences_completed(): void { global $DB; $this->resetAfterTest(); @@ -101,7 +93,7 @@ class provider_test extends \core_privacy\tests\provider_testcase { /** * Ensure that export_user_preferences returns request completion data. */ - public function test_export_user_preferences_requested() { + public function test_export_user_preferences_requested(): void { global $DB; $this->resetAfterTest(); @@ -149,14 +141,16 @@ class provider_test extends \core_privacy\tests\provider_testcase { $this->assertCount(1, $prefs); // We should have received back the "completed tour" preference of the test user. - $this->assertStringStartsWith('You last marked the "' . $tour->get_name() . '" user tour as completed on', - reset($prefs)->description); + $this->assertStringStartsWith( + 'You last marked the "' . $tour->get_name() . '" user tour as completed on', + reset($prefs)->description + ); } /** * Ensure that export_user_preferences excludes deleted tours. */ - public function test_export_user_preferences_deleted_tour() { + public function test_export_user_preferences_deleted_tour(): void { global $DB; $this->resetAfterTest(); diff --git a/admin/tool/usertours/tests/role_filter_test.php b/admin/tool/usertours/tests/role_filter_test.php index 20ee1be9629..ceff72fb39b 100644 --- a/admin/tool/usertours/tests/role_filter_test.php +++ b/admin/tool/usertours/tests/role_filter_test.php @@ -22,9 +22,9 @@ namespace tool_usertours; * @package tool_usertours * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \tool_usertours\local\filter\role */ class role_filter_test extends \advanced_testcase { - /** * @var $course Test course */ @@ -72,7 +72,7 @@ class role_filter_test extends \advanced_testcase { /** * Test the filter_matches function when any is set. */ - public function test_filter_matches_any() { + public function test_filter_matches_any(): void { $context = \context_course::instance($this->course->id); // Note: No need to persist this tour. @@ -93,7 +93,7 @@ class role_filter_test extends \advanced_testcase { /** * Test the filter_matches function when one role is set. */ - public function test_filter_matches_single_role() { + public function test_filter_matches_single_role(): void { $context = \context_course::instance($this->course->id); $roles = [ @@ -122,7 +122,7 @@ class role_filter_test extends \advanced_testcase { /** * Test the filter_matches function when multiple roles are set. */ - public function test_filter_matches_multiple_role() { + public function test_filter_matches_multiple_role(): void { $context = \context_course::instance($this->course->id); $roles = [ @@ -152,7 +152,7 @@ class role_filter_test extends \advanced_testcase { /** * Test the filter_matches function when one user has multiple roles. */ - public function test_filter_matches_multiple_role_one_user() { + public function test_filter_matches_multiple_role_one_user(): void { $context = \context_course::instance($this->course->id); $roles = [ @@ -184,7 +184,7 @@ class role_filter_test extends \advanced_testcase { /** * Test the filter_matches function when it is targetted at an admin. */ - public function test_filter_matches_multiple_role_only_admin() { + public function test_filter_matches_multiple_role_only_admin(): void { $context = \context_course::instance($this->course->id); $roles = [ @@ -212,7 +212,7 @@ class role_filter_test extends \advanced_testcase { /** * Test the filter_matches function when multiple roles are set, including an admin user. */ - public function test_filter_matches_multiple_role_including_admin() { + public function test_filter_matches_multiple_role_including_admin(): void { $context = \context_course::instance($this->course->id); $roles = [ @@ -243,7 +243,7 @@ class role_filter_test extends \advanced_testcase { /** * Test the filter_matches function when an admin user has multiple roles. */ - public function test_filter_matches_multiple_role_admin_user() { + public function test_filter_matches_multiple_role_admin_user(): void { global $USER; $context = \context_course::instance($this->course->id); @@ -266,7 +266,7 @@ class role_filter_test extends \advanced_testcase { /** * Test that the get_filter_options function does not include the guest roles. */ - public function test_get_filter_options_no_guest_roles() { + public function test_get_filter_options_no_guest_roles(): void { create_role('Test Role', 'testrole', 'This is a test role', 'guest'); $allroles = role_get_names(null, ROLENAME_ALIAS); diff --git a/admin/tool/usertours/tests/step_test.php b/admin/tool/usertours/tests/step_test.php index 434908e01d5..5d5e6a7c736 100644 --- a/admin/tool/usertours/tests/step_test.php +++ b/admin/tool/usertours/tests/step_test.php @@ -27,9 +27,9 @@ require_once($CFG->libdir . '/formslib.php'); * @package tool_usertours * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \tool_usertours\step */ class step_test extends \advanced_testcase { - /** * @var moodle_database */ @@ -62,8 +62,7 @@ class step_test extends \advanced_testcase { global $DB; $DB = $this->getMockBuilder('moodle_database') - ->getMock() - ; + ->getMock(); return $DB; } @@ -73,60 +72,58 @@ class step_test extends \advanced_testcase { * * @return array */ - public function dirty_value_provider() { - return [ + public static function dirty_value_provider(): array { + return + [ 'tourid' => [ - 'tourid', - [1], - ], + 'tourid', + [1], + ], 'title' => [ - 'title', - ['Lorem'], - ], + 'title', + ['Lorem'], + ], 'content' => [ - 'content', - ['Lorem'], - ], + 'content', + ['Lorem'], + ], 'targettype' => [ - 'targettype', - ['Lorem'], - ], + 'targettype', + ['Lorem'], + ], 'targetvalue' => [ - 'targetvalue', - ['Lorem'], - ], + 'targetvalue', + ['Lorem'], + ], 'sortorder' => [ - 'sortorder', - [1], - ], + 'sortorder', + [1], + ], 'config' => [ - 'config', - ['key', 'value'], - ], + 'config', + ['key', 'value'], + ], ]; } /** * Test the fetch function. */ - public function test_fetch() { + public function test_fetch(): void { $step = $this->getMockBuilder(\tool_usertours\step::class) ->onlyMethods(['reload_from_record']) - ->getMock() - ; + ->getMock(); $idretval = rand(1, 100); $DB = $this->mock_database(); $DB->method('get_record') - ->willReturn($idretval) - ; + ->willReturn($idretval); $retval = rand(1, 100); $step->expects($this->once()) ->method('reload_from_record') ->with($this->equalTo($idretval)) - ->wilLReturn($retval) - ; + ->wilLReturn($retval); $rc = new \ReflectionClass(\tool_usertours\step::class); $rcm = $rc->getMethod('fetch'); @@ -143,7 +140,7 @@ class step_test extends \advanced_testcase { * @param string $name The key to update * @param string $value The value to set */ - public function test_dirty_values($name, $value) { + public function test_dirty_values($name, $value): void { $step = new \tool_usertours\step(); $method = 'set_' . $name; call_user_func_array([$step, $method], $value); @@ -160,12 +157,12 @@ class step_test extends \advanced_testcase { * * @return array */ - public function step_sortorder_provider() { + public static function step_sortorder_provider(): array { return [ - [0, 5, true, false], - [1, 5, false, false], - [4, 5, false, true], - ]; + [0, 5, true, false], + [1, 5, false, false], + [4, 5, false, true], + ]; } /** @@ -177,15 +174,14 @@ class step_test extends \advanced_testcase { * @param bool $isfirst Whether this is the first step * @param bool $islast Whether this is the last step */ - public function test_is_first_step($sortorder, $count, $isfirst, $islast) { + public function test_is_first_step($sortorder, $count, $isfirst, $islast): void { $step = $this->getMockBuilder(\tool_usertours\step::class) ->onlyMethods(['get_sortorder']) ->getMock(); $step->expects($this->once()) ->method('get_sortorder') - ->willReturn($sortorder) - ; + ->willReturn($sortorder); $this->assertEquals($isfirst, $step->is_first_step()); } @@ -199,7 +195,7 @@ class step_test extends \advanced_testcase { * @param bool $isfirst Whether this is the first step * @param bool $islast Whether this is the last step */ - public function test_is_last_step($sortorder, $count, $isfirst, $islast) { + public function test_is_last_step($sortorder, $count, $isfirst, $islast): void { $step = $this->getMockBuilder(\tool_usertours\step::class) ->onlyMethods(['get_sortorder', 'get_tour']) ->getMock(); @@ -210,18 +206,15 @@ class step_test extends \advanced_testcase { $step->expects($this->once()) ->method('get_tour') - ->willReturn($tour) - ; + ->willReturn($tour); $tour->expects($this->once()) ->method('count_steps') - ->willReturn($count) - ; + ->willReturn($count); $step->expects($this->once()) ->method('get_sortorder') - ->willReturn($sortorder) - ; + ->willReturn($sortorder); $this->assertEquals($islast, $step->is_last_step()); } @@ -229,7 +222,7 @@ class step_test extends \advanced_testcase { /** * Test get_config with no keys provided. */ - public function test_get_config_no_keys() { + public function test_get_config_no_keys(): void { $step = new \tool_usertours\step(); $rc = new \ReflectionClass(\tool_usertours\step::class); @@ -237,12 +230,12 @@ class step_test extends \advanced_testcase { $rcp->setAccessible(true); $allvalues = (object) [ - 'some' => 'value', - 'another' => 42, - 'key' => [ - 'somethingelse', - ], - ]; + 'some' => 'value', + 'another' => 42, + 'key' => [ + 'somethingelse', + ], + ]; $rcp->setValue($step, $allvalues); @@ -254,92 +247,92 @@ class step_test extends \advanced_testcase { * * @return array */ - public function get_config_provider() { + public static function get_config_provider(): array { $allvalues = (object) [ - 'some' => 'value', - 'another' => 42, - 'key' => [ - 'somethingelse', - ], - ]; + 'some' => 'value', + 'another' => 42, + 'key' => [ + 'somethingelse', + ], + ]; $tourconfig = rand(1, 100); $forcedconfig = rand(1, 100); return [ - 'No initial config' => [ - null, - null, - null, - $tourconfig, - false, - $forcedconfig, - (object) [], - ], - 'All values' => [ - $allvalues, - null, - null, - $tourconfig, - false, - $forcedconfig, - $allvalues, - ], - 'Valid string value' => [ - $allvalues, - 'some', - null, - $tourconfig, - false, - $forcedconfig, - 'value', - ], - 'Valid array value' => [ - $allvalues, - 'key', - null, - $tourconfig, - false, - $forcedconfig, - ['somethingelse'], - ], - 'Invalid value' => [ - $allvalues, - 'notavalue', - null, - $tourconfig, - false, - $forcedconfig, - $tourconfig, - ], - 'Configuration value' => [ - $allvalues, - 'placement', - null, - $tourconfig, - false, - $forcedconfig, - $tourconfig, - ], - 'Invalid value with default' => [ - $allvalues, - 'notavalue', - 'somedefault', - $tourconfig, - false, - $forcedconfig, - 'somedefault', - ], - 'Value forced at target' => [ - $allvalues, - 'somevalue', - 'somedefault', - $tourconfig, - true, - $forcedconfig, - $forcedconfig, - ], - ]; + 'No initial config' => [ + null, + null, + null, + $tourconfig, + false, + $forcedconfig, + (object) [], + ], + 'All values' => [ + $allvalues, + null, + null, + $tourconfig, + false, + $forcedconfig, + $allvalues, + ], + 'Valid string value' => [ + $allvalues, + 'some', + null, + $tourconfig, + false, + $forcedconfig, + 'value', + ], + 'Valid array value' => [ + $allvalues, + 'key', + null, + $tourconfig, + false, + $forcedconfig, + ['somethingelse'], + ], + 'Invalid value' => [ + $allvalues, + 'notavalue', + null, + $tourconfig, + false, + $forcedconfig, + $tourconfig, + ], + 'Configuration value' => [ + $allvalues, + 'placement', + null, + $tourconfig, + false, + $forcedconfig, + $tourconfig, + ], + 'Invalid value with default' => [ + $allvalues, + 'notavalue', + 'somedefault', + $tourconfig, + false, + $forcedconfig, + 'somedefault', + ], + 'Value forced at target' => [ + $allvalues, + 'somevalue', + 'somedefault', + $tourconfig, + true, + $forcedconfig, + $forcedconfig, + ], + ]; } /** @@ -354,7 +347,7 @@ class step_test extends \advanced_testcase { * @param mixed $forcedvalue The example value * @param mixed $expected The expected value */ - public function test_get_config_valid_keys($values, $key, $default, $tourconfig, $isforced, $forcedvalue, $expected) { + public function test_get_config_valid_keys($values, $key, $default, $tourconfig, $isforced, $forcedvalue, $expected): void { $step = $this->getMockBuilder(\tool_usertours\step::class) ->onlyMethods(['get_target', 'get_targettype', 'get_tour']) ->getMock(); @@ -366,43 +359,35 @@ class step_test extends \advanced_testcase { $target = $this->getMockBuilder(\tool_usertours\local\target\base::class) ->disableOriginalConstructor() - ->getMock() - ; + ->getMock(); $target->expects($this->any()) ->method('is_setting_forced') - ->willReturn($isforced) - ; + ->willReturn($isforced); $target->expects($this->any()) ->method('get_forced_setting_value') ->with($this->equalTo($key)) - ->willReturn($forcedvalue) - ; + ->willReturn($forcedvalue); $step->expects($this->any()) ->method('get_targettype') - ->willReturn('type') - ; + ->willReturn('type'); $step->expects($this->any()) ->method('get_target') - ->willReturn($target) - ; + ->willReturn($target); $tour = $this->getMockBuilder(\tool_usertours\tour::class) - ->getMock() - ; + ->getMock(); $tour->expects($this->any()) ->method('get_config') - ->willReturn($tourconfig) - ; + ->willReturn($tourconfig); $step->expects($this->any()) ->method('get_tour') - ->willReturn($tour) - ; + ->willReturn($tour); $this->assertEquals($expected, $step->get_config($key, $default)); } @@ -410,14 +395,14 @@ class step_test extends \advanced_testcase { /** * Data provider for set_config. */ - public function set_config_provider() { + public static function set_config_provider(): array { $allvalues = (object) [ - 'some' => 'value', - 'another' => 42, - 'key' => [ - 'somethingelse', - ], - ]; + 'some' => 'value', + 'another' => 42, + 'key' => [ + 'somethingelse', + ], + ]; $randvalue = rand(1, 100); @@ -426,27 +411,27 @@ class step_test extends \advanced_testcase { $newvalues = $allvalues; $newvalues->some = 'unset'; $provider['Unset an existing value'] = [ - $allvalues, - 'some', - null, - $newvalues, - ]; + $allvalues, + 'some', + null, + $newvalues, + ]; $newvalues = $allvalues; $newvalues->some = $randvalue; $provider['Set an existing value'] = [ - $allvalues, - 'some', - $randvalue, - $newvalues, - ]; + $allvalues, + 'some', + $randvalue, + $newvalues, + ]; $provider['Set a new value'] = [ - $allvalues, - 'newkey', - $randvalue, - (object) array_merge((array) $allvalues, ['newkey' => $randvalue]), - ]; + $allvalues, + 'newkey', + $randvalue, + (object) array_merge((array) $allvalues, ['newkey' => $randvalue]), + ]; return $provider; } @@ -460,7 +445,7 @@ class step_test extends \advanced_testcase { * @param mixed $newvalue The new value to set * @param mixed $expected The expected value */ - public function test_set_config($initialvalues, $key, $newvalue, $expected) { + public function test_set_config($initialvalues, $key, $newvalue, $expected): void { $step = new \tool_usertours\step(); $rc = new \ReflectionClass(\tool_usertours\step::class); @@ -470,13 +455,11 @@ class step_test extends \advanced_testcase { $target = $this->getMockBuilder(\tool_usertours\local\target\base::class) ->disableOriginalConstructor() - ->getMock() - ; + ->getMock(); $target->expects($this->any()) ->method('is_setting_forced') - ->willReturn(false) - ; + ->willReturn(false); $step->set_config($key, $newvalue); @@ -486,22 +469,19 @@ class step_test extends \advanced_testcase { /** * Ensure that non-dirty tours are not persisted. */ - public function test_persist_non_dirty() { + public function test_persist_non_dirty(): void { $step = $this->getMockBuilder(\tool_usertours\step::class) ->onlyMethods([ - 'to_record', - 'reload', - ]) - ->getMock() - ; + 'to_record', + 'reload', + ]) + ->getMock(); $step->expects($this->never()) - ->method('to_record') - ; + ->method('to_record'); $step->expects($this->never()) - ->method('reload') - ; + ->method('reload'); $this->assertSame($step, $step->persist()); } @@ -509,36 +489,31 @@ class step_test extends \advanced_testcase { /** * Ensure that new dirty steps are persisted. */ - public function test_persist_dirty_new() { + public function test_persist_dirty_new(): void { // Mock the database. $DB = $this->mock_database(); $DB->expects($this->once()) ->method('insert_record') - ->willReturn(42) - ; + ->willReturn(42); // Mock the tour. $step = $this->getMockBuilder(\tool_usertours\step::class) ->onlyMethods([ - 'to_record', - 'calculate_sortorder', - 'reload', - ]) - ->getMock() - ; + 'to_record', + 'calculate_sortorder', + 'reload', + ]) + ->getMock(); $step->expects($this->once()) ->method('to_record') ->willReturn((object)['id' => 42]); - ; $step->expects($this->once()) - ->method('calculate_sortorder') - ; + ->method('calculate_sortorder'); $step->expects($this->once()) - ->method('reload') - ; + ->method('reload'); $rc = new \ReflectionClass(\tool_usertours\step::class); $rcp = $rc->getProperty('dirty'); @@ -556,38 +531,33 @@ class step_test extends \advanced_testcase { /** * Ensure that new non-dirty, forced steps are persisted. */ - public function test_persist_force_new() { + public function test_persist_force_new(): void { global $DB; // Mock the database. $DB = $this->mock_database(); $DB->expects($this->once()) ->method('insert_record') - ->willReturn(42) - ; + ->willReturn(42); // Mock the tour. $step = $this->getMockBuilder(\tool_usertours\step::class) ->onlyMethods([ - 'to_record', - 'calculate_sortorder', - 'reload', - ]) - ->getMock() - ; + 'to_record', + 'calculate_sortorder', + 'reload', + ]) + ->getMock(); $step->expects($this->once()) ->method('to_record') ->willReturn((object)['id' => 42]); - ; $step->expects($this->once()) - ->method('calculate_sortorder') - ; + ->method('calculate_sortorder'); $step->expects($this->once()) - ->method('reload') - ; + ->method('reload'); $tour = $this->createMock(\tool_usertours\tour::class); $rc = new \ReflectionClass(\tool_usertours\step::class); @@ -601,35 +571,30 @@ class step_test extends \advanced_testcase { /** * Ensure that existing dirty steps are persisted. */ - public function test_persist_dirty_existing() { + public function test_persist_dirty_existing(): void { // Mock the database. $DB = $this->mock_database(); $DB->expects($this->once()) - ->method('update_record') - ; + ->method('update_record'); // Mock the tour. $step = $this->getMockBuilder(\tool_usertours\step::class) ->onlyMethods([ - 'to_record', - 'calculate_sortorder', - 'reload', - ]) - ->getMock() - ; + 'to_record', + 'calculate_sortorder', + 'reload', + ]) + ->getMock(); $step->expects($this->once()) ->method('to_record') ->willReturn((object)['id' => 42]); - ; $step->expects($this->never()) - ->method('calculate_sortorder') - ; + ->method('calculate_sortorder'); $step->expects($this->once()) - ->method('reload') - ; + ->method('reload'); $rc = new \ReflectionClass(\tool_usertours\step::class); $rcp = $rc->getProperty('id'); @@ -651,37 +616,32 @@ class step_test extends \advanced_testcase { /** * Ensure that existing non-dirty, forced steps are persisted. */ - public function test_persist_force_existing() { + public function test_persist_force_existing(): void { global $DB; // Mock the database. $DB = $this->mock_database(); $DB->expects($this->once()) - ->method('update_record') - ; + ->method('update_record'); // Mock the tour. $step = $this->getMockBuilder(\tool_usertours\step::class) ->onlyMethods([ - 'to_record', - 'calculate_sortorder', - 'reload', - ]) - ->getMock() - ; + 'to_record', + 'calculate_sortorder', + 'reload', + ]) + ->getMock(); $step->expects($this->once()) ->method('to_record') - ->willReturn((object)['id' => 42]); - ; + ->willReturn((object) ['id' => 42]); $step->expects($this->never()) - ->method('calculate_sortorder') - ; + ->method('calculate_sortorder'); $step->expects($this->once()) - ->method('reload') - ; + ->method('reload'); $rc = new \ReflectionClass(\tool_usertours\step::class); $rcp = $rc->getProperty('id'); @@ -699,17 +659,15 @@ class step_test extends \advanced_testcase { /** * Check that a tour which has never been persisted is removed correctly. */ - public function test_remove_non_persisted() { + public function test_remove_non_persisted(): void { $step = $this->getMockBuilder(\tool_usertours\step::class) ->onlyMethods([]) - ->getMock() - ; + ->getMock(); // Mock the database. $DB = $this->mock_database(); $DB->expects($this->never()) - ->method('delete_records') - ; + ->method('delete_records'); $this->assertNull($step->remove()); } @@ -717,38 +675,33 @@ class step_test extends \advanced_testcase { /** * Check that a tour which has been persisted is removed correctly. */ - public function test_remove_persisted() { + public function test_remove_persisted(): void { $id = rand(1, 100); $tour = $this->getMockBuilder(\tool_usertours\tour::class) ->onlyMethods([ - 'reset_step_sortorder', - ]) - ->getMock() - ; + 'reset_step_sortorder', + ]) + ->getMock(); $tour->expects($this->once()) - ->method('reset_step_sortorder') - ; + ->method('reset_step_sortorder'); $step = $this->getMockBuilder(\tool_usertours\step::class) ->onlyMethods([ - 'get_tour', - ]) - ->getMock() - ; + 'get_tour', + ]) + ->getMock(); $step->expects($this->once()) ->method('get_tour') - ->willReturn($tour) - ; + ->willReturn($tour); // Mock the database. $DB = $this->mock_database(); $DB->expects($this->once()) ->method('delete_records') - ->with($this->equalTo('tool_usertours_steps'), $this->equalTo(['id' => $id])) - ; + ->with($this->equalTo('tool_usertours_steps'), $this->equalTo(['id' => $id])); $rc = new \ReflectionClass(\tool_usertours\step::class); $rcp = $rc->getProperty('id'); @@ -764,37 +717,37 @@ class step_test extends \advanced_testcase { * * @return array */ - public function getter_provider() { + public static function getter_provider(): array { return [ - 'id' => [ - 'id', - rand(1, 100), - ], - 'tourid' => [ - 'tourid', - rand(1, 100), - ], - 'title' => [ - 'title', - 'Lorem', - ], - 'content' => [ - 'content', - 'Lorem', - ], - 'targettype' => [ - 'targettype', - 'Lorem', - ], - 'targetvalue' => [ - 'targetvalue', - 'Lorem', - ], - 'sortorder' => [ - 'sortorder', - rand(1, 100), - ], - ]; + 'id' => [ + 'id', + rand(1, 100), + ], + 'tourid' => [ + 'tourid', + rand(1, 100), + ], + 'title' => [ + 'title', + 'Lorem', + ], + 'content' => [ + 'content', + 'Lorem', + ], + 'targettype' => [ + 'targettype', + 'Lorem', + ], + 'targetvalue' => [ + 'targetvalue', + 'Lorem', + ], + 'sortorder' => [ + 'sortorder', + rand(1, 100), + ], + ]; } /** @@ -804,7 +757,7 @@ class step_test extends \advanced_testcase { * @param string $key The key to test * @param mixed $value The expected value */ - public function test_getters($key, $value) { + public function test_getters($key, $value): void { $step = new \tool_usertours\step(); $rc = new \ReflectionClass(\tool_usertours\step::class); @@ -821,7 +774,7 @@ class step_test extends \advanced_testcase { /** * Ensure that the get_step_image_from_input function replace PIXICON placeholder with the correct images correctly. */ - public function test_get_step_image_from_input() { + public function test_get_step_image_from_input(): void { // Test step content with single image. $stepcontent = '@@PIXICON::tour/tour_mycourses::tool_usertours@@
Test'; $stepcontent = \tool_usertours\step::get_step_image_from_input($stepcontent); @@ -832,7 +785,8 @@ class step_test extends \advanced_testcase { $this->assertStringNotContainsString('PIXICON', $stepcontent); // Test step content with multiple images. - $stepcontent = '@@PIXICON::tour/tour_mycourses::tool_usertours@@
Test
@@PIXICON::tour/tour_myhomepage::tool_usertours@@'; + $stepcontent = + '@@PIXICON::tour/tour_mycourses::tool_usertours@@
Test
@@PIXICON::tour/tour_myhomepage::tool_usertours@@'; $stepcontent = \tool_usertours\step::get_step_image_from_input($stepcontent); // If the format is correct, PIXICON placeholder will be replaced with the img tag. $this->assertStringStartsWith(' * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \tool_usertours\local\filter\theme */ class theme_filter_test extends \advanced_testcase { - /** * Data Provider for filter_matches function. * * @return array */ - public function filter_matches_provider() { + public static function filter_matches_provider(): array { return [ 'No config set; Matches' => [ null, @@ -73,7 +73,7 @@ class theme_filter_test extends \advanced_testcase { * @param string $currenttheme The name of the current theme * @param boolean $expected Whether the tour is expected to match */ - public function test_filter_matches($filtervalues, $currenttheme, $expected) { + public function test_filter_matches($filtervalues, $currenttheme, $expected): void { global $PAGE; $filtername = \tool_usertours\local\filter\theme::class; diff --git a/admin/tool/usertours/tests/tour_test.php b/admin/tool/usertours/tests/tour_test.php index f7955dd94e4..ab8ba1ded7f 100644 --- a/admin/tool/usertours/tests/tour_test.php +++ b/admin/tool/usertours/tests/tour_test.php @@ -16,25 +16,25 @@ namespace tool_usertours; -defined('MOODLE_INTERNAL') || die(); - -global $CFG; -require_once($CFG->libdir . '/formslib.php'); - /** * Tests for tour. * * @package tool_usertours * @copyright 2016 Andrew Nicols - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \tool_usertours\tour */ class tour_test extends \advanced_testcase { - /** * @var moodle_database */ protected $db; + public static function setUpBeforeClass(): void { + global $CFG; + require_once($CFG->libdir . '/formslib.php'); + } + /** * Setup to store the DB reference. */ @@ -62,8 +62,7 @@ class tour_test extends \advanced_testcase { global $DB; $DB = $this->getMockBuilder(\moodle_database::class) - ->getMock() - ; + ->getMock(); return $DB; } @@ -73,33 +72,33 @@ class tour_test extends \advanced_testcase { * * @return array */ - public function dirty_value_provider() { + public static function dirty_value_provider(): array { return [ - 'name' => [ - 'name', - ['Lorem'], - ], - 'description' => [ - 'description', - ['Lorem'], - ], - 'pathmatch' => [ - 'pathmatch', - ['Lorem'], - ], - 'enabled' => [ - 'enabled', - ['Lorem'], - ], - 'sortorder' => [ - 'sortorder', - [1], - ], - 'config' => [ - 'config', - ['key', 'value'], - ], - ]; + 'name' => [ + 'name', + ['Lorem'], + ], + 'description' => [ + 'description', + ['Lorem'], + ], + 'pathmatch' => [ + 'pathmatch', + ['Lorem'], + ], + 'enabled' => [ + 'enabled', + ['Lorem'], + ], + 'sortorder' => [ + 'sortorder', + [1], + ], + 'config' => [ + 'config', + ['key', 'value'], + ], + ]; } /** @@ -109,7 +108,7 @@ class tour_test extends \advanced_testcase { * @param string $name The name of the key being tested * @param mixed $value The value being set */ - public function test_dirty_values($name, $value) { + public function test_dirty_values($name, $value): void { $tour = new \tool_usertours\tour(); $method = 'set_' . $name; call_user_func_array([$tour, $method], $value); @@ -126,37 +125,37 @@ class tour_test extends \advanced_testcase { * * @return array */ - public function getter_provider() { + public static function getter_provider(): array { return [ - 'id' => [ - 'id', - rand(1, 100), - ], - 'name' => [ - 'name', - 'Lorem', - ], - 'description' => [ - 'description', - 'Lorem', - ], - 'pathmatch' => [ - 'pathmatch', - 'Lorem', - ], - 'enabled' => [ - 'enabled', - 'Lorem', - ], - 'sortorder' => [ - 'sortorder', - rand(1, 100), - ], - 'config' => [ - 'config', - ['key', 'value'], - ], - ]; + 'id' => [ + 'id', + rand(1, 100), + ], + 'name' => [ + 'name', + 'Lorem', + ], + 'description' => [ + 'description', + 'Lorem', + ], + 'pathmatch' => [ + 'pathmatch', + 'Lorem', + ], + 'enabled' => [ + 'enabled', + 'Lorem', + ], + 'sortorder' => [ + 'sortorder', + rand(1, 100), + ], + 'config' => [ + 'config', + ['key', 'value'], + ], + ]; } /** @@ -166,7 +165,7 @@ class tour_test extends \advanced_testcase { * @param string $key The name of the key being tested * @param mixed $value The value being set */ - public function test_getters($key, $value) { + public function test_getters($key, $value): void { $tour = new \tool_usertours\tour(); $rc = new \ReflectionClass(tour::class); @@ -183,15 +182,13 @@ class tour_test extends \advanced_testcase { /** * Ensure that non-dirty tours are not persisted. */ - public function test_persist_non_dirty() { + public function test_persist_non_dirty(): void { $tour = $this->getMockBuilder(tour::class) ->onlyMethods(['to_record']) - ->getMock() - ; + ->getMock(); $tour->expects($this->never()) - ->method('to_record') - ; + ->method('to_record'); $this->assertSame($tour, $tour->persist()); } @@ -199,36 +196,31 @@ class tour_test extends \advanced_testcase { /** * Ensure that new dirty tours are persisted. */ - public function test_persist_dirty_new() { + public function test_persist_dirty_new(): void { // Mock the database. $DB = $this->mock_database(); $DB->expects($this->never()) - ->method('update_record') - ; + ->method('update_record'); $id = rand(1, 100); $DB->expects($this->once()) ->method('insert_record') - ->willReturn($id) - ; + ->willReturn($id); // Mock the tour. $tour = $this->getMockBuilder(tour::class) ->onlyMethods([ - 'to_record', - 'reload', - ]) - ->getMock() - ; + 'to_record', + 'reload', + ]) + ->getMock(); $tour->expects($this->once()) - ->method('to_record') - ; + ->method('to_record'); $tour->expects($this->once()) - ->method('reload') - ; + ->method('reload'); $rc = new \ReflectionClass(tour::class); @@ -246,38 +238,33 @@ class tour_test extends \advanced_testcase { /** * Ensure that non-dirty, forced tours are persisted. */ - public function test_persist_force_new() { + public function test_persist_force_new(): void { global $DB; // Mock the database. $DB = $this->mock_database(); $DB->expects($this->never()) - ->method('update_record') - ; + ->method('update_record'); $id = rand(1, 100); $DB->expects($this->once()) ->method('insert_record') - ->willReturn($id) - ; + ->willReturn($id); // Mock the tour. $tour = $this->getMockBuilder(tour::class) ->onlyMethods([ - 'to_record', - 'reload', - ]) - ->getMock() - ; + 'to_record', + 'reload', + ]) + ->getMock(); $tour->expects($this->once()) - ->method('to_record') - ; + ->method('to_record'); $tour->expects($this->once()) - ->method('reload') - ; + ->method('reload'); $this->assertSame($tour, $tour->persist(true)); @@ -290,34 +277,29 @@ class tour_test extends \advanced_testcase { /** * Ensure that dirty tours are persisted. */ - public function test_persist_dirty_existing() { + public function test_persist_dirty_existing(): void { // Mock the database. $DB = $this->mock_database(); $DB->expects($this->once()) ->method('update_record') - ->willReturn($this->returnSelf()) - ; + ->willReturn($this->returnSelf()); $DB->expects($this->never()) - ->method('insert_record') - ; + ->method('insert_record'); // Mock the tour. $tour = $this->getMockBuilder(tour::class) ->onlyMethods([ - 'to_record', - 'reload', - ]) - ->getMock() - ; + 'to_record', + 'reload', + ]) + ->getMock(); $tour->expects($this->once()) - ->method('to_record') - ; + ->method('to_record'); $tour->expects($this->once()) - ->method('reload') - ; + ->method('reload'); $rc = new \ReflectionClass(tour::class); @@ -335,7 +317,7 @@ class tour_test extends \advanced_testcase { /** * Ensure that non-dirty, forced tours are persisted. */ - public function test_persist_force() { + public function test_persist_force(): void { global $DB; // Mock the database. @@ -343,29 +325,24 @@ class tour_test extends \advanced_testcase { $DB->expects($this->once()) ->method('update_record') - ->willReturn($this->returnSelf()) - ; + ->willReturn($this->returnSelf()); $DB->expects($this->never()) - ->method('insert_record') - ; + ->method('insert_record'); // Mock the tour. $tour = $this->getMockBuilder(tour::class) ->onlyMethods([ - 'to_record', - 'reload', - ]) - ->getMock() - ; + 'to_record', + 'reload', + ]) + ->getMock(); $tour->expects($this->once()) - ->method('to_record') - ; + ->method('to_record'); $tour->expects($this->once()) - ->method('reload') - ; + ->method('reload'); $rc = new \ReflectionClass(tour::class); @@ -383,29 +360,29 @@ class tour_test extends \advanced_testcase { /** * Test setting config. */ - public function test_set_config() { + public function test_set_config(): void { $tour = new \tool_usertours\tour(); $tour->set_config('key', 'value'); $tour->set_config('another', [ - 'foo' => 'bar', - ]); + 'foo' => 'bar', + ]); $rc = new \ReflectionClass(tour::class); $rcp = $rc->getProperty('config'); $rcp->setAccessible(true); $this->assertEquals((object) [ - 'key' => 'value', - 'another' => [ - 'foo' => 'bar', - ], - ], $rcp->getValue($tour)); + 'key' => 'value', + 'another' => [ + 'foo' => 'bar', + ], + ], $rcp->getValue($tour)); } /** * Test get_config with no keys provided. */ - public function test_get_config_no_keys() { + public function test_get_config_no_keys(): void { $tour = new \tool_usertours\tour(); $rc = new \ReflectionClass(tour::class); @@ -413,12 +390,12 @@ class tour_test extends \advanced_testcase { $rcp->setAccessible(true); $allvalues = (object) [ - 'some' => 'value', - 'another' => 42, - 'key' => [ - 'somethingelse', - ], - ]; + 'some' => 'value', + 'another' => 42, + 'key' => [ + 'somethingelse', + ], + ]; $rcp->setValue($tour, $allvalues); @@ -430,59 +407,59 @@ class tour_test extends \advanced_testcase { * * @return array */ - public function get_config_provider() { + public static function get_config_provider(): array { $allvalues = (object) [ - 'some' => 'value', - 'another' => 42, - 'key' => [ - 'somethingelse', - ], - ]; + 'some' => 'value', + 'another' => 42, + 'key' => [ + 'somethingelse', + ], + ]; return [ - 'No nitial config' => [ - null, - null, - null, - (object) [], - ], - 'All values' => [ - $allvalues, - null, - null, - $allvalues, - ], - 'Valid string value' => [ - $allvalues, - 'some', - null, - 'value', - ], - 'Valid array value' => [ - $allvalues, - 'key', - null, - ['somethingelse'], - ], - 'Invalid value' => [ - $allvalues, - 'notavalue', - null, - null, - ], - 'Configuration value' => [ - $allvalues, - 'placement', - null, - \tool_usertours\configuration::get_default_value('placement'), - ], - 'Invalid value with default' => [ - $allvalues, - 'notavalue', - 'somedefault', - 'somedefault', - ], - ]; + 'No nitial config' => [ + null, + null, + null, + (object) [], + ], + 'All values' => [ + $allvalues, + null, + null, + $allvalues, + ], + 'Valid string value' => [ + $allvalues, + 'some', + null, + 'value', + ], + 'Valid array value' => [ + $allvalues, + 'key', + null, + ['somethingelse'], + ], + 'Invalid value' => [ + $allvalues, + 'notavalue', + null, + null, + ], + 'Configuration value' => [ + $allvalues, + 'placement', + null, + \tool_usertours\configuration::get_default_value('placement'), + ], + 'Invalid value with default' => [ + $allvalues, + 'notavalue', + 'somedefault', + 'somedefault', + ], + ]; } /** @@ -494,7 +471,7 @@ class tour_test extends \advanced_testcase { * @param mixed $default The default value * @param mixed $expected The expected value */ - public function test_get_config_valid_keys($values, $key, $default, $expected) { + public function test_get_config_valid_keys($values, $key, $default, $expected): void { $tour = new \tool_usertours\tour(); $rc = new \ReflectionClass(tour::class); @@ -508,23 +485,20 @@ class tour_test extends \advanced_testcase { /** * Check that a tour which has never been persisted is removed correctly. */ - public function test_remove_non_persisted() { + public function test_remove_non_persisted(): void { $tour = $this->getMockBuilder(tour::class) ->onlyMethods([ - 'get_steps', - ]) - ->getMock() - ; + 'get_steps', + ]) + ->getMock(); $tour->expects($this->never()) - ->method('get_steps') - ; + ->method('get_steps'); // Mock the database. $DB = $this->mock_database(); $DB->expects($this->never()) - ->method('delete_records') - ; + ->method('delete_records'); $this->assertNull($tour->remove()); } @@ -532,15 +506,14 @@ class tour_test extends \advanced_testcase { /** * Check that a tour which has been persisted is removed correctly. */ - public function test_remove_persisted() { + public function test_remove_persisted(): void { $id = rand(1, 100); $tour = $this->getMockBuilder(tour::class) ->onlyMethods([ - 'get_steps', - ]) - ->getMock() - ; + 'get_steps', + ]) + ->getMock(); $rc = new \ReflectionClass(tour::class); $rcp = $rc->getProperty('id'); @@ -549,15 +522,13 @@ class tour_test extends \advanced_testcase { $step = $this->getMockBuilder(\tool_usertours\step::class) ->onlyMethods([ - 'remove', - ]) - ->getMock() - ; + 'remove', + ]) + ->getMock(); $tour->expects($this->once()) ->method('get_steps') - ->willReturn([$step]) - ; + ->willReturn([$step]); // Mock the database. $DB = $this->mock_database(); @@ -569,14 +540,12 @@ class tour_test extends \advanced_testcase { [$this->equalTo('user_preferences'), $this->equalTo(['name' => tour::TOUR_LAST_COMPLETED_BY_USER . $id])], [$this->equalTo('user_preferences'), $this->equalTo(['name' => tour::TOUR_REQUESTED_BY_USER . $id])] ) - ->willReturn(null) - ; + ->willReturn(null); $DB->expects($this->once()) ->method('get_records') ->with($this->equalTo('tool_usertours_tours'), $this->equalTo(null)) - ->willReturn([]) - ; + ->willReturn([]); $this->assertNull($tour->remove()); } @@ -584,7 +553,7 @@ class tour_test extends \advanced_testcase { /** * Teset that sortorder is reset according to sortorder with values from 0. */ - public function test_reset_step_sortorder() { + public function test_reset_step_sortorder(): void { $tour = new \tool_usertours\tour(); $mockdata = []; @@ -598,12 +567,10 @@ class tour_test extends \advanced_testcase { $DB = $this->mock_database(); $DB->expects($this->once()) ->method('get_records') - ->willReturn($mockdata) - ; + ->willReturn($mockdata); $setfield = $DB->expects($this->exactly(5)) - ->method('set_field') - ; + ->method('set_field'); call_user_func_array([$setfield, 'withConsecutive'], $expectations); $tour->reset_step_sortorder(); @@ -612,7 +579,7 @@ class tour_test extends \advanced_testcase { /** * Test that a disabled tour should never be shown to users. */ - public function test_should_show_for_user_disabled() { + public function test_should_show_for_user_disabled(): void { $tour = new \tool_usertours\tour(); $tour->set_enabled(false); @@ -624,40 +591,40 @@ class tour_test extends \advanced_testcase { * * @return array */ - public function should_show_for_user_provider() { + public static function should_show_for_user_provider(): array { $time = time(); return [ - 'Not seen by user at all' => [ - null, - null, - null, - true, - ], - 'Completed by user before majorupdatetime' => [ - $time - DAYSECS, - null, - $time, - true, - ], - 'Completed by user since majorupdatetime' => [ - $time, - null, - $time - DAYSECS, - false, - ], - 'Requested by user before current completion' => [ - $time, - $time - DAYSECS, - null, - false, - ], - 'Requested by user since completion' => [ - $time - DAYSECS, - $time, - null, - true, - ], - ]; + 'Not seen by user at all' => [ + null, + null, + null, + true, + ], + 'Completed by user before majorupdatetime' => [ + $time - DAYSECS, + null, + $time, + true, + ], + 'Completed by user since majorupdatetime' => [ + $time, + null, + $time - DAYSECS, + false, + ], + 'Requested by user before current completion' => [ + $time, + $time - DAYSECS, + null, + false, + ], + 'Requested by user since completion' => [ + $time - DAYSECS, + $time, + null, + true, + ], + ]; } /** @@ -669,28 +636,25 @@ class tour_test extends \advanced_testcase { * @param mixed $updateddate The date this tour was last updated * @param string $expectation The expected tour key */ - public function test_should_show_for_user($completiondate, $requesteddate, $updateddate, $expectation) { + public function test_should_show_for_user($completiondate, $requesteddate, $updateddate, $expectation): void { // Uses user preferences so we must be in a user context. $this->resetAfterTest(); $this->setAdminUser(); $tour = $this->getMockBuilder(tour::class) ->onlyMethods([ - 'get_id', - 'get_config', - 'is_enabled', - ]) - ->getMock() - ; + 'get_id', + 'get_config', + 'is_enabled', + ]) + ->getMock(); $tour->method('is_enabled') - ->willReturn(true) - ; + ->willReturn(true); $id = rand(1, 100); $tour->method('get_id') - ->willReturn($id) - ; + ->willReturn($id); if ($completiondate !== null) { set_user_preference(\tool_usertours\tour::TOUR_LAST_COMPLETED_BY_USER . $id, $completiondate); @@ -703,8 +667,7 @@ class tour_test extends \advanced_testcase { if ($updateddate !== null) { $tour->expects($this->once()) ->method('get_config') - ->willReturn($updateddate) - ; + ->willReturn($updateddate); } $this->assertEquals($expectation, $tour->should_show_for_user()); @@ -715,44 +678,47 @@ class tour_test extends \advanced_testcase { * * @return array */ - public function get_tour_key_provider() { + public static function get_tour_key_provider(): array { $id = rand(1, 100); $time = time(); return [ 'No initial values' => [ - $id, - [null, $time], - $this->greaterThanOrEqual($time), - true, - null, - sprintf('tool_usertours_\d_%d_%s', $id, $time), - ], + $id, + [null, $time], + static::logicalOr( + new \PHPUnit\Framework\Constraint\IsEqual($time), + new \PHPUnit\Framework\Constraint\GreaterThan($time), + ), + true, + null, + sprintf('tool_usertours_\d_%d_%s', $id, $time), + ], 'Initial tour time, no user pref' => [ - $id, - [$time], - null, - false, - null, - sprintf('tool_usertours_\d_%d_%s', $id, $time), - ], + $id, + [$time], + null, + false, + null, + sprintf('tool_usertours_\d_%d_%s', $id, $time), + ], 'Initial tour time, with user reset lower' => [ - $id, - [$time], - null, - false, - $time - DAYSECS, - sprintf('tool_usertours_\d_%d_%s', $id, $time), - ], + $id, + [$time], + null, + false, + $time - DAYSECS, + sprintf('tool_usertours_\d_%d_%s', $id, $time), + ], 'Initial tour time, with user reset higher' => [ - $id, - [$time], - null, - false, - $time + DAYSECS, - sprintf('tool_usertours_\d_%d_%s', $id, $time + DAYSECS), - ], + $id, + [$time], + null, + false, + $time + DAYSECS, + sprintf('tool_usertours_\d_%d_%s', $id, $time + DAYSECS), + ], ]; } @@ -767,83 +733,74 @@ class tour_test extends \advanced_testcase { * @param mixed $userpref The value to set for the user preference * @param string $expectation The expected tour key */ - public function test_get_tour_key($id, $getconfig, $setconfig, $willpersist, $userpref, $expectation) { + public function test_get_tour_key($id, $getconfig, $setconfig, $willpersist, $userpref, $expectation): void { // Uses user preferences so we must be in a user context. $this->resetAfterTest(); $this->setAdminUser(); $tour = $this->getMockBuilder(tour::class) ->onlyMethods([ - 'get_config', - 'set_config', - 'get_id', - 'persist', - ]) - ->getMock() - ; + 'get_config', + 'set_config', + 'get_id', + 'persist', + ]) + ->getMock(); if ($getconfig) { $tour->expects($this->exactly(count($getconfig))) ->method('get_config') - ->will(call_user_func_array([$this, 'onConsecutiveCalls'], $getconfig)) - ; + ->will(call_user_func_array([$this, 'onConsecutiveCalls'], $getconfig)); } if ($setconfig) { $tour->expects($this->once()) ->method('set_config') ->with($this->equalTo('majorupdatetime'), $setconfig) - ->will($this->returnSelf()) - ; + ->will($this->returnSelf()); } else { $tour->expects($this->never()) - ->method('set_config') - ; + ->method('set_config'); } if ($willpersist) { $tour->expects($this->once()) - ->method('persist') - ; + ->method('persist'); } else { $tour->expects($this->never()) - ->method('persist') - ; + ->method('persist'); } $tour->expects($this->any()) ->method('get_id') - ->willReturn($id) - ; + ->willReturn($id); if ($userpref !== null) { set_user_preference(\tool_usertours\tour::TOUR_REQUESTED_BY_USER . $id, $userpref); } $this->assertMatchesRegularExpression( - '/' . $expectation . '/', - $tour->get_tour_key() - ); + '/' . $expectation . '/', + $tour->get_tour_key() + ); } /** * Ensure that the request_user_reset function sets an appropriate value for the tour. */ - public function test_requested_user_reset() { + public function test_requested_user_reset(): void { $tour = $this->getMockBuilder(tour::class) ->onlyMethods([ - 'get_id', - ]) - ->getMock() - ; + 'get_id', + ]) + ->getMock(); $id = rand(1, 100); $time = time(); $tour->expects($this->once()) ->method('get_id') - ->willReturn($id) - ; + ->willReturn($id); $tour->request_user_reset(); @@ -853,21 +810,19 @@ class tour_test extends \advanced_testcase { /** * Ensure that the request_user_reset function sets an appropriate value for the tour. */ - public function test_mark_user_completed() { + public function test_mark_user_completed(): void { $tour = $this->getMockBuilder(tour::class) ->onlyMethods([ - 'get_id', - ]) - ->getMock() - ; + 'get_id', + ]) + ->getMock(); $id = rand(1, 100); $time = time(); $tour->expects($this->once()) ->method('get_id') - ->willReturn($id) - ; + ->willReturn($id); $tour->mark_user_completed(); @@ -879,34 +834,34 @@ class tour_test extends \advanced_testcase { * * @return array */ - public function sortorder_first_last_provider() { + public static function sortorder_first_last_provider(): array { $topcount = rand(10, 100); return [ - 'Only tour => first + last' => [ - 0, - true, - 1, - true, - ], - 'First tour of many' => [ - 0, - true, - $topcount, - false, - ], - 'Last tour of many' => [ - $topcount - 1, - false, - $topcount, - true, - ], - 'Middle tour of many' => [ - 5, - false, - $topcount, - false, - ], - ]; + 'Only tour => first + last' => [ + 0, + true, + 1, + true, + ], + 'First tour of many' => [ + 0, + true, + $topcount, + false, + ], + 'Last tour of many' => [ + $topcount - 1, + false, + $topcount, + true, + ], + 'Middle tour of many' => [ + 5, + false, + $topcount, + false, + ], + ]; } /** @@ -918,7 +873,7 @@ class tour_test extends \advanced_testcase { * @param int $total The number of tours * @param bool $islast Whether this is the last tour */ - public function test_is_first_tour($sortorder, $isfirst, $total, $islast) { + public function test_is_first_tour($sortorder, $isfirst, $total, $islast): void { $tour = new \tool_usertours\tour(); $rc = new \ReflectionClass(tour::class); @@ -938,7 +893,7 @@ class tour_test extends \advanced_testcase { * @param int $total The number of tours * @param bool $islast Whether this is the last tour */ - public function test_is_last_tour_calculated($sortorder, $isfirst, $total, $islast) { + public function test_is_last_tour_calculated($sortorder, $isfirst, $total, $islast): void { $tour = new \tool_usertours\tour(); $rc = new \ReflectionClass(tour::class); @@ -950,8 +905,7 @@ class tour_test extends \advanced_testcase { $DB = $this->mock_database(); $DB->expects($this->once()) ->method('count_records') - ->willReturn($total) - ; + ->willReturn($total); $this->assertEquals($islast, $tour->is_last_tour()); } @@ -964,7 +918,7 @@ class tour_test extends \advanced_testcase { * @param int $total The number of tours * @param bool $islast Whether this is the last tour */ - public function test_is_last_tour_provided($sortorder, $isfirst, $total, $islast) { + public function test_is_last_tour_provided($sortorder, $isfirst, $total, $islast): void { $tour = new \tool_usertours\tour(); $rc = new \ReflectionClass(tour::class); @@ -977,8 +931,7 @@ class tour_test extends \advanced_testcase { $DB = $this->mock_database(); $DB->expects($this->never()) ->method('count_records') - ->willReturn(0) - ; + ->willReturn(0); $this->assertEquals($islast, $tour->is_last_tour($total)); } @@ -987,7 +940,7 @@ class tour_test extends \advanced_testcase { * * @return array */ - public function get_filter_values_provider() { + public static function get_filter_values_provider(): array { $cheese = ['cheddar', 'boursin', 'mozzarella']; $horses = ['coolie', 'dakota', 'leo', 'twiggy']; return [ @@ -1013,7 +966,7 @@ class tour_test extends \advanced_testcase { 'Some config for several filters' => [ [ 'horses' => $horses, - 'cheese' => $cheese + 'cheese' => $cheese, ], 'horses', $horses, @@ -1029,7 +982,7 @@ class tour_test extends \advanced_testcase { * @param string $filtername The name of the filter being tested * @param array $expectedvalues The expected result */ - public function test_get_filter_values($fullconfig, $filtername, $expectedvalues) { + public function test_get_filter_values($fullconfig, $filtername, $expectedvalues): void { $tour = $this->getMockBuilder(tour::class) ->onlyMethods(['get_config']) ->getMock(); @@ -1046,7 +999,7 @@ class tour_test extends \advanced_testcase { * * @return array */ - public function set_filter_values_provider() { + public static function set_filter_values_provider(): array { $cheese = ['cheddar', 'boursin', 'mozzarella']; $horses = ['coolie', 'dakota', 'leo', 'twiggy']; @@ -1087,7 +1040,7 @@ class tour_test extends \advanced_testcase { * @param array $newvalues The new values to store * @param array $expectedvalues The combined values */ - public function test_set_filter_values_merge($currentvalues, $filtername, $newvalues, $expectedvalues) { + public function test_set_filter_values_merge($currentvalues, $filtername, $newvalues, $expectedvalues): void { $tour = $this->getMockBuilder(tour::class) ->onlyMethods(['get_config', 'set_config']) ->getMock(); From 43e2e62be4dce5218c47eb5f8218c53c8ab43c14 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Fri, 9 Feb 2024 11:47:42 +0800 Subject: [PATCH 2/2] MDL-80871 tool_usertours: Allow tours to ignore completion The use-case here is for tours which must be shown on every page load. The tour still needs to be ended for the current page, but should be shown again on the next time the page is loaded. --- .../tool/usertours/classes/external/tour.php | 1 + admin/tool/usertours/classes/helper.php | 2 +- .../classes/local/forms/edittour.php | 12 ++++++ admin/tool/usertours/classes/manager.php | 1 + admin/tool/usertours/classes/tour.php | 37 ++++++++++++++++++ .../tool/usertours/lang/en/tool_usertours.php | 3 ++ .../behat/tour_prevents_completion.feature | 29 ++++++++++++++ admin/tool/usertours/tests/tour_test.php | 38 ++++++++++++++++--- 8 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 admin/tool/usertours/tests/behat/tour_prevents_completion.feature diff --git a/admin/tool/usertours/classes/external/tour.php b/admin/tool/usertours/classes/external/tour.php index 0430b1febe4..9ecad8e43ac 100644 --- a/admin/tool/usertours/classes/external/tour.php +++ b/admin/tool/usertours/classes/external/tour.php @@ -189,6 +189,7 @@ class tour extends external_api { self::validate_context($context); $tour = tourinstance::instance($params['tourid']); + $tour->mark_user_completed(); \tool_usertours\event\tour_ended::create([ diff --git a/admin/tool/usertours/classes/helper.php b/admin/tool/usertours/classes/helper.php index f782127cc89..8327dbd0ed4 100644 --- a/admin/tool/usertours/classes/helper.php +++ b/admin/tool/usertours/classes/helper.php @@ -21,9 +21,9 @@ use core\output\inplace_editable; /** * Tour helper. * - * @package tool_usertours * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @package tool_usertours */ class helper { /** diff --git a/admin/tool/usertours/classes/local/forms/edittour.php b/admin/tool/usertours/classes/local/forms/edittour.php index 165de32bc55..cf6f50402cd 100644 --- a/admin/tool/usertours/classes/local/forms/edittour.php +++ b/admin/tool/usertours/classes/local/forms/edittour.php @@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.'); require_once($CFG->libdir . '/formslib.php'); use tool_usertours\helper; +use tool_usertours\tour; /** * Form for editing tours. @@ -88,6 +89,17 @@ class edittour extends \moodleform { $mform->addElement('checkbox', 'displaystepnumbers', get_string('displaystepnumbers', 'tool_usertours')); $mform->addHelpButton('displaystepnumbers', 'displaystepnumbers', 'tool_usertours'); + $mform->addElement( + 'select', + 'showtourwhen', + get_string('showtourwhen', 'tool_usertours'), + [ + tour::SHOW_TOUR_UNTIL_COMPLETE => get_string('showtouruntilcomplete', 'tool_usertours'), + tour::SHOW_TOUR_ON_EACH_PAGE_VISIT => get_string('showtoureachtime', 'tool_usertours'), + ] + ); + $mform->setDefault('showtourwhen', tour::SHOW_TOUR_UNTIL_COMPLETE); + // Configuration. $this->tour->add_config_to_form($mform); diff --git a/admin/tool/usertours/classes/manager.php b/admin/tool/usertours/classes/manager.php index 7ce2915c351..cd9c22ebfee 100644 --- a/admin/tool/usertours/classes/manager.php +++ b/admin/tool/usertours/classes/manager.php @@ -363,6 +363,7 @@ class manager { $tour->set_enabled(!empty($data->enabled)); $tour->set_endtourlabel($data->endtourlabel); $tour->set_display_step_numbers(!empty($data->displaystepnumbers)); + $tour->set_showtourwhen($data->showtourwhen); foreach (configuration::get_defaultable_keys() as $key) { $tour->set_config($key, $data->$key); diff --git a/admin/tool/usertours/classes/tour.php b/admin/tool/usertours/classes/tour.php index e9cb318fae1..61001c5745d 100644 --- a/admin/tool/usertours/classes/tour.php +++ b/admin/tool/usertours/classes/tour.php @@ -52,6 +52,12 @@ class tour { */ const TOUR_REQUESTED_BY_USER = 'tool_usertours_tour_reset_time_'; + /** @var int Whether to show the tour only until it has been marked complete */ + const SHOW_TOUR_UNTIL_COMPLETE = 1; + + /** @var int Whether to show the tour every time a page matches */ + const SHOW_TOUR_ON_EACH_PAGE_VISIT = 2; + /** * @var $id The tour ID. */ @@ -641,6 +647,11 @@ class tour { return false; } + if ($this->get_showtourwhen() === self::SHOW_TOUR_ON_EACH_PAGE_VISIT) { + // The tour should be shown on every page visit. + return true; + } + if ($tourcompletiondate = get_user_preferences(self::TOUR_LAST_COMPLETED_BY_USER . $this->get_id(), null)) { if ($tourresetdate = get_user_preferences(self::TOUR_REQUESTED_BY_USER . $this->get_id(), null)) { if ($tourresetdate >= $tourcompletiondate) { @@ -763,6 +774,7 @@ class tour { */ public function prepare_data_for_form() { $data = $this->to_record(); + $data->showtourwhen = $this->get_showtourwhen(); foreach (configuration::get_defaultable_keys() as $key) { $data->$key = $this->get_config($key, configuration::get_default_value($key)); } @@ -860,4 +872,29 @@ class tour { public function get_display_step_numbers(): bool { return $this->displaystepnumbers; } + + /** + * Set the value for the when to show the tour. + * + * @see self::SHOW_TOUR_UNTIL_COMPLETE + * @see self::SHOW_TOUR_ON_EACH_PAGE_VISIT + * + * @param int $value + * @return self + */ + public function set_showtourwhen(int $value): tour { + return $this->set_config('showtourwhen', $value); + } + + /** + * When to show the tour. + * + * @see self::SHOW_TOUR_UNTIL_COMPLETE + * @see self::SHOW_TOUR_ON_EACH_PAGE_VISIT + * + * @return int + */ + public function get_showtourwhen(): int { + return $this->get_config('showtourwhen', self::SHOW_TOUR_UNTIL_COMPLETE); + } } diff --git a/admin/tool/usertours/lang/en/tool_usertours.php b/admin/tool/usertours/lang/en/tool_usertours.php index 0672417b728..815806de4a9 100644 --- a/admin/tool/usertours/lang/en/tool_usertours.php +++ b/admin/tool/usertours/lang/en/tool_usertours.php @@ -36,6 +36,9 @@ $string['description_help'] = 'The description of a tour may be added as plain t Alternatively, a language string ID may be entered in the format identifier,component (with no brackets or space after the comma).'; $string['displaystepnumbers'] = 'Display step numbers'; $string['displaystepnumbers_help'] = 'Whether to display a step number count e.g. 1/4, 2/4 etc. to indicate the length of the user tour.'; +$string['showtourwhen'] = 'Show tour'; +$string['showtoureachtime'] = 'each time a filter matches it'; +$string['showtouruntilcomplete'] = 'until it has been closed'; $string['confirmstepremovalquestion'] = 'Are you sure that you wish to remove this step?'; $string['confirmstepremovaltitle'] = 'Confirm step removal'; $string['confirmtourremovalquestion'] = 'Are you sure that you wish to remove this tour?'; diff --git a/admin/tool/usertours/tests/behat/tour_prevents_completion.feature b/admin/tool/usertours/tests/behat/tour_prevents_completion.feature new file mode 100644 index 00000000000..0b2e687be9f --- /dev/null +++ b/admin/tool/usertours/tests/behat/tour_prevents_completion.feature @@ -0,0 +1,29 @@ +@tool @tool_usertours +Feature: Prevent yours from being marked as complete + In order to impart key information + As an administrator + I can prevent a user tour from being marked as complete + + Background: + Given I log in as "admin" + And I add a new user tour with: + | Name | First tour | + | Description | My first tour | + | Apply to URL match | FRONTPAGE | + | Tour is enabled | 1 | + | Show with backdrop | 1 | + # 2 = tour::SHOW_TOUR_ON_EACH_PAGE_VISIT + | Show tour | 2 | + And I add steps to the "First tour" tour: + | targettype | Title | id_content | Content type | + | Display in middle of page | Welcome | Welcome tour. | Manual | + + @javascript + Scenario: Ending the tour should not mark it as complete + # Changing the window viewport to mobile so we will have the footer section. + Given I am on site homepage + And I should see "Welcome" + And I press "Got it" + And I should not see "Welcome" + When I am on site homepage + Then I should see "Welcome" diff --git a/admin/tool/usertours/tests/tour_test.php b/admin/tool/usertours/tests/tour_test.php index ab8ba1ded7f..ac34e75015f 100644 --- a/admin/tool/usertours/tests/tour_test.php +++ b/admin/tool/usertours/tests/tour_test.php @@ -98,6 +98,10 @@ class tour_test extends \advanced_testcase { 'config', ['key', 'value'], ], + 'showtourwhen' => [ + 'showtourwhen', + [0], + ], ]; } @@ -598,30 +602,44 @@ class tour_test extends \advanced_testcase { null, null, null, + [], true, ], 'Completed by user before majorupdatetime' => [ $time - DAYSECS, null, $time, + [], true, ], 'Completed by user since majorupdatetime' => [ $time, null, $time - DAYSECS, + [], false, ], 'Requested by user before current completion' => [ $time, $time - DAYSECS, - null, + $time - MINSECS, + [], false, ], 'Requested by user since completion' => [ $time - DAYSECS, $time, + 'null', + [], + true, + ], + 'Tour will show on each load' => [ + $time, + $time - DAYSECS, null, + [ + 'showtourwhen' => tour::SHOW_TOUR_ON_EACH_PAGE_VISIT, + ], true, ], ]; @@ -634,9 +652,16 @@ class tour_test extends \advanced_testcase { * @param mixed $completiondate The user's completion date for this tour * @param mixed $requesteddate The user's last requested date for this tour * @param mixed $updateddate The date this tour was last updated + * @param mixed $config The tour config to apply * @param string $expectation The expected tour key */ - public function test_should_show_for_user($completiondate, $requesteddate, $updateddate, $expectation): void { + public function test_should_show_for_user( + $completiondate, + $requesteddate, + $updateddate, + $config, + $expectation, + ): void { // Uses user preferences so we must be in a user context. $this->resetAfterTest(); $this->setAdminUser(); @@ -644,7 +669,6 @@ class tour_test extends \advanced_testcase { $tour = $this->getMockBuilder(tour::class) ->onlyMethods([ 'get_id', - 'get_config', 'is_enabled', ]) ->getMock(); @@ -652,6 +676,10 @@ class tour_test extends \advanced_testcase { $tour->method('is_enabled') ->willReturn(true); + foreach ($config as $key => $value) { + $tour->set_config($key, $value); + } + $id = rand(1, 100); $tour->method('get_id') ->willReturn($id); @@ -665,9 +693,7 @@ class tour_test extends \advanced_testcase { } if ($updateddate !== null) { - $tour->expects($this->once()) - ->method('get_config') - ->willReturn($updateddate); + $tour->set_config('majorupdatetime', $updateddate); } $this->assertEquals($expectation, $tour->should_show_for_user());