Merge branch 'MDL-78457' of https://github.com/paulholden/moodle
[moodle.git] / lib / tests / analysers_test.php
blob875646c6b16a398884a5a59d91eabbc45e6b00d7
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.
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 namespace core;
19 use test_target_course_level_shortname;
20 use test_target_shortname;
22 defined('MOODLE_INTERNAL') || die();
24 require_once(__DIR__ . '/../../analytics/tests/fixtures/test_target_course_level_shortname.php');
25 require_once(__DIR__ . '/../../analytics/tests/fixtures/test_target_shortname.php');
26 require_once(__DIR__ . '/../../lib/enrollib.php');
28 /**
29 * Unit tests for core analysers.
31 * @package core
32 * @category test
33 * @copyright 2017 David MonllaĆ³ {@link http://www.davidmonllao.com}
34 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36 class analysers_test extends \advanced_testcase {
38 /**
39 * test_courses_analyser
41 * @return void
43 public function test_courses_analyser() {
44 $this->resetAfterTest(true);
46 $course1 = $this->getDataGenerator()->create_course();
47 $coursecontext = \context_course::instance($course1->id);
49 $target = new test_target_shortname();
50 $analyser = new \core\analytics\analyser\courses(1, $target, [], [], []);
51 $analysable = new \core_analytics\course($course1);
53 $this->assertInstanceOf('\core_analytics\course', $analyser->get_sample_analysable($course1->id));
55 $this->assertInstanceOf('\context_course', $analyser->sample_access_context($course1->id));
57 // Just 1 sample per course.
58 $class = new \ReflectionClass('\core\analytics\analyser\courses');
59 $method = $class->getMethod('get_all_samples');
60 list($sampleids, $samplesdata) = $method->invoke($analyser, $analysable);
61 $this->assertCount(1, $sampleids);
62 $sampleid = reset($sampleids);
63 $this->assertEquals($course1->id, $sampleid);
64 $this->assertEquals($course1->fullname, $samplesdata[$sampleid]['course']->fullname);
65 $this->assertEquals($coursecontext, $samplesdata[$sampleid]['context']);
67 // To compare it later.
68 $prevsampledata = $samplesdata[$sampleid];
69 list($sampleids, $samplesdata) = $analyser->get_samples(array($sampleid));
70 $this->assertEquals($prevsampledata['context'], $samplesdata[$sampleid]['context']);
71 $this->assertEquals($prevsampledata['course']->shortname, $samplesdata[$sampleid]['course']->shortname);
73 // Context restriction.
74 $category1 = $this->getDataGenerator()->create_category();
75 $category1context = \context_coursecat::instance($category1->id);
76 $category2 = $this->getDataGenerator()->create_category();
77 $category2context = \context_coursecat::instance($category2->id);
78 $course2 = $this->getDataGenerator()->create_course(['category' => $category1->id]);
79 $course3 = $this->getDataGenerator()->create_course(['category' => $category2->id]);
80 $this->assertCount(2, $analyser->get_analysables_iterator(false, [$category1context, $category2context]));
84 /**
85 * test_site_courses_analyser
87 * @return void
89 public function test_site_courses_analyser() {
90 $this->resetAfterTest(true);
92 $course1 = $this->getDataGenerator()->create_course();
93 $course2 = $this->getDataGenerator()->create_course();
94 $course3 = $this->getDataGenerator()->create_course();
95 $course1context = \context_course::instance($course1->id);
97 $target = new test_target_shortname();
98 $analyser = new \core\analytics\analyser\site_courses(1, $target, [], [], []);
99 $analysable = new \core_analytics\site();
101 $this->assertInstanceOf('\core_analytics\site', $analyser->get_sample_analysable($course1->id));
102 $this->assertInstanceOf('\core_analytics\site', $analyser->get_sample_analysable($course2->id));
104 $this->assertInstanceOf('\context_system', $analyser->sample_access_context($course1->id));
105 $this->assertInstanceOf('\context_system', $analyser->sample_access_context($course3->id));
107 $class = new \ReflectionClass('\core\analytics\analyser\site_courses');
108 $method = $class->getMethod('get_all_samples');
109 list($sampleids, $samplesdata) = $method->invoke($analyser, $analysable);
110 $this->assertCount(3, $sampleids);
112 // Use course1 it does not really matter.
113 $this->assertArrayHasKey($course1->id, $sampleids);
114 $sampleid = $course1->id;
115 $this->assertEquals($course1->id, $sampleid);
116 $this->assertEquals($course1->fullname, $samplesdata[$sampleid]['course']->fullname);
117 $this->assertEquals($course1context, $samplesdata[$sampleid]['context']);
119 // To compare it later.
120 $prevsampledata = $samplesdata[$sampleid];
121 list($sampleids, $samplesdata) = $analyser->get_samples(array($sampleid));
122 $this->assertEquals($prevsampledata['context'], $samplesdata[$sampleid]['context']);
123 $this->assertEquals($prevsampledata['course']->shortname, $samplesdata[$sampleid]['course']->shortname);
127 * test_student_enrolments_analyser
129 * @return void
131 public function test_student_enrolments_analyser() {
132 global $DB;
134 $this->resetAfterTest(true);
136 $course1 = $this->getDataGenerator()->create_course();
137 $course1context = \context_course::instance($course1->id);
139 $user1 = $this->getDataGenerator()->create_user();
140 $user2 = $this->getDataGenerator()->create_user();
141 $user3 = $this->getDataGenerator()->create_user();
143 // Checking that suspended users are also included.
144 $this->getDataGenerator()->enrol_user($user1->id, $course1->id, 'student');
145 $this->getDataGenerator()->enrol_user($user2->id, $course1->id, 'student', 'manual', 0, 0, ENROL_USER_SUSPENDED);
146 $this->getDataGenerator()->enrol_user($user3->id, $course1->id, 'editingteacher');
147 $enrol = $DB->get_record('enrol', array('courseid' => $course1->id, 'enrol' => 'manual'));
148 $ue1 = $DB->get_record('user_enrolments', array('userid' => $user1->id, 'enrolid' => $enrol->id));
149 $ue2 = $DB->get_record('user_enrolments', array('userid' => $user2->id, 'enrolid' => $enrol->id));
151 $target = new test_target_shortname();
152 $analyser = new \core\analytics\analyser\student_enrolments(1, $target, [], [], []);
153 $analysable = new \core_analytics\course($course1);
155 $this->assertInstanceOf('\core_analytics\course', $analyser->get_sample_analysable($ue1->id));
156 $this->assertInstanceOf('\context_course', $analyser->sample_access_context($ue1->id));
158 $class = new \ReflectionClass('\core\analytics\analyser\student_enrolments');
159 $method = $class->getMethod('get_all_samples');
160 list($sampleids, $samplesdata) = $method->invoke($analyser, $analysable);
161 // Only students.
162 $this->assertCount(2, $sampleids);
164 $this->assertArrayHasKey($ue1->id, $sampleids);
165 $this->assertArrayHasKey($ue2->id, $sampleids);
167 // Shouldn't matter which one we select.
168 $sampleid = $ue1->id;
169 $this->assertEquals($ue1, $samplesdata[$sampleid]['user_enrolments']);
170 $this->assertEquals($course1->fullname, $samplesdata[$sampleid]['course']->fullname);
171 $this->assertEquals($course1context, $samplesdata[$sampleid]['context']);
172 $this->assertEquals($user1->firstname, $samplesdata[$sampleid]['user']->firstname);
174 // To compare it later.
175 $prevsampledata = $samplesdata[$sampleid];
176 list($sampleids, $samplesdata) = $analyser->get_samples(array($sampleid));
177 $this->assertEquals($prevsampledata['user_enrolments'], $samplesdata[$sampleid]['user_enrolments']);
178 $this->assertEquals($prevsampledata['context'], $samplesdata[$sampleid]['context']);
179 $this->assertEquals($prevsampledata['course']->shortname, $samplesdata[$sampleid]['course']->shortname);
180 $this->assertEquals($prevsampledata['user']->firstname, $samplesdata[$sampleid]['user']->firstname);
182 // Context restriction.
183 $category1 = $this->getDataGenerator()->create_category();
184 $category1context = \context_coursecat::instance($category1->id);
185 $category2 = $this->getDataGenerator()->create_category();
186 $category2context = \context_coursecat::instance($category2->id);
187 $course2 = $this->getDataGenerator()->create_course(['category' => $category1->id]);
188 $course3 = $this->getDataGenerator()->create_course(['category' => $category2->id]);
189 $this->assertCount(2, $analyser->get_analysables_iterator(false, [$category1context, $category2context]));
193 * test_get_analysables_iterator description
195 * @return null
197 public function test_get_analysables_iterator() {
198 global $DB;
200 $this->resetAfterTest(true);
202 $courses = array();
203 for ($i = 0; $i < 2; $i++) {
204 $course = $this->getDataGenerator()->create_course();
205 $analysable = new \core_analytics\course($course);
206 $courses[$analysable->get_id()] = $course;
209 // Check that the analysis performs as expected.
210 $modelid = 1;
211 $includetarget = false;
213 $target = new test_target_course_level_shortname();
214 $analyser = new \core\analytics\analyser\courses($modelid, $target, [], [], []);
216 $result = new \core_analytics\local\analysis\result_array($modelid, $includetarget, []);
217 $analysis = new \core_analytics\analysis($analyser, $includetarget, $result);
218 $analysis->run();
219 $params = array('modelid' => $modelid, 'action' => 'prediction');
220 $this->assertEquals(2, $DB->count_records('analytics_used_analysables', $params));
222 // Check that the previous records do not conflict with the includetarget == false ones.
223 $includetarget = true;
225 $target = new test_target_course_level_shortname();
226 $analyser = new \core\analytics\analyser\courses($modelid, $target, [], [], []);
228 $result = new \core_analytics\local\analysis\result_array($modelid, $includetarget, []);
229 $analysis = new \core_analytics\analysis($analyser, $includetarget, $result);
230 $analysis->run();
231 $params = array('modelid' => $modelid, 'action' => 'prediction');
232 $this->assertEquals(2, $DB->count_records('analytics_used_analysables', $params));
233 $params = array('modelid' => $modelid, 'action' => 'training');
234 $this->assertEquals(2, $DB->count_records('analytics_used_analysables', $params));
235 $params = array('modelid' => $modelid);
236 $this->assertEquals(4, $DB->count_records('analytics_used_analysables', $params));
238 // Check that other models' records do not conflict with previous records.
239 $prevmodelid = 1;
240 $modelid = 2;
241 $includetarget = false;
243 $target = new test_target_course_level_shortname();
244 $analyser = new \core\analytics\analyser\courses($modelid, $target, [], [], []);
246 $result = new \core_analytics\local\analysis\result_array($modelid, $includetarget, []);
247 $analysis = new \core_analytics\analysis($analyser, $includetarget, $result);
248 $analysis->run();
249 $params = array('modelid' => $prevmodelid);
250 $this->assertEquals(4, $DB->count_records('analytics_used_analysables', $params));
251 $params = array('modelid' => $modelid, 'action' => 'prediction');
252 $this->assertEquals(2, $DB->count_records('analytics_used_analysables', $params));
253 $this->assertEquals(6, $DB->count_records('analytics_used_analysables'));
255 $includetarget = true;
257 $target = new test_target_course_level_shortname();
258 $analyser = new \core\analytics\analyser\courses($modelid, $target, [], [], []);
260 $result = new \core_analytics\local\analysis\result_array($modelid, $includetarget, []);
261 $analysis = new \core_analytics\analysis($analyser, $includetarget, $result);
262 $analysis->run();
263 $params = array('modelid' => $prevmodelid);
264 $this->assertEquals(4, $DB->count_records('analytics_used_analysables', $params));
265 $params = array('modelid' => $modelid, 'action' => 'training');
266 $this->assertEquals(2, $DB->count_records('analytics_used_analysables', $params));
267 $this->assertEquals(8, $DB->count_records('analytics_used_analysables'));