This commit is contained in:
Sara Arjona 2024-03-21 15:01:18 +01:00
commit 484e52f6ae
No known key found for this signature in database
17 changed files with 493 additions and 44 deletions

View file

@ -20,7 +20,9 @@ namespace core_reportbuilder\local\filters;
use advanced_testcase;
use lang_string;
use core_reportbuilder_generator;
use core_reportbuilder\local\report\filter;
use core_user\reportbuilder\datasource\users;
/**
* Unit tests for tags report filter
@ -38,7 +40,7 @@ class tags_test extends advanced_testcase {
*
* @return array[]
*/
public function get_sql_filter_provider(): array {
public static function get_sql_filter_provider(): array {
return [
'Any value' => [tags::ANY_VALUE, null, ['course01', 'course01', 'course02', 'course03']],
'Not empty' => [tags::NOT_EMPTY, null, ['course01', 'course01', 'course02']],
@ -102,4 +104,78 @@ class tags_test extends advanced_testcase {
$courses = $DB->get_fieldset_sql($sql, $params);
$this->assertEqualsCanonicalizing($expectedcoursenames, $courses);
}
/**
* Data provider for {@see test_get_sql_filter_component}
*
* @return array[]
*/
public static function get_sql_filter_component_provider(): array {
return [
'Any value' => [tags::ANY_VALUE, null, ['report01', 'report02']],
'Not empty' => [tags::NOT_EMPTY, null, ['report01']],
'Empty' => [tags::EMPTY, null, ['report02']],
'Equal to unselected' => [tags::EQUAL_TO, null, ['report01', 'report02']],
'Equal to selected tag' => [tags::EQUAL_TO, 'fish', ['report01']],
'Equal to selected tag (different component)' => [tags::EQUAL_TO, 'cat', []],
'Not equal to unselected' => [tags::NOT_EQUAL_TO, null, ['report01', 'report02']],
'Not equal to selected tag' => [tags::NOT_EQUAL_TO, 'fish', ['report02']],
'Not Equal to selected tag (different component)' => [tags::NOT_EQUAL_TO, 'cat', ['report01', 'report02']],
];
}
/**
* Test getting filter SQL
*
* @param int $operator
* @param string|null $tagname
* @param array $expectedreportnames
*
* @dataProvider get_sql_filter_component_provider
*/
public function test_get_sql_filter_component(int $operator, ?string $tagname, array $expectedreportnames): void {
global $DB;
$this->resetAfterTest();
// Create a course with tags, we shouldn't ever get this data back when specifying another component.
$this->getDataGenerator()->create_course(['tags' => ['cat', 'dog']]);
/** @var core_reportbuilder_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
$generator->create_report(['name' => 'report01', 'source' => users::class, 'tags' => ['fish']]);
$generator->create_report(['name' => 'report02', 'source' => users::class]);
$filter = (new filter(
tags::class,
'tags',
new lang_string('tags'),
'testentity',
'r.id'
))->set_options([
'component' => 'core_reportbuilder',
'itemtype' => 'reportbuilder_report',
]);
// Create instance of our filter, passing ID of the tag if specified.
if ($tagname !== null) {
$tagid = $DB->get_field('tag', 'id', ['name' => $tagname], MUST_EXIST);
$value = [$tagid];
} else {
$value = null;
}
[$select, $params] = tags::create($filter)->get_sql_filter([
$filter->get_unique_identifier() . '_operator' => $operator,
$filter->get_unique_identifier() . '_value' => $value,
]);
$sql = 'SELECT r.name FROM {reportbuilder_report} r';
if ($select) {
$sql .= " WHERE {$select}";
}
$reports = $DB->get_fieldset_sql($sql, $params);
$this->assertEqualsCanonicalizing($expectedreportnames, $reports);
}
}

View file

@ -21,8 +21,10 @@ namespace core_reportbuilder\local\helpers;
use advanced_testcase;
use core_reportbuilder_generator;
use invalid_parameter_exception;
use core_reportbuilder\datasource;
use core_reportbuilder\local\models\column;
use core_reportbuilder\local\models\filter;
use core_tag_tag;
use core_user\reportbuilder\datasource\users;
/**
@ -35,6 +37,49 @@ use core_user\reportbuilder\datasource\users;
*/
class report_test extends advanced_testcase {
/**
* Test creation report
*/
public function test_create_report(): void {
$this->resetAfterTest();
$this->setAdminUser();
$report = report::create_report((object) [
'name' => 'My report',
'source' => users::class,
'tags' => ['cat', 'dog'],
]);
$this->assertEquals('My report', $report->get('name'));
$this->assertEquals(datasource::TYPE_CUSTOM_REPORT, $report->get('type'));
$this->assertEqualsCanonicalizing(['cat', 'dog'],
core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $report->get('id')));
}
/**
* Test updating report
*/
public function test_update_report(): void {
$this->resetAfterTest();
$this->setAdminUser();
/** @var core_reportbuilder_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
$report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'uniquerows' => 0]);
$reportupdated = report::update_report((object) [
'id' => $report->get('id'),
'name' => 'My renamed report',
'uniquerows' => 1,
'tags' => ['cat', 'dog'],
]);
$this->assertEquals('My renamed report', $reportupdated->get('name'));
$this->assertTrue($reportupdated->get('uniquerows'));
$this->assertEqualsCanonicalizing(['cat', 'dog'],
core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $reportupdated->get('id')));
}
/**
* Test deleting report
*/
@ -46,7 +91,8 @@ class report_test extends advanced_testcase {
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
// Create Report1 and add some elements.
$report1 = $generator->create_report(['name' => 'My report 1', 'source' => users::class, 'default' => false]);
$report1 = $generator->create_report(['name' => 'My report 1', 'source' => users::class, 'default' => false,
'tags' => ['cat', 'dog']]);
$column1 = $generator->create_column(['reportid' => $report1->get('id'), 'uniqueidentifier' => 'user:email']);
$filter1 = $generator->create_filter(['reportid' => $report1->get('id'), 'uniqueidentifier' => 'user:email']);
$condition1 = $generator->create_condition(['reportid' => $report1->get('id'), 'uniqueidentifier' => 'user:email']);
@ -58,13 +104,15 @@ class report_test extends advanced_testcase {
$condition2 = $generator->create_condition(['reportid' => $report2->get('id'), 'uniqueidentifier' => 'user:email']);
// Delete Report1.
report::delete_report($report1->get('id'));
$result = report::delete_report($report1->get('id'));
$this->assertTrue($result);
// Make sure Report1, and all it's elements are deleted.
$this->assertFalse($report1::record_exists($report1->get('id')));
$this->assertFalse($column1::record_exists($column1->get('id')));
$this->assertFalse($filter1::record_exists($filter1->get('id')));
$this->assertFalse($condition1::record_exists($condition1->get('id')));
$this->assertEmpty(core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $report1->get('id')));
// Make sure Report2, and all it's elements still exist.
$this->assertTrue($report2::record_exists($report2->get('id')));