MDL-34332 completion: timeenrolled not always set correctly
[moodle.git] / completion / tests / completion_completion_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  * Course completion completion_completion unit tests
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 global $CFG;
29 require_once("{$CFG->dirroot}/completion/tests/lib.php");
31 class completion_completion_testcase extends completion_testcase {
33     /**
34      * Things this test needs to be checking for:
35      * - No users are missed!
36      * - The function handles already started users correctly
37      *     e.g. does not alter the record in any way
38      * - The handling of users with multiple enrolments in the same course
39      *     e.g. the lowest non-zero timestart from an active enrolment is used as timeenrolled
40      * - The correct times are used for users enrolled in multiple courses
41      * - Users who have no current enrolments are not handled
42      * - Ignore courses with completion disabled
43      */
44     public function test_completion_completion_save() {
45         global $CFG, $DB;
47         $this->_create_complex_testdata();
49         $course1 = $this->_testcourses[1];
50         $course2 = $this->_testcourses[2];
51         $course3 = $this->_testcourses[3];
53         $user1 = $this->_testusers[1];
54         $user2 = $this->_testusers[2];
55         $user3 = $this->_testusers[3];
56         $user4 = $this->_testusers[4];
58         $now =    $this->_testdates['now'];
59         $past =   $this->_testdates['past'];
60         $future = $this->_testdates['future'];
62         // Run functionality to test
63         require_once("{$CFG->dirroot}/completion/completion_completion.php");
64         $completions = array(
65             $course1->id => array(
66                 $user1->id, $user2->id, $user3->id, $user4->id
67             ),
68             $course2->id => array(
69                 $user1->id, $user2->id, $user3->id, $user4->id
70             )
71         );
73         foreach ($completions as $course => $users) {
74             foreach ($users as $user) {
75                 $params = array(
76                     'userid' => $user,
77                     'course' => $course
78                 );
79                 $completion = new completion_completion($params, true);
80                 $completion->mark_inprogress();
81             }
82         }
84         // Load all records for these courses in course_completions
85         // Return results indexed by userid (which will not hide duplicates due to their being a unique index on that and the course columns)
86         $cc1 = $DB->get_records('course_completions', array('course' => $course1->id), '', 'userid, *');
87         $cc2 = $DB->get_records('course_completions', array('course' => $course2->id), '', 'userid, *');
88         $cc3 = $DB->get_records('course_completions', array('course' => $course3->id), '', 'userid, *');
90         // Test results
91         // Check correct number of records
92         $this->assertEquals(4, $DB->count_records('course_completions', array('course' => $course1->id)));
93         $this->assertEquals(4, $DB->count_records('course_completions', array('course' => $course2->id)));
95         // All users should be mark started in course1
96         $this->assertEquals($past-2,    $cc1[$user2->id]->timeenrolled);
97         $this->assertGreaterThanOrEqual($now, $cc1[$user4->id]->timeenrolled);
98         $this->assertLessThan($now + 60, $cc1[$user4->id]->timeenrolled);
100         // User1 should have a timeenrolled in course1 of $past-5 (due to multiple enrolments)
101         $this->assertEquals($past-5,    $cc1[$user1->id]->timeenrolled);
103         // User3 should have a timeenrolled in course1 of $past-2 (due to multiple enrolments)
104         $this->assertEquals($past-2,    $cc1[$user3->id]->timeenrolled);
106         // User 2 was not enrolled in course2 (nothing current) so timeenrolled should be current time
107         $this->assertGreaterThanOrEqual($now, $cc2[$user2->id]->timeenrolled);
108         $this->assertLessThan($now + 60, $cc2[$user2->id]->timeenrolled);
110         // Add some enrolment to course2 with different times to check for bugs
111         $this->assertEquals($past-10,   $cc2[$user1->id]->timeenrolled);
112         $this->assertEquals($past-15,   $cc2[$user3->id]->timeenrolled);
114         // Add enrolment in course2 for user4 (who will be already started)
115         $this->assertEquals($past-50,   $cc2[$user4->id]->timeenrolled);
117         // Check no records in course with completion disabled
118         $this->assertEquals(0, $DB->count_records('course_completions', array('course' => $course3->id)));
119     }