Skip to content

Commit

Permalink
Merge branch 'MDL-75345' of https://github.com/paulholden/moodle
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewnicols committed Feb 2, 2023
2 parents d22142f + 147c318 commit 8ec42cd
Show file tree
Hide file tree
Showing 10 changed files with 1,152 additions and 1,009 deletions.
241 changes: 223 additions & 18 deletions course/tests/reportbuilder/datasource/courses_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@
use core_customfield_generator;
use core_reportbuilder_testcase;
use core_reportbuilder_generator;
use core_reportbuilder\local\filters\boolean_select;
use core_reportbuilder\local\filters\date;
use core_reportbuilder\local\filters\select;
use core_reportbuilder\local\filters\tags;
use core_reportbuilder\local\filters\text;

defined('MOODLE_INTERNAL') || die();

Expand Down Expand Up @@ -61,12 +65,13 @@ public function test_datasource_default(): void {
$content = $this->get_custom_report_content($report->get('id'));
$this->assertCount(1, $content);

$contentrow = array_values(reset($content));
$contentrow = array_values($content[0]);

$this->assertEquals([
'My cats', // Category name.
'C101', // Course shortname.
'All about cats', // Course fullname.
'CAT101', // Course ID number.
$category->get_formatted_name(),
$course->shortname,
$course->fullname,
$course->idnumber,
], $contentrow);
}

Expand All @@ -76,7 +81,17 @@ public function test_datasource_default(): void {
public function test_datasource_non_default_columns(): void {
$this->resetAfterTest();

$course = $this->getDataGenerator()->create_course(['tags' => ['Horses']]);
$category = $this->getDataGenerator()->create_category([
'name' => 'Animals',
'idnumber' => 'CAT101',
'description' => 'Category description',
]);
$course = $this->getDataGenerator()->create_course([
'category' => $category->id,
'fullname' => 'Cats',
'summary' => 'Course description',
'tags' => ['Horses'],
]);

// Add a course image.
get_file_storage()->create_file_from_string([
Expand All @@ -93,10 +108,27 @@ public function test_datasource_non_default_columns(): void {
$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:fullname']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:coursefullnamewithlink']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:courseshortnamewithlink']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:courseidnumberewithlink']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:summary']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:format']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:startdate']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:enddate']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:visible']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:groupmode']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:groupmodeforce']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:lang']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:calendartype']);
$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']);

// Tags.
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'tag:name']);
Expand All @@ -109,11 +141,36 @@ public function test_datasource_non_default_columns(): void {
$this->assertCount(1, $content);

$courserow = array_values($content[0]);
$this->assertEquals('Category 1', $courserow[0]);
$this->assertEquals($course->fullname, $courserow[1]);
$this->assertEquals('Horses', $courserow[2]);
$this->assertStringContainsString('Horses', $courserow[3]);
$this->assertEquals('HelloWorld.jpg', $courserow[4]);

// 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]);

// 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('Topics format', $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]);

// Tags.
$this->assertEquals('Horses', $courserow[19]);
$this->assertStringContainsString('Horses', $courserow[20]);

// File.
$this->assertEquals('HelloWorld.jpg', $courserow[21]);
}

