Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?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/>.declare(strict_types=1);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;/*** Unit tests for the report helper class** @package core_reportbuilder* @covers \core_reportbuilder\local\helpers\report* @copyright 2021 Paul Holden <paulh@moodle.com>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/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 with tags','source' => users::class,'tags' => ['cat', 'dog'],]);$this->assertEquals('My report with tags', $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')));$report = report::create_report((object) ['name' => 'My report without tags','source' => users::class,]);$this->assertEquals('My report without tags', $report->get('name'));$this->assertEquals(datasource::TYPE_CUSTOM_REPORT, $report->get('type'));$this->assertEmpty(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 without add tags','uniquerows' => 1,]);$this->assertEquals('My renamed report without add tags', $reportupdated->get('name'));$this->assertTrue($reportupdated->get('uniquerows'));$this->assertEmpty(core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report',$reportupdated->get('id')));$reportupdated = report::update_report((object) ['id' => $report->get('id'),'name' => 'My renamed report adding tags','uniquerows' => 1,'tags' => ['cat', 'dog'],]);$this->assertEquals('My renamed report adding tags', $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*/public function test_delete_report(): void {$this->resetAfterTest();$this->setAdminUser();/** @var core_reportbuilder_generator $generator */$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,'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']);// Create Report2 and add some elements.$report2 = $generator->create_report(['name' => 'My report 2', 'source' => users::class, 'default' => false]);$column2 = $generator->create_column(['reportid' => $report2->get('id'), 'uniqueidentifier' => 'user:email']);$filter2 = $generator->create_filter(['reportid' => $report2->get('id'), 'uniqueidentifier' => 'user:email']);$condition2 = $generator->create_condition(['reportid' => $report2->get('id'), 'uniqueidentifier' => 'user:email']);// Delete Report1.$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')));$this->assertTrue($column2::record_exists($column2->get('id')));$this->assertTrue($filter2::record_exists($filter2->get('id')));$this->assertTrue($condition2::record_exists($condition2->get('id')));}/*** Testing adding report column*/public function test_add_report_column(): 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,'default' => false,]);// Add first column.$columnfullname = report::add_report_column($report->get('id'), 'user:fullname');$this->assertTrue(column::record_exists($columnfullname->get('id')));$this->assertEquals($report->get('id'), $columnfullname->get('reportid'));$this->assertEquals('user:fullname', $columnfullname->get('uniqueidentifier'));$this->assertEquals(1, $columnfullname->get('columnorder'));$this->assertEquals(1, $columnfullname->get('sortorder'));// Add second column.$columnemail = report::add_report_column($report->get('id'), 'user:email');$this->assertTrue(column::record_exists($columnemail->get('id')));$this->assertEquals($report->get('id'), $columnemail->get('reportid'));$this->assertEquals('user:email', $columnemail->get('uniqueidentifier'));$this->assertEquals(2, $columnemail->get('columnorder'));$this->assertEquals(2, $columnemail->get('sortorder'));}/*** Test adding invalid report column*/public function test_add_report_column_invalid(): 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,'default' => false,]);$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Invalid column');report::add_report_column($report->get('id'), 'user:invalid');}/*** Testing deleting report column*/public function test_delete_report_column(): 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,'default' => false,]);// Add two columns.$columnfullname = $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname']);$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:email']);// Delete the first column.$result = report::delete_report_column($report->get('id'), $columnfullname->get('id'));$this->assertTrue($result);// Assert report columns.$columns = column::get_records(['reportid' => $report->get('id')]);$this->assertCount(1, $columns);$column = reset($columns);$this->assertEquals('user:email', $column->get('uniqueidentifier'));$this->assertEquals(1, $column->get('columnorder'));}/*** Testing deleting invalid report column*/public function test_delete_report_column_invalid(): 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,'default' => false,]);$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Invalid column');report::delete_report_column($report->get('id'), 42);}/*** Testing re-ordering report column*/public function test_reorder_report_column(): 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,'default' => false,]);// Add four columns.$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname']);$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:email']);$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:country']);$columncity = $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:city']);// Move the city column to second position.$result = report::reorder_report_column($report->get('id'), $columncity->get('id'), 2);$this->assertTrue($result);// Assert report columns order.$columns = column::get_records(['reportid' => $report->get('id')], 'columnorder');$columnidentifiers = array_map(static function(column $column): string {return $column->get('uniqueidentifier');}, $columns);$this->assertEquals(['user:fullname','user:city','user:email','user:country',], $columnidentifiers);}/*** Testing re-ordering invalid report column*/public function test_reorder_report_column_invalid(): 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,'default' => false,]);$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Invalid column');report::reorder_report_column($report->get('id'), 42, 1);}/*** Testing re-ordering report column sorting*/public function test_reorder_report_column_sorting(): 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, 'default' => false]);// Add four columns.$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname']);$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:email']);$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:country']);$columncity = $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:city']);// Move the city column to second position.$result = report::reorder_report_column_sorting($report->get('id'), $columncity->get('id'), 2);$this->assertTrue($result);// Assert report columns order.$columns = column::get_records(['reportid' => $report->get('id')], 'sortorder');$columnidentifiers = array_map(static function(column $column): string {return $column->get('uniqueidentifier');}, $columns);$this->assertEquals(['user:fullname','user:city','user:email','user:country',], $columnidentifiers);}/*** Testing re-ordering invalid report column sorting*/public function test_reorder_report_column_sorting_invalid(): 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,'default' => false,]);$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Invalid column');report::reorder_report_column_sorting($report->get('id'), 42, 1);}/*** Test toggling of report column sorting*/public function test_toggle_report_column_sorting(): 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]);$column = $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:email']);// Toggle sort descending.$result = report::toggle_report_column_sorting($report->get('id'), $column->get('id'), true, SORT_DESC);$this->assertTrue($result);// Confirm column was updated.$columnupdated = new column($column->get('id'));$this->assertTrue($columnupdated->get('sortenabled'));$this->assertEquals(SORT_DESC, $columnupdated->get('sortdirection'));}/*** Test toggling of report column sorting with invalid column*/public function test_toggle_report_column_sorting_invalid(): 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]);$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Invalid column');report::toggle_report_column_sorting($report->get('id'), 42, false);}/*** Test adding report condition*/public function test_add_report_condition(): 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, 'default' => false]);// Add first condition.$conditionfullname = report::add_report_condition($report->get('id'), 'user:fullname');$this->assertTrue(filter::record_exists_select('id = :id AND iscondition = 1',['id' => $conditionfullname->get('id')]));$this->assertEquals($report->get('id'), $conditionfullname->get('reportid'));$this->assertEquals('user:fullname', $conditionfullname->get('uniqueidentifier'));$this->assertEquals(1, $conditionfullname->get('filterorder'));// Add second condition.$conditionemail = report::add_report_condition($report->get('id'), 'user:email');$this->assertTrue(filter::record_exists_select('id = :id AND iscondition = 1',['id' => $conditionemail->get('id')]));$this->assertEquals($report->get('id'), $conditionemail->get('reportid'));$this->assertEquals('user:email', $conditionemail->get('uniqueidentifier'));$this->assertEquals(2, $conditionemail->get('filterorder'));}/*** Test adding invalid report condition*/public function test_add_report_condition_invalid(): 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, 'default' => false]);$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Invalid condition');report::add_report_condition($report->get('id'), 'user:invalid');}/*** Test adding duplicate report condition*/public function test_add_report_condition_duplicate(): 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, 'default' => false]);// First one is fine.report::add_report_condition($report->get('id'), 'user:email');$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Duplicate condition');report::add_report_condition($report->get('id'), 'user:email');}/*** Test deleting report condition*/public function test_delete_report_condition(): 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, 'default' => false]);// Add two conditions.$conditionfullname = $generator->create_condition(['reportid' => $report->get('id'),'uniqueidentifier' => 'user:fullname',]);$generator->create_condition(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:email']);// Delete the first condition.$result = report::delete_report_condition($report->get('id'), $conditionfullname->get('id'));$this->assertTrue($result);// Assert report conditions.$conditions = filter::get_condition_records($report->get('id'));$this->assertCount(1, $conditions);$condition = reset($conditions);$this->assertEquals('user:email', $condition->get('uniqueidentifier'));$this->assertEquals(1, $condition->get('filterorder'));}/*** Test deleting invalid report condition*/public function test_delete_report_condition_invalid(): 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, 'default' => false]);$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Invalid condition');report::delete_report_condition($report->get('id'), 42);}/*** Test re-ordering report condition*/public function test_reorder_report_condition(): 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, 'default' => false]);// Add four conditions.$generator->create_condition(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname']);$generator->create_condition(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:email']);$generator->create_condition(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:country']);$conditioncity = $generator->create_condition(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:city']);// Move the city condition to second position.$result = report::reorder_report_condition($report->get('id'), $conditioncity->get('id'), 2);$this->assertTrue($result);// Assert report conditions order.$conditions = filter::get_condition_records($report->get('id'), 'filterorder');$conditionidentifiers = array_map(static function(filter $condition): string {return $condition->get('uniqueidentifier');}, $conditions);$this->assertEquals(['user:fullname','user:city','user:email','user:country',], $conditionidentifiers);}/*** Test re-ordering invalid report condition*/public function test_reorder_report_condition_invalid(): 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,'default' => false,]);$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Invalid condition');report::reorder_report_condition($report->get('id'), 42, 1);}/*** Test adding report filter*/public function test_add_report_filter(): 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, 'default' => false]);// Add first filter.$filterfullname = report::add_report_filter($report->get('id'), 'user:fullname');$this->assertTrue(filter::record_exists_select('id = :id AND iscondition = 0',['id' => $filterfullname->get('id')]));$this->assertEquals($report->get('id'), $filterfullname->get('reportid'));$this->assertEquals('user:fullname', $filterfullname->get('uniqueidentifier'));$this->assertEquals(1, $filterfullname->get('filterorder'));// Add second filter.$filteremail = report::add_report_filter($report->get('id'), 'user:email');$this->assertTrue(filter::record_exists_select('id = :id AND iscondition = 0',['id' => $filteremail->get('id')]));$this->assertEquals($report->get('id'), $filteremail->get('reportid'));$this->assertEquals('user:email', $filteremail->get('uniqueidentifier'));$this->assertEquals(2, $filteremail->get('filterorder'));}/*** Test adding invalid report filter*/public function test_add_report_filter_invalid(): 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, 'default' => false]);$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Invalid filter');report::add_report_filter($report->get('id'), 'user:invalid');}/*** Test adding duplicate report filter*/public function test_add_report_filter_duplicate(): 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, 'default' => false]);// First one is fine.report::add_report_filter($report->get('id'), 'user:email');$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Duplicate filter');report::add_report_filter($report->get('id'), 'user:email');}/*** Test deleting report filter*/public function test_delete_report_filter(): 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, 'default' => false]);// Add two filters.$filterfullname = $generator->create_filter(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname']);$generator->create_filter(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:email']);// Delete the first filter.$result = report::delete_report_filter($report->get('id'), $filterfullname->get('id'));$this->assertTrue($result);// Assert report filters.$filters = filter::get_filter_records($report->get('id'));$this->assertCount(1, $filters);$filter = reset($filters);$this->assertEquals('user:email', $filter->get('uniqueidentifier'));$this->assertEquals(1, $filter->get('filterorder'));}/*** Test deleting invalid report filter*/public function test_delete_report_filter_invalid(): 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, 'default' => false]);$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Invalid filter');report::delete_report_filter($report->get('id'), 42);}/*** Test re-ordering report filter*/public function test_reorder_report_filter(): 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, 'default' => false]);// Add four filters.$generator->create_filter(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname']);$generator->create_filter(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:email']);$generator->create_filter(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:country']);$filtercity = $generator->create_filter(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:city']);// Move the city filter to second position.$result = report::reorder_report_filter($report->get('id'), $filtercity->get('id'), 2);$this->assertTrue($result);// Assert report filters order.$filters = filter::get_filter_records($report->get('id'), 'filterorder');$filteridentifiers = array_map(static function(filter $filter): string {return $filter->get('uniqueidentifier');}, $filters);$this->assertEquals(['user:fullname','user:city','user:email','user:country',], $filteridentifiers);}/*** Test re-ordering invalid report filter*/public function test_reorder_report_filter_invalid(): 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,'default' => false,]);$this->expectException(invalid_parameter_exception::class);$this->expectExceptionMessage('Invalid filter');report::reorder_report_filter($report->get('id'), 42, 1);}}