MDL-34332 completion: timeenrolled not always set correctly
[moodle.git] / completion / tests / lib.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  * Course completion unit test helper
19  *
20  * @package    core
21  * @category   phpunit
22  * @copyright  2012 Aaron Barnes <aaronb@catalyst.net.nz>
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 defined('MOODLE_INTERNAL') || die();
28 abstract class completion_testcase extends advanced_testcase {
30     /**
31      * Test data
32      */
33     protected $_testcourses = array();
34     protected $_testusers = array();
35     protected $_testdates = array();
37     protected function _create_complex_testdata() {
38         global $DB;
40         $this->resetAfterTest(true);
42         $gen = $this->getDataGenerator();
44         // Setup a couple of courses
45         $courseparams = array('enablecompletion' => 1, 'completionstartonenrol' => 1);
46         $course1 = $gen->create_course($courseparams);
47         $course2 = $gen->create_course($courseparams);
48         $course3 = $gen->create_course();
50         // Make all enrolment plugins enabled
51         $DB->execute(
52             "
53             UPDATE
54                 {enrol}
55             SET
56                 status = ?
57             WHERE
58                 courseid IN (?, ?, ?)
59             ",
60             array(
61                 ENROL_INSTANCE_ENABLED,
62                 $course1->id, $course2->id, $course3->id
63             )
64         );
66         // Setup some users
67         $user1 = $gen->create_user();
68         $user2 = $gen->create_user();
69         $user3 = $gen->create_user();
70         $user4 = $gen->create_user();
72         // Enrol the users
73         $now    = time();
74         $past   = $now - (60*60*24);
75         $future = $now + (60*60*24);
77         $enrolments = array(
78             // All users should be mark started in course1
79             array($course1->id, $user1->id, $past,      0,              null),
80             array($course1->id, $user2->id, $past-2,    0,              null),
81             array($course1->id, $user3->id, 0,          0,              null),
82             array($course1->id, $user4->id, 0,          0,              null),
83             // User1 should have a timeenrolled in course1 of $past-5 (due to multiple enrolments)
84             array($course1->id, $user1->id, $past-5,    0,              'self'),
85             // User3 should have a timeenrolled in course1 of $past-2 (due to multiple enrolments)
86             array($course1->id, $user3->id, $past-2,    0,              'self'),
87             array($course1->id, $user3->id, $past-100,  $past,          null), // in the past
88             array($course1->id, $user3->id, $future,    $future+100,    null), // in the future
89             // User 2 should not be mark as started in course2 at all (nothing current)
90             array($course2->id, $user2->id, $future,    0,              null),
91             array($course2->id, $user2->id, 0,          $past,          null),
92             // Add some enrolment to course2 with different times to check for bugs
93             array($course2->id, $user1->id, $past-10,   0,              null),
94             array($course2->id, $user3->id, $past-15,   0,              null),
95             // Add enrolment in course2 for user4 (who will be already started)
96             array($course2->id, $user4->id, $past-13,   0,              null),
97             // Add enrolment in course3 even though completion is not enabled
98             array($course3->id, $user1->id, 0,          0,              null),
99             // Add multiple enrolments of same type!
100         );
102         foreach ($enrolments as $enrol) {
103             $enrol = array(
104                 'courseid'  => $enrol[0],
105                 'userid'    => $enrol[1],
106                 'timestart' => $enrol[2],
107                 'timeend'   => $enrol[3],
108                 'plugin'    => $enrol[4]
109             );
110             if (!$gen->create_enrolment($enrol)) {
111                 throw new coding_exception('error creating enrolments in test_completion_cron_mark_started()');
112             }
113         }
115         // Delete all old records in case they were missed
116         $DB->delete_records('course_completions', array('course' => $course1->id));
117         $DB->delete_records('course_completions', array('course' => $course2->id));
118         $DB->delete_records('course_completions', array('course' => $course3->id));
120         // Create course_completions record for user4 in course2
121         $params = array(
122             'course'        => $course2->id,
123             'userid'        => $user4->id,
124             'timeenrolled'  => $past-50,
125             'reaggregate'   => 0
126         );
127         $DB->insert_record('course_completions', $params);
130         $this->_testcourses[1] = $course1;
131         $this->_testcourses[2] = $course2;
132         $this->_testcourses[3] = $course3;
134         $this->_testusers[1] = $user1;
135         $this->_testusers[2] = $user2;
136         $this->_testusers[3] = $user3;
137         $this->_testusers[4] = $user4;
139         $this->_testdates['now'] = $now;
140         $this->_testdates['past'] = $past;
141         $this->_testdates['future'] = $future;
142     }