Proyectos de Subversion Moodle

Rev

Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
/**
18
 * Contains unit tests for core_completion/activity_custom_completion.
19
 *
20
 * @package   mod_feedback
21
 * @copyright Simey Lameze <simey@moodle.com>
22
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23
 */
24
 
25
declare(strict_types=1);
26
 
27
namespace mod_feedback;
28
 
29
use advanced_testcase;
30
use cm_info;
31
use coding_exception;
32
use mod_feedback\completion\custom_completion;
33
use moodle_exception;
34
 
35
defined('MOODLE_INTERNAL') || die();
36
 
37
global $CFG;
38
require_once($CFG->libdir . '/completionlib.php');
39
 
40
/**
41
 * Class for unit testing mod_feedback/activity_custom_completion.
42
 *
43
 * @package   mod_feedback
44
 * @copyright Simey Lameze <simey@moodle.com>
45
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
46
 */
47
class custom_completion_test extends advanced_testcase {
48
 
49
    /**
50
     * Data provider for get_state().
51
     *
52
     * @return array[]
53
     */
54
    public function get_state_provider(): array {
55
        return [
56
            'Undefined rule' => [
57
                'somenonexistentrule', COMPLETION_DISABLED, false, null, coding_exception::class
58
            ],
59
            'Rule not available' => [
60
                'completionsubmit', COMPLETION_DISABLED, false, null, moodle_exception::class
61
            ],
62
            'Rule available, user has not submitted' => [
63
                'completionsubmit', COMPLETION_ENABLED, false, COMPLETION_INCOMPLETE, null
64
            ],
65
            'Rule available, user has submitted' => [
66
                'completionsubmit', COMPLETION_ENABLED, true, COMPLETION_COMPLETE, null
67
            ],
68
        ];
69
    }
70
 
71
    /**
72
     * Test for get_state().
73
     *
74
     * @dataProvider get_state_provider
75
     * @param string $rule The custom completion rule.
76
     * @param int $available Whether this rule is available.
77
     * @param bool $submitted
78
     * @param int|null $status Expected status.
79
     * @param string|null $exception Expected exception.
80
     */
81
    public function test_get_state(string $rule, int $available, ?bool $submitted, ?int $status, ?string $exception) {
82
        global $DB;
83
 
84
        if (!is_null($exception)) {
85
            $this->expectException($exception);
86
        }
87
 
88
        // Custom completion rule data for cm_info::customdata.
89
        $customdataval = [
90
            'customcompletionrules' => [
91
                $rule => $available
92
            ]
93
        ];
94
 
95
        // Build a mock cm_info instance.
96
        $mockcminfo = $this->getMockBuilder(cm_info::class)
97
            ->disableOriginalConstructor()
98
            ->onlyMethods(['__get'])
99
            ->getMock();
100
 
101
        // Mock the return of the magic getter method when fetching the cm_info object's customdata and instance values.
102
        $mockcminfo->expects($this->any())
103
            ->method('__get')
104
            ->will($this->returnValueMap([
105
                ['customdata', $customdataval],
106
                ['instance', 1],
107
            ]));
108
 
109
        // Mock the DB calls.
110
        $DB = $this->createMock(get_class($DB));
111
        $DB->expects($this->atMost(1))
112
            ->method('record_exists')
113
            ->willReturn($submitted);
114
 
115
        $customcompletion = new custom_completion($mockcminfo, 2);
116
        $this->assertEquals($status, $customcompletion->get_state($rule));
117
    }
118
 
119
    /**
120
     * Test for get_defined_custom_rules().
121
     */
122
    public function test_get_defined_custom_rules() {
123
        $rules = custom_completion::get_defined_custom_rules();
124
        $this->assertCount(1, $rules);
125
        $this->assertEquals('completionsubmit', reset($rules));
126
    }
127
 
128
    /**
129
     * Test for get_defined_custom_rule_descriptions().
130
     */
131
    public function test_get_custom_rule_descriptions() {
132
        // Get defined custom rules.
133
        $rules = custom_completion::get_defined_custom_rules();
134
 
135
        // Build a mock cm_info instance.
136
        $mockcminfo = $this->getMockBuilder(cm_info::class)
137
            ->disableOriginalConstructor()
138
            ->onlyMethods(['__get'])
139
            ->getMock();
140
 
141
        // Instantiate a custom_completion object using the mocked cm_info.
142
        $customcompletion = new custom_completion($mockcminfo, 1);
143
 
144
        // Get custom rule descriptions.
145
        $ruledescriptions = $customcompletion->get_custom_rule_descriptions();
146
 
147
        // Confirm that defined rules and rule descriptions are consistent with each other.
148
        $this->assertEquals(count($rules), count($ruledescriptions));
149
        foreach ($rules as $rule) {
150
            $this->assertArrayHasKey($rule, $ruledescriptions);
151
        }
152
    }
153
 
154
    /**
155
     * Test for is_defined().
156
     */
157
    public function test_is_defined() {
158
        // Build a mock cm_info instance.
159
        $mockcminfo = $this->getMockBuilder(cm_info::class)
160
            ->disableOriginalConstructor()
161
            ->getMock();
162
 
163
        $customcompletion = new custom_completion($mockcminfo, 1);
164
 
165
        // Rule is defined.
166
        $this->assertTrue($customcompletion->is_defined('completionsubmit'));
167
 
168
        // Undefined rule.
169
        $this->assertFalse($customcompletion->is_defined('somerandomrule'));
170
    }
171
 
172
    /**
173
     * Data provider for test_get_available_custom_rules().
174
     *
175
     * @return array[]
176
     */
177
    public function get_available_custom_rules_provider(): array {
178
        return [
179
            'Completion submit available' => [
180
                COMPLETION_ENABLED, ['completionsubmit']
181
            ],
182
            'Completion submit not available' => [
183
                COMPLETION_DISABLED, []
184
            ],
185
        ];
186
    }
187
 
188
    /**
189
     * Test for get_available_custom_rules().
190
     *
191
     * @dataProvider get_available_custom_rules_provider
192
     * @param int $status
193
     * @param array $expected
194
     */
195
    public function test_get_available_custom_rules(int $status, array $expected) {
196
        $customdataval = [
197
            'customcompletionrules' => [
198
                'completionsubmit' => $status
199
            ]
200
        ];
201
 
202
        // Build a mock cm_info instance.
203
        $mockcminfo = $this->getMockBuilder(cm_info::class)
204
            ->disableOriginalConstructor()
205
            ->onlyMethods(['__get'])
206
            ->getMock();
207
 
208
        // Mock the return of magic getter for the customdata attribute.
209
        $mockcminfo->expects($this->any())
210
            ->method('__get')
211
            ->with('customdata')
212
            ->willReturn($customdataval);
213
 
214
        $customcompletion = new custom_completion($mockcminfo, 1);
215
        $this->assertEquals($expected, $customcompletion->get_available_custom_rules());
216
    }
217
}