Differences Between: [Versions 401 and 403] [Versions 402 and 403]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 declare(strict_types=1); 18 19 namespace core_comment\reportbuilder\datasource; 20 21 use context_course; 22 use core_comment_generator; 23 use core_reportbuilder_generator; 24 use core_reportbuilder_testcase; 25 use core_reportbuilder\local\filters\{date, select, text}; 26 27 defined('MOODLE_INTERNAL') || die(); 28 29 global $CFG; 30 require_once("{$CFG->dirroot}/reportbuilder/tests/helpers.php"); 31 32 /** 33 * Unit tests for comments datasource 34 * 35 * @package core_comment 36 * @covers \core_comment\reportbuilder\datasource\comments 37 * @copyright 2022 Paul Holden <paulh@moodle.com> 38 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 39 */ 40 class comments_test extends core_reportbuilder_testcase { 41 42 /** 43 * Test default datasource 44 */ 45 public function test_datasource_default(): void { 46 $this->resetAfterTest(); 47 48 $course = $this->getDataGenerator()->create_course(); 49 $coursecontext = context_course::instance($course->id); 50 51 /** @var core_comment_generator $generator */ 52 $generator = $this->getDataGenerator()->get_plugin_generator('core_comment'); 53 54 // Our first user will create a single comment. 55 $userone = $this->getDataGenerator()->create_and_enrol($course, 'student', ['firstname' => 'Zoe']); 56 $this->setUser($userone); 57 $useronecomment = $generator->create_comment([ 58 'context' => $coursecontext, 59 'component' => 'block_comments', 60 'area' => 'page_comments', 61 ])->add('Cool'); 62 63 // Our second user will create a couple of comments. 64 $usertwo = $this->getDataGenerator()->create_and_enrol($course, 'student', ['firstname' => 'Amy']); 65 $this->setUser($usertwo); 66 $usertwocommentfirst = $generator->create_comment([ 67 'context' => $coursecontext, 68 'component' => 'block_comments', 69 'area' => 'page_comments', 70 ])->add('Super'); 71 72 $this->waitForSecond(); // For consistent ordering we need distinct time for second user comments. 73 $usertwocommentsecond = $generator->create_comment([ 74 'context' => $coursecontext, 75 'component' => 'block_comments', 76 'area' => 'page_comments', 77 ])->add('Awesome'); 78 79 /** @var core_reportbuilder_generator $generator */ 80 $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); 81 $report = $generator->create_report(['name' => 'Blogs', 'source' => comments::class, 'default' => 1]); 82 83 $content = $this->get_custom_report_content($report->get('id')); 84 85 // Default columns are user, context, content, time created. Sorted by user and time created. 86 $contextname = $coursecontext->get_context_name(); 87 $this->assertEquals([ 88 [fullname($usertwo), $contextname, format_text('Super'), userdate($usertwocommentfirst->timecreated)], 89 [fullname($usertwo), $contextname, format_text('Awesome'), userdate($usertwocommentsecond->timecreated)], 90 [fullname($userone), $contextname, format_text('Cool'), userdate($useronecomment->timecreated)], 91 ], array_map('array_values', $content)); 92 } 93 94 /** 95 * Test datasource columns that aren't added by default 96 */ 97 public function test_datasource_non_default_columns(): void { 98 $this->resetAfterTest(); 99 $this->setAdminUser(); 100 101 $course = $this->getDataGenerator()->create_course(); 102 $courseurl = course_get_url($course); 103 $coursecontext = context_course::instance($course->id); 104 105 /** @var core_comment_generator $generator */ 106 $generator = $this->getDataGenerator()->get_plugin_generator('core_comment'); 107 $generator->create_comment([ 108 'context' => $coursecontext, 109 'component' => 'block_comments', 110 'area' => 'page_comments', 111 'content' => 'Cool', 112 ]); 113 114 /** @var core_reportbuilder_generator $generator */ 115 $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); 116 $report = $generator->create_report(['name' => 'Blogs', 'source' => comments::class, 'default' => 0]); 117 118 $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'context:link']); 119 $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'comment:component']); 120 $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'comment:area']); 121 $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'comment:itemid']); 122 123 $content = $this->get_custom_report_content($report->get('id')); 124 $this->assertCount(1, $content); 125 126 $this->assertEquals([ 127 "<a href=\"{$courseurl}\">{$coursecontext->get_context_name()}</a>", 128 'block_comments', 129 'page_comments', 130 0, 131 ], array_values($content[0])); 132 } 133 134 /** 135 * Data provider for {@see test_datasource_filters} 136 * 137 * @return array[] 138 */ 139 public function datasource_filters_provider(): array { 140 return [ 141 // Comment. 142 'Filter content' => ['comment:content', [ 143 'comment:content_operator' => text::CONTAINS, 144 'comment:content_value' => 'Cool', 145 ], true], 146 'Filter content (no match)' => ['comment:content', [ 147 'comment:content_operator' => text::IS_EQUAL_TO, 148 'comment:content_value' => 'Beans', 149 ], false], 150 'Filter time created' => ['comment:timecreated', [ 151 'comment:timecreated_operator' => date::DATE_RANGE, 152 'comment:timecreated_from' => 1622502000, 153 ], true], 154 'Filter time created (no match)' => ['comment:timecreated', [ 155 'comment:timecreated_operator' => date::DATE_RANGE, 156 'comment:timecreated_to' => 1622502000, 157 ], false], 158 159 // Context. 160 'Context level' => ['context:level', [ 161 'context:level_operator' => select::EQUAL_TO, 162 'context:level_value' => CONTEXT_COURSE, 163 ], true], 164 'Context level (no match)' => ['context:level', [ 165 'context:level_operator' => select::EQUAL_TO, 166 'context:level_value' => CONTEXT_BLOCK, 167 ], false], 168 169 // User. 170 'Filter user' => ['user:username', [ 171 'user:username_operator' => text::IS_EQUAL_TO, 172 'user:username_value' => 'admin', 173 ], true], 174 'Filter user (no match)' => ['user:username', [ 175 'user:username_operator' => text::IS_EQUAL_TO, 176 'user:username_value' => 'lionel', 177 ], false], 178 ]; 179 } 180 181 /** 182 * Test datasource filters 183 * 184 * @param string $filtername 185 * @param array $filtervalues 186 * @param bool $expectmatch 187 * 188 * @dataProvider datasource_filters_provider 189 */ 190 public function test_datasource_filters( 191 string $filtername, 192 array $filtervalues, 193 bool $expectmatch 194 ): void { 195 $this->resetAfterTest(); 196 $this->setAdminUser(); 197 198 $course = $this->getDataGenerator()->create_course(); 199 $coursecontext = context_course::instance($course->id); 200 201 /** @var core_comment_generator $generator */ 202 $generator = $this->getDataGenerator()->get_plugin_generator('core_comment'); 203 $generator->create_comment([ 204 'context' => $coursecontext, 205 'component' => 'block_comments', 206 'area' => 'page_comments', 207 'content' => 'Cool', 208 ]); 209 210 /** @var core_reportbuilder_generator $generator */ 211 $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); 212 213 // Create report containing single column, and given filter. 214 $report = $generator->create_report(['name' => 'Tasks', 'source' => comments::class, 'default' => 0]); 215 $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'comment:component']); 216 217 // Add filter, set it's values. 218 $generator->create_filter(['reportid' => $report->get('id'), 'uniqueidentifier' => $filtername]); 219 $content = $this->get_custom_report_content($report->get('id'), 0, $filtervalues); 220 221 if ($expectmatch) { 222 $this->assertCount(1, $content); 223 $this->assertEquals('block_comments', reset($content[0])); 224 } else { 225 $this->assertEmpty($content); 226 } 227 } 228 229 /** 230 * Stress test datasource 231 * 232 * In order to execute this test PHPUNIT_LONGTEST should be defined as true in phpunit.xml or directly in config.php 233 */ 234 public function test_stress_datasource(): void { 235 if (!PHPUNIT_LONGTEST) { 236 $this->markTestSkipped('PHPUNIT_LONGTEST is not defined'); 237 } 238 239 $this->resetAfterTest(); 240 $this->setAdminUser(); 241 242 $course = $this->getDataGenerator()->create_course(); 243 $coursecontext = context_course::instance($course->id); 244 245 /** @var core_comment_generator $generator */ 246 $generator = $this->getDataGenerator()->get_plugin_generator('core_comment'); 247 $generator->create_comment([ 248 'context' => $coursecontext, 249 'component' => 'block_comments', 250 'area' => 'page_comments', 251 'content' => 'Cool', 252 ]); 253 254 $this->datasource_stress_test_columns(comments::class); 255 $this->datasource_stress_test_columns_aggregation(comments::class); 256 $this->datasource_stress_test_conditions(comments::class, 'comment:component'); 257 } 258 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body