. namespace core\task; use core\tests\courses_tasks_testcase; /** * Class containing unit tests for the hide ended courses task. * * It automatically sets the course visibility to hidden when the course end date matches the current day. * * @package core * @copyright 2023 Sara Arjona * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @coversDefaultClass \core\task\hide_ended_courses_task */ final class hide_ended_courses_task_test extends courses_tasks_testcase { /** * Test hide_ended_courses cron task. * * @dataProvider hide_end_courses_provider * @covers ::execute * * @param int $nextweekvisible Number of courses with the end date set to next week to be created. * @param int $yesterdayvisible Number of courses with the end date set to yesterday to be created. * @param int $tomorrowvisible Number of courses with the end date set to tomorrow to be created. * @param bool $createhidden Whether hidden courses should be created or not. */ public function test_hide_ended_courses( int $nextweekvisible, int $yesterdayvisible, int $tomorrowvisible, bool $createhidden = true ): void { global $DB; $this->resetAfterTest(); $generator = $this->getDataGenerator(); $visiblecourses = []; $hiddencourses = []; $now = time(); $nextweek = $now + WEEKSECS; $yesterday = $now - DAYSECS + MINSECS; $tomorrow = $now + DAYSECS; // Visible course that finishes last week. for ($i = 0; $i < $nextweekvisible; $i++) { $generator->create_course(['visible' => true, 'enddate' => $nextweek]); } // Visible course that finished yesterday. for ($i = 0; $i < $yesterdayvisible; $i++) { $visiblecourses[] = $generator->create_course( ['visible' => true, 'startdate' => $yesterday - MINSECS , 'enddate' => $yesterday] )->id; } // Visible course that hasn't finished yet. for ($i = 0; $i < $tomorrowvisible; $i++) { $generator->create_course(['visible' => true, 'enddate' => $tomorrow]); } if ($createhidden) { // Visible course that already finished. $hiddencourses[] = $generator->create_course( ['visible' => false, 'startdate' => $yesterday - MINSECS, 'enddate' => $yesterday] )->id; // Visible course that hasn't finished yet. $hiddencourses[] = $generator->create_course(['visible' => false, 'enddate' => $tomorrow])->id; } $hiddentotal = count($hiddencourses); // Course total also includes site course. $coursetotal = $hiddentotal + $nextweekvisible + $yesterdayvisible + $tomorrowvisible + 1; // Check current courses have been created correctly. $this->assertEquals($coursetotal, $DB->count_records('course')); $this->assertEquals(count($hiddencourses), $DB->count_records('course', ['visible' => 0])); $sink = $this->redirectEvents(); // Run the hide ended courses task. ob_start(); $task = new hide_ended_courses_task(); $task->execute(); ob_end_clean(); // Confirm the courses with yesterday as ending date are hidden too. The rest should remain visible. $courses = $DB->get_records('course', ['visible' => 0], '', 'id'); $this->assertCount($hiddentotal + $yesterdayvisible, $courses); $expected = array_merge($hiddencourses, $visiblecourses); $this->assertEquals(asort($expected), asort($courses)); // Check the ended course event has been raised. $events = $sink->get_events(); $sink->close(); $this->assertCount($yesterdayvisible, $events); foreach ($events as $event) { $this->assertInstanceOf('\\core\\event\\course_ended', $event); $this->assertArrayHasKey($event->courseid, array_flip($expected)); } } /** * Data provider for test_hide_ended_courses. * * @return array */ public static function hide_end_courses_provider(): array { return array_map( function ($args): array { return [ 'nextweekvisible' => $args['lastweekcount'], 'yesterdayvisible' => $args['yesterdaycount'], 'tomorrowvisible' => $args['tomorrowcount'], 'createhidden' => $args['createvisible'] ?? true, ]; }, self::get_courses_provider() ); } }