From 3c83f2b85f3fd284b3421e543ec2602099db77d0 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Thu, 25 Jan 2024 11:30:12 +0000 Subject: [PATCH] MDL-80722 reportbuilder: add time created/modified to course entity. Tidy up unit tests for course report, removing some redundancy and duplication. --- .../datasource/categories_test.php | 11 +- .../reportbuilder/datasource/courses_test.php | 109 ++++++++++-------- .../classes/local/entities/course.php | 4 + 3 files changed, 72 insertions(+), 52 deletions(-) diff --git a/course/tests/reportbuilder/datasource/categories_test.php b/course/tests/reportbuilder/datasource/categories_test.php index 6a01c5352f4..34b6276cc31 100644 --- a/course/tests/reportbuilder/datasource/categories_test.php +++ b/course/tests/reportbuilder/datasource/categories_test.php @@ -18,9 +18,10 @@ declare(strict_types=1); namespace core_course\reportbuilder\datasource; +use core_course_category; use core_reportbuilder_generator; use core_reportbuilder_testcase; -use core_reportbuilder\local\filters\{select, text}; +use core_reportbuilder\local\filters\{category, select, text}; defined('MOODLE_INTERNAL') || die(); @@ -126,7 +127,12 @@ class categories_test extends core_reportbuilder_testcase { return [ // Category. + 'Filter category' => ['course_category:name', [ + 'course_category:name_operator' => category::NOT_EQUAL_TO, + 'course_category:name_value' => -1, + ], true], 'Filter category (no match)' => ['course_category:name', [ + 'course_category:name_operator' => category::EQUAL_TO, 'course_category:name_value' => -1, ], false], 'Filter category name' => ['course_category:text', [ @@ -202,7 +208,8 @@ class categories_test extends core_reportbuilder_testcase { $this->resetAfterTest(); - $category = $this->getDataGenerator()->create_category(['name' => 'Zoo', 'idnumber' => 'Z01']); + // Get the default category, modify it so we can filter each value. + ($category = core_course_category::get_default())->update(['name' => 'Zoo', 'idnumber' => 'Z01']); $course = $this->getDataGenerator()->create_course(['category' => $category->id, 'fullname' => 'Zebra']); // Add a cohort. diff --git a/course/tests/reportbuilder/datasource/courses_test.php b/course/tests/reportbuilder/datasource/courses_test.php index 39455f303c5..c1669a0db5e 100644 --- a/course/tests/reportbuilder/datasource/courses_test.php +++ b/course/tests/reportbuilder/datasource/courses_test.php @@ -22,7 +22,6 @@ use context_course; use core_reportbuilder_testcase; use core_reportbuilder_generator; use core_reportbuilder\local\filters\boolean_select; -use core_reportbuilder\local\filters\category; use core_reportbuilder\local\filters\date; use core_reportbuilder\local\filters\select; use core_reportbuilder\local\filters\tags; @@ -109,12 +108,6 @@ class courses_test extends core_reportbuilder_testcase { $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); $report = $generator->create_report(['name' => 'Courses', 'source' => courses::class, 'default' => 0]); - // Category. - $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course_category:namewithlink']); - $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course_category:path']); - $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course_category:idnumber']); - $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course_category:description']); - // Course. $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:coursefullnamewithlink']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:courseshortnamewithlink']); @@ -131,10 +124,11 @@ class courses_test extends core_reportbuilder_testcase { $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:theme']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:enablecompletion']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:downloadcontent']); + $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:timecreated']); + $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:timemodified']); // Tags. $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'tag:name']); - $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'tag:namewithlink']); // File entity. $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'file:name']); @@ -142,37 +136,52 @@ class courses_test extends core_reportbuilder_testcase { $content = $this->get_custom_report_content($report->get('id')); $this->assertCount(1, $content); - $courserow = array_values($content[0]); - - // Category. - $this->assertStringContainsString($category->get_formatted_name(), $courserow[0]); - $this->assertEquals($category->get_nested_name(false), $courserow[1]); - $this->assertEquals($category->idnumber, $courserow[2]); - $this->assertEquals(format_text($category->description, $category->descriptionformat), $courserow[3]); + [ + $coursenamewithlink, + $courseshortnamewithlink, + $courseidnumberwithlink, + $coursesummary, + $courseformat, + $coursestartdate, + $courseenddate, + $coursevisible, + $coursegroupmode, + $coursegroupmodeforce, + $courselang, + $coursecalendar, + $coursetheme, + $coursecompletion, + $coursedownload, + $coursetimecreated, + $coursetimemodified, + $tagname, + $filename, + ] = array_values($content[0]); // Course. - $this->assertStringContainsString($course->fullname, $courserow[4]); - $this->assertStringContainsString($course->shortname, $courserow[5]); - $this->assertStringContainsString($course->idnumber, $courserow[6]); - $this->assertEquals(format_text($course->summary, $course->summaryformat), $courserow[7]); - $this->assertEquals('Custom sections', $courserow[8]); - $this->assertEquals(userdate($course->startdate), $courserow[9]); - $this->assertEmpty($courserow[10]); - $this->assertEquals('Yes', $courserow[11]); - $this->assertEquals('No groups', $courserow[12]); - $this->assertEquals('No', $courserow[13]); - $this->assertEmpty($courserow[14]); - $this->assertEmpty($courserow[15]); - $this->assertEmpty($courserow[16]); - $this->assertEquals('No', $courserow[17]); - $this->assertEmpty($courserow[18]); + $this->assertStringContainsString($course->fullname, $coursenamewithlink); + $this->assertStringContainsString($course->shortname, $courseshortnamewithlink); + $this->assertStringContainsString($course->idnumber, $courseidnumberwithlink); + $this->assertEquals(format_text($course->summary, $course->summaryformat), $coursesummary); + $this->assertEquals('Custom sections', $courseformat); + $this->assertEquals(userdate($course->startdate), $coursestartdate); + $this->assertEmpty($courseenddate); + $this->assertEquals('Yes', $coursevisible); + $this->assertEquals('No groups', $coursegroupmode); + $this->assertEquals('No', $coursegroupmodeforce); + $this->assertEmpty($courselang); + $this->assertEmpty($coursecalendar); + $this->assertEmpty($coursetheme); + $this->assertEquals('No', $coursecompletion); + $this->assertEmpty($coursedownload); + $this->assertEquals(userdate($course->timecreated), $coursetimecreated); + $this->assertEquals(userdate($course->timemodified), $coursetimemodified); // Tags. - $this->assertEquals('Horses', $courserow[19]); - $this->assertStringContainsString('Horses', $courserow[20]); + $this->assertEquals('Horses', $tagname); // File. - $this->assertEquals('HelloWorld.jpg', $courserow[21]); + $this->assertEquals('HelloWorld.jpg', $filename); } /** @@ -221,14 +230,6 @@ class courses_test extends core_reportbuilder_testcase { public function datasource_filters_provider(): array { return [ // Category. - 'Filter category' => ['course_category:name', [ - 'course_category:name_operator' => category::NOT_EQUAL_TO, - 'course_category:name_value' => -1, - ], true], - 'Filter category (no match)' => ['course_category:name', [ - 'course_category:name_operator' => category::EQUAL_TO, - 'course_category:name_value' => -1, - ], false], 'Filter category name' => ['course_category:text', [ 'course_category:text_operator' => text::IS_EQUAL_TO, 'course_category:text_value' => 'Animals', @@ -237,14 +238,6 @@ class courses_test extends core_reportbuilder_testcase { 'course_category:text_operator' => text::IS_EQUAL_TO, 'course_category:text_value' => 'Fruit', ], false], - 'Filter category idnumber' => ['course_category:idnumber', [ - 'course_category:idnumber_operator' => text::IS_EQUAL_TO, - 'course_category:idnumber_value' => 'CAT101', - ], true], - 'Filter category idnumber (no match)' => ['course_category:idnumber', [ - 'course_category:idnumber_operator' => text::CONTAINS, - 'course_category:idnumber_value' => 'FRUIT', - ], false], // Course. 'Filter course' => ['course:courseselector', [ @@ -360,6 +353,22 @@ class courses_test extends core_reportbuilder_testcase { 'Filter course downloadcontent (no match)' => ['course:downloadcontent', [ 'course:downloadcontent_operator' => boolean_select::NOT_CHECKED, ], false], + 'Filter course timecreated' => ['course:timecreated', [ + 'course:timecreated_operator' => date::DATE_RANGE, + 'course:timecreated_from' => 1622502000, + ], true], + 'Filter course timecreated (no match)' => ['course:timecreated', [ + 'course:timecreated_operator' => date::DATE_RANGE, + 'course:timecreated_to' => 1622502000, + ], false], + 'Filter course timemodified' => ['course:timemodified', [ + 'course:timemodified_operator' => date::DATE_RANGE, + 'course:timemodified_from' => 1622502000, + ], true], + 'Filter course timemodified (no match)' => ['course:timemodified', [ + 'course:timemodified_operator' => date::DATE_RANGE, + 'course:timemodified_to' => 1622502000, + ], false], // Tags. 'Filter tag name' => ['tag:name', [ @@ -389,7 +398,7 @@ class courses_test extends core_reportbuilder_testcase { public function test_datasource_filters(string $filtername, array $filtervalues, bool $expectmatch): void { $this->resetAfterTest(); - $category = $this->getDataGenerator()->create_category(['name' => 'Animals', 'idnumber' => 'CAT101']); + $category = $this->getDataGenerator()->create_category(['name' => 'Animals']); $course = $this->getDataGenerator()->create_course([ 'category' => $category->id, 'fullname' => 'Equine', diff --git a/reportbuilder/classes/local/entities/course.php b/reportbuilder/classes/local/entities/course.php index 20f8b67b5e3..34382c45d82 100644 --- a/reportbuilder/classes/local/entities/course.php +++ b/reportbuilder/classes/local/entities/course.php @@ -143,6 +143,8 @@ class course extends base { 'theme' => new lang_string('forcetheme'), 'enablecompletion' => new lang_string('enablecompletion', 'completion'), 'downloadcontent' => new lang_string('downloadcoursecontent', 'course'), + 'timecreated' => new lang_string('timecreated', 'core_reportbuilder'), + 'timemodified' => new lang_string('timemodified', 'core_reportbuilder'), ]; } @@ -177,6 +179,8 @@ class course extends base { break; case 'startdate': case 'enddate': + case 'timecreated': + case 'timemodified': $fieldtype = column::TYPE_TIMESTAMP; break; case 'summary':