/**
Expand Down Expand Up @@ -161,6 +218,142 @@ public function test_courses_datasource_multilang_filters(): void {
*/
public function datasource_filters_provider(): array {
return [
// Category.
'Filter category' => ['course_category:name', [
'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',
], true],
'Filter category name (no match)' => ['course_category:text', [
'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', [
'course:courseselector_values' => [-1],
], false],
'Filter course fullname' => ['course:fullname', [
'course:fullname_operator' => text::IS_EQUAL_TO,
'course:fullname_value' => 'Equine',
], true],
'Filter course fullname (no match)' => ['course:fullname', [
'course:fullname_operator' => text::IS_EQUAL_TO,
'course:fullname_value' => 'Foxes',
], false],
'Filter course shortname' => ['course:shortname', [
'course:shortname_operator' => text::IS_EQUAL_TO,
'course:shortname_value' => 'EQ101',
], true],
'Filter course shortname (no match)' => ['course:shortname', [
'course:shortname_operator' => text::IS_EQUAL_TO,
'course:shortname_value' => 'FX101',
], false],
'Filter course idnumber' => ['course:idnumber', [
'course:idnumber_operator' => text::IS_EQUAL_TO,
'course:idnumber_value' => 'E-101AB',
], true],
'Filter course idnumber (no match)' => ['course:idnumber', [
'course:idnumber_operator' => text::IS_EQUAL_TO,
'course:idnumber_value' => 'F-101XT',
], false],
'Filter course summary' => ['course:summary', [
'course:summary_operator' => text::CONTAINS,
'course:summary_value' => 'Lorem ipsum',
], true],
'Filter course summary (no match)' => ['course:summary', [
'course:summary_operator' => text::IS_EQUAL_TO,
'course:summary_value' => 'Fiat',
], false],
'Filter course format' => ['course:format', [
'course:format_operator' => select::EQUAL_TO,
'course:format_value' => 'topics',
], true],
'Filter course format (no match)' => ['course:format', [
'course:format_operator' => select::EQUAL_TO,
'course:format_value' => 'weekly',
], false],
'Filter course startdate' => ['course:startdate', [
'course:startdate_operator' => date::DATE_RANGE,
'course:startdate_from' => 1622502000,
], true],
'Filter course startdate (no match)' => ['course:startdate', [
'course:startdate_operator' => date::DATE_RANGE,
'course:startdate_to' => 1622502000,
], false],
'Filter course enddate' => ['course:enddate', [
'course:enddate_operator' => date::DATE_EMPTY,
], true],
'Filter course enddate (no match)' => ['course:enddate', [
'course:enddate_operator' => date::DATE_NOT_EMPTY,
], false],
'Filter course visible' => ['course:visible', [
'course:visible_operator' => boolean_select::CHECKED,
], true],
'Filter course visible (no match)' => ['course:visible', [
'course:visible_operator' => boolean_select::NOT_CHECKED,
], false],
'Filter course groupmode' => ['course:groupmode', [
'course:groupmode_operator' => select::EQUAL_TO,
'course:groupmode_value' => 0, // No groups.
], true],
'Filter course groupmode (no match)' => ['course:groupmode', [
'course:groupmode_operator' => select::EQUAL_TO,
'course:groupmode_value' => 1, // Separate groups.
], false],
'Filter course groupmodeforce' => ['course:groupmodeforce', [
'course:groupmodeforce_operator' => boolean_select::NOT_CHECKED,
], true],
'Filter course groupmodeforce (no match)' => ['course:groupmodeforce', [
'course:groupmodeforce_operator' => boolean_select::CHECKED,
], false],
'Filter course lang' => ['course:lang', [
'course:lang_operator' => select::EQUAL_TO,
'course:lang_value' => 'en',
], true],
'Filter course lang (no match)' => ['course:lang', [
'course:lang_operator' => select::EQUAL_TO,
'course:lang_value' => 'de',
], false],
'Filter course calendartype' => ['course:calendartype', [
'course:calendartype_operator' => select::EQUAL_TO,
'course:calendartype_value' => 'gregorian',
], true],
'Filter course calendartype (no match)' => ['course:calendartype', [
'course:calendartype_operator' => select::EQUAL_TO,
'course:calendartype_value' => 'hijri',
], false],
'Filter course theme' => ['course:theme', [
'course:theme_operator' => select::EQUAL_TO,
'course:theme_value' => 'boost',
], true],
'Filter course theme (no match)' => ['course:theme', [
'course:theme_operator' => select::EQUAL_TO,
'course:theme_value' => 'classic',
], false],
'Filter course enablecompletion' => ['course:enablecompletion', [
'course:enablecompletion_operator' => boolean_select::NOT_CHECKED,
], true],
'Filter course enablecompletion (no match)' => ['course:enablecompletion', [
'course:enablecompletion_operator' => boolean_select::CHECKED,
], false],
'Filter course downloadcontent' => ['course:downloadcontent', [
'course:downloadcontent_operator' => boolean_select::CHECKED,
], true],
'Filter course downloadcontent (no match)' => ['course:downloadcontent', [
'course:downloadcontent_operator' => boolean_select::NOT_CHECKED,
], false],

// Tags.
'Filter tag name' => ['tag:name', [
'tag:name_operator' => tags::EQUAL_TO,
Expand All @@ -169,6 +362,11 @@ public function datasource_filters_provider(): array {
'Filter tag name not empty' => ['tag:name', [
'tag:name_operator' => tags::NOT_EMPTY,
], true],

// File.
'Filter file name empty' => ['file:name', [
'file:name_operator' => text::IS_EMPTY,
], true],
];
}

Expand All @@ -181,14 +379,21 @@ public function datasource_filters_provider(): array {
*
* @dataProvider datasource_filters_provider
*/
public function test_datasource_filters(
string $filtername,
array $filtervalues,
bool $expectmatch
): void {
public function test_datasource_filters(string $filtername, array $filtervalues, bool $expectmatch): void {
$this->resetAfterTest();

$course = $this->getDataGenerator()->create_course(['tags' => ['Horses']]);
$category = $this->getDataGenerator()->create_category(['name' => 'Animals', 'idnumber' => 'CAT101']);
$course = $this->getDataGenerator()->create_course([
'category' => $category->id,
'fullname' => 'Equine',
'shortname' => 'EQ101',
'idnumber' => 'E-101AB',
'lang' => 'en',
'calendartype' => 'gregorian',
'theme' => 'boost',
'downloadcontent' => 1,
'tags' => ['Horses'],
]);

/** @var core_reportbuilder_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ public function get_filters(): array {
break;
case 'datetime':
$classname = date::class;
$fieldsql = $DB->sql_cast_char2int($field);
$fieldsql = $DB->sql_cast_char2int($field, true);
break;
case 'menu':
$classname = select::class;
Expand Down
76 changes: 0 additions & 76 deletions reportbuilder/tests/fixtures/course_entity_report.php

This file was deleted.

Loading

0 comments on commit 8ec42cd

Please sign in to comment.