Proyectos de Subversion Moodle

Rev

Rev 11 | | Comparar con el anterior | 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
namespace tool_monitor;
18
 
19
/**
20
 * Unit tests for the tool_monitor clean events task.
21
 *
22
 * @package    tool_monitor
23
 * @category   test
24
 * @copyright  2014 Mark Nelson <markn@moodle.com>
25
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26
 */
1441 ariadna 27
final class task_clean_events_test extends \advanced_testcase {
1 efrain 28
 
29
    /**
30
     * Test set up.
31
     */
32
    public function setUp(): void {
1441 ariadna 33
        parent::setUp();
1 efrain 34
        set_config('enablemonitor', 1, 'tool_monitor');
35
        $this->resetAfterTest(true);
36
    }
37
 
38
    /**
39
     * Tests the cleaning up of events.
40
     */
11 efrain 41
    public function test_clean_events(): void {
1 efrain 42
        global $DB;
43
 
44
        // Create the necessary items for testing.
45
        $user = $this->getDataGenerator()->create_user();
46
        $course = $this->getDataGenerator()->create_course();
47
        $bookgenerator = $this->getDataGenerator()->get_plugin_generator('mod_book');
48
        $book = $this->getDataGenerator()->create_module('book', array('course' => $course->id));
49
        $bookcontext = \context_module::instance($book->cmid);
50
        $bookchapter = $bookgenerator->create_chapter(array('bookid' => $book->id));
51
        $course2 = $this->getDataGenerator()->create_course();
52
        $book2 = $this->getDataGenerator()->create_module('book', array('course' => $course2->id));
53
        $book2context = \context_module::instance($book2->cmid);
54
        $book2chapter = $bookgenerator->create_chapter(array('bookid' => $book2->id));
55
        $monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
56
 
57
        // Let's set some data for the rules we need before we can generate them.
58
        $rule = new \stdClass();
59
        $rule->userid = $user->id;
60
        $rule->courseid = $course->id;
61
        $rule->plugin = 'mod_book';
62
        $rule->eventname = '\mod_book\event\course_module_viewed';
63
        $rule->timewindow = 500;
64
 
65
        // Let's add a few rules we want to monitor.
66
        $rule1 = $monitorgenerator->create_rule($rule);
67
 
68
        $rule->eventname = '\mod_book\event\course_module_instance_list_viewed';
69
        $rule2 = $monitorgenerator->create_rule($rule);
70
 
71
        // Add the same rules for the same course, but this time with a lower timewindow (used to test that we do not
72
        // remove an event for a course if there is still a rule where the maximum timewindow has not been reached).
73
        $rule->eventname = '\mod_book\event\course_module_viewed';
74
        $rule->timewindow = 200;
75
        $rule3 = $monitorgenerator->create_rule($rule);
76
 
77
        $rule->eventname = '\mod_book\event\course_module_instance_list_viewed';
78
        $rule4 = $monitorgenerator->create_rule($rule);
79
 
80
        // Add another rule in a different course.
81
        $rule->courseid = $course2->id;
82
        $rule->eventname = '\mod_book\event\chapter_viewed';
83
        $rule->timewindow = 200;
84
        $rule5 = $monitorgenerator->create_rule($rule);
85
 
86
        // Add a site wide rule.
87
        $rule->courseid = 0;
88
        $rule->eventname = '\mod_book\event\chapter_viewed';
89
        $rule->timewindow = 500;
90
        $rule6 = $monitorgenerator->create_rule($rule);
91
 
92
 
93
        // Let's subscribe to these rules.
94
        $sub = new \stdClass;
95
        $sub->courseid = $course->id;
96
        $sub->ruleid = $rule1->id;
97
        $sub->userid = $user->id;
98
        $monitorgenerator->create_subscription($sub);
99
 
100
        $sub->ruleid = $rule2->id;
101
        $monitorgenerator->create_subscription($sub);
102
 
103
        $sub->ruleid = $rule3->id;
104
        $monitorgenerator->create_subscription($sub);
105
 
106
        $sub->ruleid = $rule4->id;
107
        $monitorgenerator->create_subscription($sub);
108
 
109
        $sub->ruleid = $rule5->id;
110
        $sub->courseid = $course2->id;
111
        $monitorgenerator->create_subscription($sub);
112
 
113
        $sub->ruleid = $rule6->id;
114
        $sub->courseid = 0;
115
        $monitorgenerator->create_subscription($sub);
116
 
117
        // Now let's populate the tool_monitor table with the events associated with those rules.
118
        \mod_book\event\course_module_viewed::create_from_book($book, $bookcontext)->trigger();
119
        \mod_book\event\course_module_instance_list_viewed::create_from_course($course)->trigger();
120
        \mod_book\event\chapter_viewed::create_from_chapter($book, $bookcontext, $bookchapter)->trigger();
121
 
122
        // Let's trigger the viewed events again, but in another course. The rules created for these events are
123
        // associated with another course, so these events should get deleted when we trigger the cleanup task.
124
        \mod_book\event\course_module_viewed::create_from_book($book2, $book2context)->trigger();
125
        \mod_book\event\course_module_instance_list_viewed::create_from_course($course2)->trigger();
126
        // Trigger a chapter_viewed event in this course - this should not get deleted as the rule is site wide.
127
        \mod_book\event\chapter_viewed::create_from_chapter($book2, $book2context, $book2chapter)->trigger();
128
 
129
        // Trigger a bunch of other events.
130
        $eventparams = array(
131
            'context' => \context_course::instance($course->id)
132
        );
133
        for ($i = 0; $i < 5; $i++) {
134
            \mod_quiz\event\course_module_instance_list_viewed::create($eventparams)->trigger();
135
            \mod_scorm\event\course_module_instance_list_viewed::create($eventparams)->trigger();
136
        }
137
 
138
        // We do not store events that have no subscriptions - so there will be only 4 events.
139
        $this->assertEquals(4, $DB->count_records('tool_monitor_events'));
140
 
141
        // Run the task and check that all the quiz, scorm and rule events are removed as well as the course_module_*
142
        // viewed events in the second course.
143
        $task = new \tool_monitor\task\clean_events();
144
        $task->execute();
145
 
146
        $events = $DB->get_records('tool_monitor_events', array(), 'id');
147
        $this->assertEquals(4, count($events));
148
        $event1 = array_shift($events);
149
        $event2 = array_shift($events);
150
        $event3 = array_shift($events);
151
        $event4 = array_shift($events);
152
        $this->assertEquals('\mod_book\event\course_module_viewed', $event1->eventname);
153
        $this->assertEquals($course->id, $event1->courseid);
154
        $this->assertEquals('\mod_book\event\course_module_instance_list_viewed', $event2->eventname);
155
        $this->assertEquals($course->id, $event2->courseid);
156
        $this->assertEquals('\mod_book\event\chapter_viewed', $event3->eventname);
157
        $this->assertEquals($course->id, $event3->courseid);
158
        $this->assertEquals('\mod_book\event\chapter_viewed', $event4->eventname);
159
        $this->assertEquals($course2->id, $event4->courseid);
160
 
161
        // Update the timewindow for two of the rules.
162
        $updaterule = new \stdClass();
163
        $updaterule->id = $rule1->id;
164
        $updaterule->timewindow = 0;
165
        \tool_monitor\rule_manager::update_rule($updaterule);
166
        $updaterule->id = $rule2->id;
167
        \tool_monitor\rule_manager::update_rule($updaterule);
168
 
169
        // Run the task and check that the events remain as we still have not reached the maximum timewindow.
170
        $task = new \tool_monitor\task\clean_events();
171
        $task->execute();
172
 
173
        $this->assertEquals(4, $DB->count_records('tool_monitor_events'));
174
 
175
        // Now, remove the rules associated with course_module_* events so they get deleted.
176
        \tool_monitor\rule_manager::delete_rule($rule1->id);
177
        \tool_monitor\rule_manager::delete_rule($rule2->id);
178
        \tool_monitor\rule_manager::delete_rule($rule3->id);
179
        \tool_monitor\rule_manager::delete_rule($rule4->id);
180
 
181
        // Run the task and check all the course_module_* events are gone.
182
        $task = new \tool_monitor\task\clean_events();
183
        $task->execute();
184
 
185
        // We now should only have the chapter_viewed events.
186
        $events = $DB->get_records('tool_monitor_events', array(), 'id');
187
        $this->assertEquals(2, count($events));
188
        $event1 = array_shift($events);
189
        $event2 = array_shift($events);
190
        $this->assertEquals('\mod_book\event\chapter_viewed', $event1->eventname);
191
        $this->assertEquals($course->id, $event1->courseid);
192
        $this->assertEquals('\mod_book\event\chapter_viewed', $event2->eventname);
193
        $this->assertEquals($course2->id, $event2->courseid);
194
 
195
        // Set the timewindow of the rule for the event chapter_viewed in the second course to 0.
196
        $updaterule->id = $rule5->id;
197
        \tool_monitor\rule_manager::update_rule($updaterule);
198
 
199
        // Run the task.
200
        $task = new \tool_monitor\task\clean_events();
201
        $task->execute();
202
 
203
        // Check that nothing was deleted as we still have a site wide rule for the chapter_viewed event.
204
        $this->assertEquals(2, $DB->count_records('tool_monitor_events'));
205
 
206
        // Set the timewindow back to 500.
207
        $updaterule->id = $rule5->id;
208
        $updaterule->timewindow = 500;
209
        \tool_monitor\rule_manager::update_rule($updaterule);
210
 
211
        // Set the site rule timewindow to 0.
212
        $updaterule->id = $rule6->id;
213
        $updaterule->timewindow = 0;
214
        \tool_monitor\rule_manager::update_rule($updaterule);
215
 
216
        // Run the task.
217
        $task = new \tool_monitor\task\clean_events();
218
        $task->execute();
219
 
220
        // We now should only have one chapter_viewed event for the second course.
221
        $events = $DB->get_records('tool_monitor_events');
222
        $this->assertEquals(1, count($events));
223
        $event1 = array_shift($events);
224
        $this->assertEquals('\mod_book\event\chapter_viewed', $event1->eventname);
225
        $this->assertEquals($course2->id, $event1->courseid);
226
 
227
        // Remove the site rule.
228
        \tool_monitor\rule_manager::delete_rule($rule6->id);
229
 
230
        // Remove the last remaining rule.
231
        \tool_monitor\rule_manager::delete_rule($rule5->id);
232
 
233
        // Run the task.
234
        $task = new \tool_monitor\task\clean_events();
235
        $task->execute();
236
 
237
        // There should be no events left.
238
        $this->assertEquals(0, $DB->count_records('tool_monitor_events'));
239
    }
240
}