moodle/calendar/tests/calendar_event_exporter_test.php
Eloy Lafuente (stronk7) 2d693cda7a MDL-71036 phpunit: Mock->setMethods() silently deprecated
The current ->setMethods() has been silently (won't emit any
warning) in PHPUnit 9. And will stop working (current plans)
in PHPUnit 10.

Basically the now deprecated method has been split into:

- onlyMethods(): To point to existing methods in the mocked artifact.
- addMethods(): To point to non existing (yet) methods in the mocked
  artifact.

In practice that means that all our current setMethods() calls can be
converted to onlyMethods() (existing) and done. The addMethods() is
mostly useful on development phases, not final testing.

Finally note that <null> isn't accepted anymore as parameter to
double all the methods. Instead empty array [] must be used.

Link: https://github.com/sebastianbergmann/phpunit/issues/3770
2021-03-11 23:07:31 +01:00

311 lines
11 KiB
PHP

<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Calendar event exporter tests tests.
*
* @package core_calendar
* @copyright 2017 Ryan Wyllie <ryan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
use core_calendar\external\calendar_event_exporter;
use core_calendar\local\event\container;
use core_calendar\type_factory;
require_once(__DIR__ . '/helpers.php');
/**
* Calendar event exporter testcase.
*
* @copyright 2017 Ryan Wyllie <ryan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class core_calendar_event_exporter_testcase extends advanced_testcase {
/**
* Data provider for the timestamp min limit test case to confirm
* that the minimum time limit is set correctly on the boundary cases.
*/
public function get_timestamp_min_limit_test_cases() {
$now = time();
$todaymidnight = usergetmidnight($now);
$tomorrowmidnight = $todaymidnight + DAYSECS;
$eightam = $todaymidnight + (60 * 60 * 8);
$starttime = (new DateTime())->setTimestamp($eightam);
return [
'before min' => [
$starttime,
[
($starttime->getTimestamp() + 1),
'some error'
],
$tomorrowmidnight
],
'equal min' => [
$starttime,
[
$starttime->getTimestamp(),
'some error'
],
$todaymidnight
],
'after min' => [
$starttime,
[
($starttime->getTimestamp() - 1),
'some error'
],
$todaymidnight
]
];
}
/**
* @dataProvider get_timestamp_min_limit_test_cases()
*/
public function test_get_timestamp_min_limit($starttime, $min, $expected) {
$class = \core_calendar\external\calendar_event_exporter::class;
$mock = $this->getMockBuilder($class)
->disableOriginalConstructor()
->onlyMethods([])
->getMock();
$reflector = new ReflectionClass($class);
$method = $reflector->getMethod('get_timestamp_min_limit');
$method->setAccessible(true);
$result = $method->invoke($mock, $starttime, $min);
$this->assertEquals($expected, $result['mindaytimestamp']);
$this->assertEquals($min[1], $result['mindayerror']);
}
/**
* Data provider for the timestamp max limit test case to confirm
* that the maximum time limit is set correctly on the boundary cases.
*/
public function get_timestamp_max_limit_test_cases() {
$now = time();
$todaymidnight = usergetmidnight($now);
$yesterdaymidnight = $todaymidnight - DAYSECS;
$eightam = $todaymidnight + (60 * 60 * 8);
$starttime = (new DateTime())->setTimestamp($eightam);
return [
'before max' => [
$starttime,
[
($starttime->getTimestamp() + 1),
'some error'
],
$todaymidnight
],
'equal max' => [
$starttime,
[
$starttime->getTimestamp(),
'some error'
],
$todaymidnight
],
'after max' => [
$starttime,
[
($starttime->getTimestamp() - 1),
'some error'
],
$yesterdaymidnight
]
];
}
/**
* @dataProvider get_timestamp_max_limit_test_cases()
*/
public function test_get_timestamp_max_limit($starttime, $max, $expected) {
$class = \core_calendar\external\calendar_event_exporter::class;
$mock = $this->getMockBuilder($class)
->disableOriginalConstructor()
->onlyMethods([])
->getMock();
$reflector = new ReflectionClass($class);
$method = $reflector->getMethod('get_timestamp_max_limit');
$method->setAccessible(true);
$result = $method->invoke($mock, $starttime, $max);
$this->assertEquals($expected, $result['maxdaytimestamp']);
$this->assertEquals($max[1], $result['maxdayerror']);
}
/**
* Exporting a course event should generate the course URL.
*/
public function test_calendar_event_exporter_course_url_course_event() {
global $CFG, $PAGE;
require_once($CFG->dirroot . '/course/lib.php');
$this->resetAfterTest(true);
$this->setAdminUser();
$generator = $this->getDataGenerator();
$user = $generator->create_user();
$course = $generator->create_course();
$context = context_course::instance($course->id);
$now = time();
$mapper = container::get_event_mapper();
$legacyevent = create_event([
'courseid' => $course->id,
'userid' => 1,
'eventtype' => 'course',
'timestart' => $now
]);
$event = $mapper->from_legacy_event_to_event($legacyevent);
$exporter = new calendar_event_exporter($event, [
'context' => $context,
'course' => $course,
'moduleinstance' => null,
'daylink' => new moodle_url(''),
'type' => type_factory::get_calendar_instance(),
'today' => $now
]);
$courseurl = course_get_url($course->id);
$expected = $courseurl->out(false);
$renderer = $PAGE->get_renderer('core_calendar');
$exportedevent = $exporter->export($renderer);
// The exported URL should be for the course.
$this->assertEquals($expected, $exportedevent->url);
}
/**
* Exporting a user event should generate the site course URL.
*/
public function test_calendar_event_exporter_course_url_user_event() {
global $CFG, $PAGE;
require_once($CFG->dirroot . '/course/lib.php');
$this->resetAfterTest(true);
$this->setAdminUser();
$generator = $this->getDataGenerator();
$user = $generator->create_user();
$context = context_user::instance($user->id);
$now = time();
$mapper = container::get_event_mapper();
$legacyevent = create_event([
'courseid' => 0,
'userid' => $user->id,
'eventtype' => 'user',
'timestart' => $now
]);
$event = $mapper->from_legacy_event_to_event($legacyevent);
$exporter = new calendar_event_exporter($event, [
'context' => $context,
'course' => null,
'moduleinstance' => null,
'daylink' => new moodle_url(''),
'type' => type_factory::get_calendar_instance(),
'today' => $now
]);
$courseurl = course_get_url(SITEID);
$expected = $courseurl->out(false);
$renderer = $PAGE->get_renderer('core_calendar');
$exportedevent = $exporter->export($renderer);
// The exported URL should be for the site course.
$this->assertEquals($expected, $exportedevent->url);
}
/**
* Popup name respects filters for course shortname.
*/
public function test_calendar_event_exporter_popupname_course_shortname_strips_links() {
global $CFG, $PAGE;
$this->resetAfterTest(true);
$this->setAdminUser();
$generator = $this->getDataGenerator();
$user = $generator->create_user();
$rawshortname = 'Shortname <a href="#">link</a>';
$nolinkshortname = strip_links($rawshortname);
$course = $generator->create_course(['shortname' => $rawshortname]);
$coursecontext = context_course::instance($course->id);
$now = time();
$mapper = container::get_event_mapper();
$renderer = $PAGE->get_renderer('core_calendar');
$legacyevent = create_event([
'courseid' => $course->id,
'userid' => 1,
'eventtype' => 'course',
'timestart' => $now
]);
$event = $mapper->from_legacy_event_to_event($legacyevent);
$exporter = new calendar_event_exporter($event, [
'context' => $coursecontext,
'course' => $course,
'moduleinstance' => null,
'daylink' => new moodle_url(''),
'type' => type_factory::get_calendar_instance(),
'today' => $now
]);
$exportedevent = $exporter->export($renderer);
// Links should always be stripped from the course short name.
$this->assertMatchesRegularExpression("/$nolinkshortname/", $exportedevent->popupname);
}
/**
* Exported event contains the exported course.
*/
public function test_calendar_event_exporter_exports_course() {
global $CFG, $PAGE;
$this->resetAfterTest(true);
$this->setAdminUser();
$generator = $this->getDataGenerator();
$user = $generator->create_user();
$rawshortname = 'Shortname <a href="#">link</a>';
$nolinkshortname = strip_links($rawshortname);
$course = $generator->create_course(['shortname' => $rawshortname]);
$coursecontext = context_course::instance($course->id);
$now = time();
$mapper = container::get_event_mapper();
$renderer = $PAGE->get_renderer('core_calendar');
$legacyevent = create_event([
'courseid' => $course->id,
'userid' => 1,
'eventtype' => 'course',
'timestart' => $now
]);
$event = $mapper->from_legacy_event_to_event($legacyevent);
$exporter = new calendar_event_exporter($event, [
'context' => $coursecontext,
'course' => $course,
'moduleinstance' => null,
'daylink' => new moodle_url(''),
'type' => type_factory::get_calendar_instance(),
'today' => $now
]);
$exportedevent = $exporter->export($renderer);
$courseexporter = new \core_course\external\course_summary_exporter($course, [
'context' => $coursecontext
]);
$exportedcourse = $courseexporter->export($renderer);
$this->assertEquals($exportedevent->course, $exportedcourse);
}
}