MDL-59030 testing: Tests for core_course analytics indicators
[moodle.git] / course / tests / indicators_test.php
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/>.
17 /**
18  * Unit tests for core_course indicators.
19  *
20  * @package   core_course
21  * @category  analytics
22  * @copyright 2017 David MonllaĆ³ {@link http://www.davidmonllao.com}
23  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 defined('MOODLE_INTERNAL') || die();
28 require_once(__DIR__ . '/../../completion/criteria/completion_criteria_self.php');
31 /**
32  * Unit tests for core_course indicators.
33  *
34  * @package   core_course
35  * @category  analytics
36  * @copyright 2017 David MonllaĆ³ {@link http://www.davidmonllao.com}
37  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38  */
39 class core_course_indicators_testcase extends advanced_testcase {
41     /**
42      * test_no_teacher
43      *
44      * @return void
45      */
46     public function test_no_teacher() {
47         global $DB;
49         $this->resetAfterTest(true);
51         $course1 = $this->getDataGenerator()->create_course();
52         $course2 = $this->getDataGenerator()->create_course();
53         $coursecontext1 = \context_course::instance($course1->id);
54         $coursecontext2 = \context_course::instance($course2->id);
56         $user = $this->getDataGenerator()->create_user();
58         $this->getDataGenerator()->enrol_user($user->id, $course1->id, 'student');
59         $this->getDataGenerator()->enrol_user($user->id, $course2->id, 'teacher');
61         $indicator = new \core_course\analytics\indicator\no_teacher();
63         $sampleids = array($course1->id => $course1->id, $course2->id => $course2->id);
64         $data = array(
65             $course1->id => array(
66                 'context' => $coursecontext1,
67                 'course' => $course1,
68             ),
69             $course2->id => array(
70                 'context' => $coursecontext2,
71                 'course' => $course2,
72             ));
73         $indicator->add_sample_data($data);
75         list($values, $ignored) = $indicator->calculate($sampleids, 'course');
76         $this->assertEquals($indicator::get_min_value(), $values[$course1->id][0]);
77         $this->assertEquals($indicator::get_max_value(), $values[$course2->id][0]);
78     }
80     /**
81      * test_completion_enabled
82      *
83      * @return void
84      */
85     public function test_completion_enabled() {
86         global $DB;
88         $this->resetAfterTest(true);
90         $course1 = $this->getDataGenerator()->create_course(array('enablecompletion' => 0));
91         $course2 = $this->getDataGenerator()->create_course(array('enablecompletion' => 1));
92         $course3 = $this->getDataGenerator()->create_course(array('enablecompletion' => 1));
94         // Criteria only for the last one.
95         $criteriadata = new stdClass();
96         $criteriadata->id = $course3->id;
97         $criteriadata->criteria_self = 1;
98         $criterion = new completion_criteria_self();
99         $criterion->update_config($criteriadata);
101         $indicator = new \core_course\analytics\indicator\completion_enabled();
103         $sampleids = array($course1->id => $course1->id, $course2->id => $course2->id, $course3->id => $course3->id);
104         $data = array(
105             $course1->id => array(
106                 'course' => $course1,
107             ),
108             $course2->id => array(
109                 'course' => $course2,
110             ),
111             $course3->id => array(
112                 'course' => $course3,
113             ));
114         $indicator->add_sample_data($data);
116         // Calculate using course samples.
117         list($values, $ignored) = $indicator->calculate($sampleids, 'course');
118         $this->assertEquals($indicator::get_min_value(), $values[$course1->id][0]);
119         $this->assertEquals($indicator::get_min_value(), $values[$course2->id][0]);
120         $this->assertEquals($indicator::get_max_value(), $values[$course3->id][0]);
122         // Calculate using course_modules samples.
123         $indicator->clear_sample_data();
124         $data1 = $this->getDataGenerator()->create_module('data', array('course' => $course3->id),
125                                                              array('completion' => 0));
126         $data2 = $this->getDataGenerator()->create_module('data', array('course' => $course3->id),
127                                                              array('completion' => 1));
129         $sampleids = array($data1->cmid => $data1->cmid, $data2->cmid => $data2->cmid);
130         $cm1 = $DB->get_record('course_modules', array('id' => $data1->cmid));
131         $cm2 = $DB->get_record('course_modules', array('id' => $data2->cmid));
132         $data = array(
133             $cm1->id => array(
134                 'course' => $course3,
135                 'course_modules' => $cm1,
136             ),
137             $cm2->id => array(
138                 'course' => $course3,
139                 'course_modules' => $cm2,
140             ));
141         $indicator->add_sample_data($data);
143         list($values, $ignored) = $indicator->calculate($sampleids, 'course_modules');
144         $this->assertEquals($indicator::get_min_value(), $values[$cm1->id][0]);
145         $this->assertEquals($indicator::get_max_value(), $values[$cm2->id][0]);
146     }
148     /**
149      * test_potential_cognitive
150      *
151      * @return void
152      */
153     public function test_potential_cognitive() {
154         global $DB;
156         $this->resetAfterTest(true);
158         $course1 = $this->getDataGenerator()->create_course();
160         $course2 = $this->getDataGenerator()->create_course();
161         $page = $this->getDataGenerator()->create_module('page', array('course' => $course2->id));
163         $course3 = $this->getDataGenerator()->create_course();
164         $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course3->id));
165         $assign = $this->getDataGenerator()->create_module('assign', array('course' => $course3->id));
167         $course4 = $this->getDataGenerator()->create_course();
168         $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course4->id));
169         $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course4->id));
171         $indicator = new \core_course\analytics\indicator\potential_cognitive_depth();
173         $sampleids = array($course1->id => $course1->id, $course2->id => $course2->id, $course3->id => $course3->id,
174             $course4->id => $course4->id);
175         $data = array(
176             $course1->id => array(
177                 'course' => $course1,
178             ),
179             $course2->id => array(
180                 'course' => $course2,
181             ),
182             $course3->id => array(
183                 'course' => $course3,
184             ),
185             $course4->id => array(
186                 'course' => $course4,
187             ));
188         $indicator->add_sample_data($data);
190         list($values, $ignored) = $indicator->calculate($sampleids, 'course');
191         $this->assertEquals($indicator::get_min_value(), $values[$course1->id][0]);
193         // General explanation about the points, the max level is 5 so level 1 is -1, level 2 is -0.5, level 3 is 0,
194         // level 4 is 0.5 and level 5 is 1.
196         // Page cognitive is level 1 (the lower one).
197         $this->assertEquals($indicator::get_min_value(), $values[$course2->id][0]);
199         // The maximum cognitive depth level is 5, assign level is 5 therefore the potential cognitive depth is the max.
200         $this->assertEquals($indicator::get_max_value(), $values[$course3->id][0]);
202         // Forum level is 4.
203         $this->assertEquals(0.5, $values[$course4->id][0]);
205         // Calculate using course_modules samples.
206         $course5 = $this->getDataGenerator()->create_course();
207         $assign = $this->getDataGenerator()->create_module('assign', array('course' => $course5->id));
208         $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course5->id));
210         $sampleids = array($assign->cmid => $assign->cmid, $forum->cmid => $forum->cmid);
211         $cm1 = $DB->get_record('course_modules', array('id' => $assign->cmid));
212         $cm2 = $DB->get_record('course_modules', array('id' => $forum->cmid));
213         $data = array(
214             $cm1->id => array(
215                 'course' => $course5,
216                 'course_modules' => $cm1,
217             ),
218             $cm2->id => array(
219                 'course' => $course5,
220                 'course_modules' => $cm2,
221             ));
222         $indicator->clear_sample_data();
223         $indicator->add_sample_data($data);
225         list($values, $ignored) = $indicator->calculate($sampleids, 'course_modules');
226         // Assign level is 5, the maximum level.
227         $this->assertEquals($indicator::get_max_value(), $values[$cm1->id][0]);
228         // Forum level is 4.
229         $this->assertEquals(0.5, $values[$cm2->id][0]);
231     }
233     /**
234      * test_potential_social
235      *
236      * @return void
237      */
238     public function test_potential_social() {
239         global $DB;
241         $this->resetAfterTest(true);
243         $course1 = $this->getDataGenerator()->create_course();
245         $course2 = $this->getDataGenerator()->create_course();
246         $page = $this->getDataGenerator()->create_module('page', array('course' => $course2->id));
248         $course3 = $this->getDataGenerator()->create_course();
249         $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course3->id));
250         $assign = $this->getDataGenerator()->create_module('assign', array('course' => $course3->id));
252         $course4 = $this->getDataGenerator()->create_course();
253         $page = $this->getDataGenerator()->create_module('page', array('course' => $course4->id));
254         $assign = $this->getDataGenerator()->create_module('assign', array('course' => $course4->id));
256         $indicator = new \core_course\analytics\indicator\potential_social_breadth();
258         $sampleids = array($course1->id => $course1->id, $course2->id => $course2->id, $course3->id => $course3->id,
259             $course4->id => $course4->id);
260         $data = array(
261             $course1->id => array(
262                 'course' => $course1,
263             ),
264             $course2->id => array(
265                 'course' => $course2,
266             ),
267             $course3->id => array(
268                 'course' => $course3,
269             ),
270             $course4->id => array(
271                 'course' => $course4,
272             ));
273         $indicator->add_sample_data($data);
275         list($values, $ignored) = $indicator->calculate($sampleids, 'course');
276         $this->assertEquals($indicator::get_min_value(), $values[$course1->id][0]);
278         // General explanation about the points, the max level is 2 so level 1 is -1, level 2 is 1.
280         // Page social is level 1 (the lower level).
281         $this->assertEquals($indicator::get_min_value(), $values[$course2->id][0]);
283         // Forum is level 2 and assign is level 2.
284         $this->assertEquals($indicator::get_max_value(), $values[$course3->id][0]);
286         // Page is level 1 and assign is level 2, so potential level is the max one.
287         $this->assertEquals($indicator::get_max_value(), $values[$course4->id][0]);
289         // Calculate using course_modules samples.
290         $course5 = $this->getDataGenerator()->create_course();
291         $assign = $this->getDataGenerator()->create_module('assign', array('course' => $course5->id));
292         $page = $this->getDataGenerator()->create_module('page', array('course' => $course5->id));
294         $sampleids = array($assign->cmid => $assign->cmid, $page->cmid => $page->cmid);
295         $cm1 = $DB->get_record('course_modules', array('id' => $assign->cmid));
296         $cm2 = $DB->get_record('course_modules', array('id' => $page->cmid));
297         $data = array(
298             $cm1->id => array(
299                 'course' => $course5,
300                 'course_modules' => $cm1,
301             ),
302             $cm2->id => array(
303                 'course' => $course5,
304                 'course_modules' => $cm2,
305             ));
306         $indicator->clear_sample_data();
307         $indicator->add_sample_data($data);
309         list($values, $ignored) = $indicator->calculate($sampleids, 'course_modules');
310         // Assign social is level 2 (the max level).
311         $this->assertEquals($indicator::get_max_value(), $values[$cm1->id][0]);
312         // Page social is level 1 (the lower level).
313         $this->assertEquals($indicator::get_min_value(), $values[$cm2->id][0]);
314     }