This commit is contained in:
Andrew Nicols 2022-09-28 12:41:02 +08:00
commit c3f0e19d67
2 changed files with 22 additions and 8 deletions

View file

@ -35,16 +35,20 @@ use core_reportbuilder\local\models\audience as audience_model;
class audience { class audience {
/** /**
* Return audience base records for a given report * Return audience instances for a given report. Note that any records pointing to invalid audience types will be excluded
* *
* @param int $reportid * @param int $reportid
* @return base[] * @return base[]
*/ */
public static function get_base_records(int $reportid): array { public static function get_base_records(int $reportid): array {
$records = audience_model::get_records(['reportid' => $reportid], 'id'); $records = audience_model::get_records(['reportid' => $reportid], 'id');
return array_map(function ($record) {
return base::instance(0, $record->to_record()); $instances = array_map(static function(audience_model $audience): ?base {
return base::instance(0, $audience->to_record());
}, $records); }, $records);
// Filter and remove null elements (invalid audience types).
return array_filter($instances);
} }
/** /**

View file

@ -50,10 +50,10 @@ class audience_test extends advanced_testcase {
public function test_get_base_records(): void { public function test_get_base_records(): void {
$this->resetAfterTest(); $this->resetAfterTest();
// Report with no audiences.
/** @var core_reportbuilder_generator $generator */ /** @var core_reportbuilder_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
// Report with no audiences.
$report = $generator->create_report([ $report = $generator->create_report([
'name' => 'My report', 'name' => 'My report',
'source' => users::class, 'source' => users::class,
@ -65,13 +65,14 @@ class audience_test extends advanced_testcase {
// Create a couple of manual audience types. // Create a couple of manual audience types.
$user1 = $this->getDataGenerator()->create_user(); $user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user(); $user2 = $this->getDataGenerator()->create_user();
$generator->create_audience([ $audience1 = $generator->create_audience([
'reportid' => $report->get('id'), 'reportid' => $report->get('id'),
'classname' => manual::class, 'classname' => manual::class,
'configdata' => ['users' => [$user1->id, $user2->id]], 'configdata' => ['users' => [$user1->id, $user2->id]],
]); ]);
$user3 = $this->getDataGenerator()->create_user(); $user3 = $this->getDataGenerator()->create_user();
$generator->create_audience([ $audience2 = $generator->create_audience([
'reportid' => $report->get('id'), 'reportid' => $report->get('id'),
'classname' => manual::class, 'classname' => manual::class,
'configdata' => ['users' => [$user3->id]], 'configdata' => ['users' => [$user3->id]],
@ -79,8 +80,17 @@ class audience_test extends advanced_testcase {
$baserecords = audience::get_base_records($report->get('id')); $baserecords = audience::get_base_records($report->get('id'));
$this->assertCount(2, $baserecords); $this->assertCount(2, $baserecords);
$this->assertInstanceOf(manual::class, $baserecords[0]); $this->assertContainsOnlyInstancesOf(manual::class, $baserecords);
$this->assertInstanceOf(manual::class, $baserecords[1]);
// Set invalid classname of first audience, should be excluded in subsequent request.
$audience1->get_persistent()->set('classname', '\invalid')->save();
$baserecords = audience::get_base_records($report->get('id'));
$this->assertCount(1, $baserecords);
$baserecord = reset($baserecords);
$this->assertInstanceOf(manual::class, $baserecord);
$this->assertEquals($audience2->get_persistent()->get('id'), $baserecord->get_persistent()->get('id'));
} }
/** /**