01148a0816
While this change is not 100% required now, it's good habit and we are checking for it since Moodle 4.4. All the changes in this commit have been applied automatically using the moodle.PHPUnit.TestReturnType sniff and are, exclusively adding the ": void" return types when missing.
200 lines
6.6 KiB
PHP
200 lines
6.6 KiB
PHP
<?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_completion;
|
|
|
|
use advanced_testcase;
|
|
use coding_exception;
|
|
use moodle_exception;
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
|
|
/**
|
|
* Class for unit testing core_completion/activity_custom_completion.
|
|
*
|
|
* @package core_completion
|
|
* @copyright 2021 Jun Pataleta <jun@moodle.com>
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
class activity_custom_completion_test extends advanced_testcase {
|
|
|
|
/**
|
|
* Fetches a mocked activity_custom_completion instance.
|
|
*
|
|
* @param string[] $methods List of methods to mock.
|
|
* @return activity_custom_completion|MockObject
|
|
*/
|
|
protected function setup_mock(array $methods) {
|
|
return $this->getMockBuilder(activity_custom_completion::class)
|
|
->disableOriginalConstructor()
|
|
->onlyMethods($methods)
|
|
->getMockForAbstractClass();
|
|
}
|
|
|
|
/**
|
|
* Data provider for test_get_overall_completion_state().
|
|
*/
|
|
public function overall_completion_state_provider(): array {
|
|
global $CFG;
|
|
require_once($CFG->libdir . '/completionlib.php');
|
|
return [
|
|
'First incomplete, second complete' => [
|
|
['completionsubmit', 'completioncreate'],
|
|
[COMPLETION_INCOMPLETE, COMPLETION_COMPLETE],
|
|
1,
|
|
COMPLETION_INCOMPLETE,
|
|
],
|
|
'First complete, second incomplete' => [
|
|
['completionsubmit', 'completioncreate'],
|
|
[COMPLETION_COMPLETE, COMPLETION_INCOMPLETE],
|
|
2,
|
|
COMPLETION_INCOMPLETE,
|
|
],
|
|
'First complete, second failed' => [
|
|
['completionsubmit', 'completioncreate'],
|
|
[COMPLETION_COMPLETE, COMPLETION_COMPLETE_FAIL],
|
|
2,
|
|
COMPLETION_COMPLETE_FAIL,
|
|
],
|
|
'First complete, second incomplete, third failed' => [
|
|
['completionsubmit', 'completioncreate'],
|
|
[COMPLETION_COMPLETE, COMPLETION_INCOMPLETE, COMPLETION_COMPLETE_FAIL],
|
|
2,
|
|
COMPLETION_INCOMPLETE,
|
|
],
|
|
'All complete' => [
|
|
['completionsubmit', 'completioncreate'],
|
|
[COMPLETION_COMPLETE, COMPLETION_COMPLETE],
|
|
2,
|
|
COMPLETION_COMPLETE,
|
|
],
|
|
'No rules' => [
|
|
[],
|
|
[],
|
|
0,
|
|
COMPLETION_COMPLETE,
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test for \core_completion\activity_custom_completion::get_overall_completion_state().
|
|
*
|
|
* @dataProvider overall_completion_state_provider
|
|
* @param string[] $rules The custom completion rules.
|
|
* @param int[] $rulestates The completion states of these custom completion rules.
|
|
* @param int $invokecount Expected invoke count of get_state().
|
|
* @param int $state The expected overall completion state
|
|
*/
|
|
public function test_get_overall_completion_state(array $rules, array $rulestates, int $invokecount, int $state): void {
|
|
$stub = $this->setup_mock([
|
|
'get_available_custom_rules',
|
|
'get_state',
|
|
]);
|
|
|
|
// Mock activity_custom_completion's get_available_custom_rules() method.
|
|
$stub->expects($this->once())
|
|
->method('get_available_custom_rules')
|
|
->willReturn($rules);
|
|
|
|
// Mock activity_custom_completion's get_state() method.
|
|
if ($invokecount > 0) {
|
|
$stub->expects($this->exactly($invokecount))
|
|
->method('get_state')
|
|
->withConsecutive(
|
|
[$rules[0]],
|
|
[$rules[1]]
|
|
)
|
|
->willReturn($rulestates[0], $rulestates[1]);
|
|
} else {
|
|
$stub->expects($this->never())
|
|
->method('get_state');
|
|
}
|
|
|
|
$this->assertEquals($state, $stub->get_overall_completion_state());
|
|
}
|
|
|
|
/**
|
|
* Data provider for test_validate_rule().
|
|
*
|
|
* @return array[]
|
|
*/
|
|
public function validate_rule_provider() {
|
|
return [
|
|
'Not defined' => [
|
|
false, true, coding_exception::class
|
|
],
|
|
'Not available' => [
|
|
true, false, moodle_exception::class
|
|
],
|
|
'Defined and available' => [
|
|
true, true, null
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test for validate_rule()
|
|
*
|
|
* @dataProvider validate_rule_provider
|
|
* @param bool $defined is_defined()'s mocked return value.
|
|
* @param bool $available is_available()'s mocked return value.
|
|
* @param string|null $expectedexception Expected expectation class name.
|
|
*/
|
|
public function test_validate_rule(bool $defined, bool $available, ?string $expectedexception): void {
|
|
$stub = $this->setup_mock([
|
|
'is_defined',
|
|
'is_available'
|
|
]);
|
|
|
|
// Mock activity_custom_completion's is_defined() method.
|
|
$stub->expects($this->any())
|
|
->method('is_defined')
|
|
->willReturn($defined);
|
|
|
|
// Mock activity_custom_completion's is_available() method.
|
|
$stub->expects($this->any())
|
|
->method('is_available')
|
|
->willReturn($available);
|
|
|
|
if ($expectedexception) {
|
|
$this->expectException($expectedexception);
|
|
}
|
|
$stub->validate_rule('customcompletionrule');
|
|
}
|
|
|
|
/**
|
|
* Test for is_available().
|
|
*/
|
|
public function test_is_available(): void {
|
|
$stub = $this->setup_mock([
|
|
'get_available_custom_rules',
|
|
]);
|
|
|
|
// Mock activity_custom_completion's get_available_custom_rules() method.
|
|
$stub->expects($this->any())
|
|
->method('get_available_custom_rules')
|
|
->willReturn(['rule1', 'rule2']);
|
|
|
|
// Rule is available.
|
|
$this->assertTrue($stub->is_available('rule1'));
|
|
|
|
// Rule is not available.
|
|
$this->assertFalse($stub->is_available('rule'));
|
|
}
|
|
}
|