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 customfield_number\local\numberproviders\nofactivities;
use advanced_testcase;
use customfield_number\local\numberproviders\nofactivities;
use customfield_number\provider_base;
/**
* Tests for the number of activities
*
* @package customfield_number
* @covers \customfield_number\local\numberproviders\nofactivities
* @copyright 2024 Ilya Tregubov <ilya.tregubov@proton.me>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
final class nofactivities_test extends advanced_testcase {
/**
* Test that we can automatically calculate number of activities in courses.
*/
public function test_recalculate(): void {
global $DB;
$this->resetAfterTest();
$this->setAdminUser();
$course1 = $this->getDataGenerator()->create_course();
$course2 = $this->getDataGenerator()->create_course();
// Add some activities to the courses.
$assigngenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
$assign1 = $assigngenerator->create_instance(['course' => $course1->id, 'visible' => 1]);
$assigngenerator->create_instance(['course' => $course1->id, 'visible' => 1]);
$assigngenerator->create_instance(['course' => $course1->id, 'visible' => 0]);
$quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz');
$quizgenerator->create_instance(['course' => $course1->id, 'visible' => 1]);
$quizgenerator->create_instance(['course' => $course1->id, 'visible' => 0]);
$quizgenerator->create_instance(['course' => $course1->id, 'visible' => 0]);
$forumgenerator = $this->getDataGenerator()->get_plugin_generator('mod_forum');
$forumgenerator->create_instance(['course' => $course1->id, 'visible' => 1]);
$forumgenerator->create_instance(['course' => $course1->id, 'visible' => 0]);
$forumgenerator->create_instance(['course' => $course1->id, 'visible' => 1]);
$assigngenerator->create_instance(['course' => $course2->id, 'visible' => 1]);
$assigngenerator->create_instance(['course' => $course2->id, 'visible' => 1]);
$assigngenerator->create_instance(['course' => $course2->id, 'visible' => 1]);
/** @var \core_customfield_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_customfield');
// Create a category and field.
$category = $generator->create_category();
$field = $generator->create_field([
'categoryid' => $category->get('id'),
'type' => 'number',
'configdata' => [
'fieldtype' => 'customfield_number\local\numberproviders\nofactivities',
"activitytypes" => ["assign", "forum"],
],
]);
// Test if the provider has been added correctly.
$providers = provider_base::get_all_providers($field);
$this->assertNotEmpty($providers);
$this->assertInstanceOf(nofactivities::class, $providers[0]);
// Calculate only in course1.
$providers[0]->recalculate((int)$course1->id);
$course1customfield = $DB->get_field('customfield_data', 'decvalue', ['instanceid' => $course1->id]);
$course2customfield = $DB->get_field('customfield_data', 'decvalue', ['instanceid' => $course2->id]);
$this->assertEquals(4.0000, $course1customfield);
$this->assertEquals(false, $course2customfield);
// Calculate in all courses.
$providers[0]->recalculate();
$course1customfield = $DB->get_field('customfield_data', 'decvalue', ['instanceid' => $course1->id]);
$course2customfield = $DB->get_field('customfield_data', 'decvalue', ['instanceid' => $course2->id]);
$this->assertEquals(4.0000, $course1customfield);
$this->assertEquals(3.0000, $course2customfield);
// Delete some assign module.
$cm = get_coursemodule_from_instance('assign', $assign1->id);
course_delete_module($cm->id);
$providers[0]->recalculate((int)$course1->id);
$course1customfield = $DB->get_field('customfield_data', 'decvalue', ['instanceid' => $course1->id]);
// Module is marked as deleted.
$this->assertEquals(3.0000, $course1customfield);
// Now, run the course module deletion adhoc task.
\phpunit_util::run_all_adhoc_tasks();
$providers[0]->recalculate((int)$course1->id);
$course1customfield = $DB->get_field('customfield_data', 'decvalue', ['instanceid' => $course1->id]);
$this->assertEquals(3.0000, $course1customfield);
}
/**
* Test that the data record is updated/deleted when the value is recalculated
*
* Also test that export_value() is correct
*
* @return void
*/
public function test_recalculate_change_value(): void {
global $DB;
$this->resetAfterTest();
$this->setAdminUser();
// Create a course with one activity.
$course1 = $this->getDataGenerator()->create_course();
$assigngenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
$assign1 = $assigngenerator->create_instance(['course' => $course1->id, 'visible' => 1]);
/** @var \core_customfield_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_customfield');
// Create a category and two fields, one with displaywhenzero, another one without.
$category = $generator->create_category();
$field1 = $generator->create_field([
'categoryid' => $category->get('id'),
'type' => 'number',
'configdata' => [
'fieldtype' => nofactivities::class,
'activitytypes' => ['assign'],
'displaywhenzero' => '0',
],
]);
$field2 = $generator->create_field([
'categoryid' => $category->get('id'),
'type' => 'number',
'configdata' => [
'fieldtype' => nofactivities::class,
'activitytypes' => ['assign'],
'displaywhenzero' => '',
],
]);
$getdata = fn(\customfield_number\field_controller $field): \customfield_number\data_controller =>
\core_customfield\api::get_instance_fields_data([$field->get('id') => $field], (int)$course1->id)[$field->get('id')];
// Recalculate the value of the field and assert it is set to 1 (one activity in the course).
(new \customfield_number\task\cron())->execute();
$data = $getdata($field1);
$this->assertEquals(1, $data->get('decvalue'));
$this->assertSame('1', $data->export_value());
$data = $getdata($field2);
$this->assertEquals(1, $data->get('decvalue'));
$this->assertSame('1', $data->export_value());
// Add another module, recalculate and assert the value of the field is set to 2 (two activities in the course).
$assign2 = $assigngenerator->create_instance(['course' => $course1->id, 'visible' => 1]);
(new \customfield_number\task\cron())->execute();
$data = $getdata($field1);
$this->assertEquals(2, $data->get('decvalue'));
$this->assertSame('2', $data->export_value());
$data = $getdata($field2);
$this->assertEquals(2, $data->get('decvalue'));
$this->assertSame('2', $data->export_value());
// Delete both modules, recalculate.
course_delete_module($assign1->cmid);
course_delete_module($assign2->cmid);
(new \customfield_number\task\cron())->execute();
// Field1 (displaywhenzero='0') has the value zero.
$data = $getdata($field1);
$this->assertNotEmpty($data->get('id'));
$this->assertEquals(0, $data->get('decvalue'));
$this->assertSame('0', $data->export_value());
// Field2 (displaywhenzero='') no longer has a data record and it is not displayed.
$data = $getdata($field2);
$this->assertEmpty($data->get('id'));
$this->assertEquals(null, $data->get('decvalue'));
$this->assertSame(null, $data->export_value());
}
}