mirrored from git://git.moodle.org/moodle.git
-
Notifications
You must be signed in to change notification settings - Fork 6.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MDL-70815 core_completion: Unit tests for activity_custom_completion
Tests cover - get_overall_completion_state() - is_available() - validate_rule() Tests don't cover - methods that rely on static methods such as: - is_defined() - static methods in the class because they can't be mocked - abstract methods that can be tested better by the plugins that extend activity_custom_completion such as: - get_state() - get_defined_custom_rules() - get_custom_rule_descriptions()
- Loading branch information
1 parent
6d2e36a
commit e789f01
Showing
1 changed file
with
187 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,187 @@ | ||
<?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 | ||
], | ||
'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) { | ||
$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) { | ||
$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() { | ||
$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')); | ||
} | ||
} |