AutorÃa | 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_badges;
use core_badges_generator;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once("{$CFG->libdir}/badgeslib.php");
/**
* Unit tests for badge class.
*
* @package core_badges
* @covers \core_badges\badge
* @copyright 2024 Sara Arjona <sara@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
final class badge_test extends \advanced_testcase {
/**
* Test create_badge.
*
* @dataProvider badges_provider
* @param bool $iscourse Whether the badge is a course badge or not.
* @param array $data Badge data. It will override the default data.
*/
public function test_create_badge(bool $iscourse = false, array $data = []): void {
global $DB;
$this->resetAfterTest();
$courseid = null;
if ($iscourse) {
$course = $this->getDataGenerator()->create_course();
$courseid = (int) $course->id;
}
$user1 = $this->getDataGenerator()->create_user();
$this->setUser($user1);
// Check no badges exist.
$this->assertEquals(0, $DB->count_records('badge'));
$data = (object) array_merge($this->get_badge(), $data);
// Trigger and capture events.
$sink = $this->redirectEvents();
$badge = badge::create_badge($data, $courseid);
// Check the badge was created with the correct data.
$this->assertEquals(1, $DB->count_records('badge'));
$this->assertNotEmpty($badge->id);
if ($iscourse) {
$this->assertEquals(BADGE_TYPE_COURSE, $badge->type);
$this->assertEquals($course->id, $badge->courseid);
} else {
$this->assertEquals(BADGE_TYPE_SITE, $badge->type);
$this->assertNull($badge->courseid);
}
// Badges are always inactive by default, regardless the given status.
$this->assertEquals(BADGE_STATUS_INACTIVE, $badge->status);
if (property_exists($data, 'tags')) {
$this->assertEquals($data->tags, $badge->get_badge_tags());
}
// Check that the event was triggered.
$events = $sink->get_events();
$event = reset($events);
// Check that the event data is valid.
$this->assertInstanceOf('\core\event\badge_created', $event);
$this->assertEquals($badge->usercreated, $event->userid);
$this->assertEquals($badge->id, $event->objectid);
$this->assertDebuggingNotCalled();
$sink->close();
}
/**
* Test update() in badge class.
*
* @dataProvider badges_provider
* @param bool $iscourse Whether the badge is a course badge or not.
* @param array $data Badge data to update the badge with. It will override the default data.
*/
public function test_udpate_badge(bool $iscourse = false, array $data = []): void {
global $USER, $DB;
$this->resetAfterTest();
$record = [];
if ($iscourse) {
$course = $this->getDataGenerator()->create_course();
$record['type'] = BADGE_TYPE_COURSE;
$record['courseid'] = $course->id;
}
/** @var core_badges_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_badges');
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
$this->setUser($user1);
/** @var badge $badge */
$badge = $generator->create_badge($record);
$data = (object) array_merge($this->get_badge(), $data);
// Check the badge has been created.
$this->assertEquals(1, $DB->count_records('badge'));
$this->assertNotEquals($data->name, $badge->name);
$this->assertEmpty($badge->get_badge_tags());
// Trigger and capture events.
$sink = $this->redirectEvents();
$this->setUser($user2);
$this->assertTrue($badge->update($data));
// Check the badge was updated with the correct data.
$this->assertEquals(1, $DB->count_records('badge'));
$this->assertNotEmpty($badge->id);
$this->assertEquals($data->name, $badge->name);
if ($iscourse) {
$this->assertEquals(BADGE_TYPE_COURSE, $badge->type);
$this->assertEquals($course->id, $badge->courseid);
} else {
$this->assertEquals(BADGE_TYPE_SITE, $badge->type);
$this->assertNull($badge->courseid);
}
$this->assertEquals(BADGE_STATUS_ACTIVE, $badge->status);
$this->assertEquals($USER->id, $badge->usermodified);
if (property_exists($data, 'tags')) {
$this->assertEquals($data->tags, $badge->get_badge_tags());
}
// Check that the event was triggered.
$events = $sink->get_events();
$event = reset($events);
// Check that the event data is valid.
$this->assertInstanceOf('\core\event\badge_updated', $event);
$this->assertEquals($badge->usermodified, $event->userid);
$this->assertEquals($badge->id, $event->objectid);
$this->assertDebuggingNotCalled();
$sink->close();
}
/**
* Test update_message() in badge class.
*
* @dataProvider badges_provider
* @param bool $iscourse Whether the badge is a course badge or not.
* @param array $data Badge data to update the badge with. It will override the default data.
*/
public function test_udpate_message_badge(bool $iscourse = false, array $data = []): void {
global $USER, $DB;
$this->resetAfterTest();
$record = [];
if ($iscourse) {
$course = $this->getDataGenerator()->create_course();
$record['type'] = BADGE_TYPE_COURSE;
$record['courseid'] = $course->id;
}
/** @var core_badges_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_badges');
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
$this->setUser($user1);
/** @var badge $badge */
$badge = $generator->create_badge($record);
$data = (object) array_merge($this->get_badge(), $data);
// Check the badge has been created.
$this->assertEquals(1, $DB->count_records('badge'));
$this->assertNotEquals($data->name, $badge->name);
$this->assertNotEquals($data->messagesubject, $badge->messagesubject);
$this->assertNotEquals($data->message_editor['text'], $badge->message);
$this->assertEmpty($badge->get_badge_tags());
// Trigger and capture events.
$sink = $this->redirectEvents();
$this->setUser($user2);
$this->assertTrue($badge->update_message($data));
// Check the badge was updated with the correct data.
$this->assertEquals(1, $DB->count_records('badge'));
$this->assertNotEmpty($badge->id);
$this->assertNotEquals($data->name, $badge->name);
$this->assertEquals($data->messagesubject, $badge->messagesubject);
$this->assertEquals($data->message_editor['text'], $badge->message);
if ($iscourse) {
$this->assertEquals(BADGE_TYPE_COURSE, $badge->type);
$this->assertEquals($course->id, $badge->courseid);
} else {
$this->assertEquals(BADGE_TYPE_SITE, $badge->type);
$this->assertNull($badge->courseid);
}
$this->assertEquals(BADGE_STATUS_ACTIVE, $badge->status);
$this->assertEquals($user1->id, $badge->usermodified);
// Check that the event was triggered.
$events = $sink->get_events();
$event = reset($events);
// Check that the event data is valid.
$this->assertInstanceOf('\core\event\badge_updated', $event);
$this->assertEquals($USER->id, $event->userid);
$this->assertEquals($badge->id, $event->objectid);
$this->assertDebuggingNotCalled();
$sink->close();
}
/**
* Data provider for badge tests.
*
* @return array
*/
public static function badges_provider(): array {
return [
'Site badge' => [
],
'Site badge with tags' => [
'iscourse' => false,
'data' => [
'tags' => ['tag1', 'tag2'],
],
],
'Course badge' => [
'iscourse' => true,
],
];
}
/**
* Get default badge data for testing purpose.
*
* @return array Badge data.
*/
private function get_badge(): array {
global $USER;
return [
'name' => 'My test badge',
'description' => 'Testing badge description',
'timecreated' => time(),
'timemodified' => time(),
'usercreated' => $USER->id,
'usermodified' => $USER->id,
'issuername' => 'Test issuer',
'issuerurl' => 'http://issuer-url.domain.co.nz',
'issuercontact' => 'issuer@example.com',
'expiry' => 0,
'expiredate' => null,
'expireperiod' => null,
'type' => BADGE_TYPE_SITE,
'courseid' => null,
'messagesubject' => 'The new test message subject',
'messageformat' => '1',
'message_editor' => [
'text' => 'The new test message body',
],
'attachment' => 1,
'notification' => 0,
'status' => BADGE_STATUS_ACTIVE_LOCKED,
'version' => OPEN_BADGES_V2,
'language' => 'en',
'imagecaption' => 'Image caption',
'tags' => [],
];
}
}