Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1441 ariadna 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 core_courseformat;
18
 
19
/**
20
 * Tests for course
21
 *
22
 * @package    core_courseformat
23
 * @category   test
24
 * @copyright  2025 Ferran Recio <ferran@moodle.com>
25
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26
 * @covers     \core_courseformat\activityoverviewbase
27
 */
28
final class activityoverviewbase_test extends \advanced_testcase {
29
    #[\Override()]
30
    public static function setUpBeforeClass(): void {
31
        global $CFG;
32
        require_once($CFG->libdir . '/completionlib.php');
33
        require_once($CFG->dirroot . '/course/format/tests/fixtures/fake_activityoverview.php');
34
        require_once($CFG->libdir . '/gradelib.php');
35
        parent::setUpBeforeClass();
36
    }
37
 
38
    /**
39
     * Test get_name_overview method.
40
     *
41
     * @covers ::get_name_overview
42
     */
43
    public function test_get_name_overview(): void {
44
        $this->resetAfterTest();
45
        $this->setAdminUser();
46
 
47
        $generator = $this->getDataGenerator();
48
        $course = $generator->create_course();
49
        $activity = $this->getDataGenerator()->create_module('assign', ['course' => $course->id, 'name' => 'Test!']);
50
        $modinfo = get_fast_modinfo($course);
51
        $cm = $modinfo->get_cm($activity->cmid);
52
 
53
        $overview = new \core_courseformat\fake_activityoverview($cm);
54
 
55
        $result = $overview->get_name_overview();
56
        $this->assertEquals(get_string('name'), $result->get_name());
57
        $this->assertEquals('Test!', $result->get_value());
58
        $this->assertInstanceOf(\core_courseformat\output\local\overview\activityname::class, $result->get_content());
59
    }
60
 
61
    /**
62
     * Test get_completion_overview method.
63
     *
64
     * @covers ::get_completion_overview
65
     * @dataProvider provider_get_completion_overview
66
     * @param int $setcompletion the completion status
67
     */
68
    public function test_get_completion_overview(
69
        int $setcompletion,
70
    ): void {
71
        $this->resetAfterTest();
72
        $this->setAdminUser();
73
 
74
        $generator = $this->getDataGenerator();
75
        $course = $generator->create_course(['enablecompletion' => 1]);
76
 
77
        $user = $generator->create_user();
78
        $generator->enrol_user($user->id, $course->id);
79
 
80
        $this->setAdminUser();
81
 
82
        $activity = $this->getDataGenerator()->create_module(
83
            'assign',
84
            ['course' => $course->id, 'completion' => \COMPLETION_TRACKING_AUTOMATIC]
85
        );
86
 
87
        rebuild_course_cache($course->id, true);
88
        $modinfo = get_fast_modinfo($course);
89
        $cm = $modinfo->get_cm($activity->cmid);
90
 
91
        $overview = new \core_courseformat\fake_activityoverview($cm);
92
 
93
        $completion = (object) [
94
            'coursemoduleid' => $cm->id,
95
            'timemodified' => time(),
96
            'viewed' => \COMPLETION_NOT_VIEWED,
97
            'overrideby' => null,
98
            'id' => 0,
99
            'completionstate' => $setcompletion,
100
            'userid' => $user->id,
101
        ];
102
        $comletioninfo = new \completion_info($course);
103
        $comletioninfo->internal_set_data($cm, $completion, true);
104
 
105
        $this->setUser($user);
106
 
107
        $result = $overview->get_completion_overview();
108
        $this->assertEquals(get_string('completion_status', 'completion'), $result->get_name());
109
        $this->assertEquals($setcompletion, $result->get_value());
110
        $this->assertInstanceOf(\core_courseformat\output\local\content\cm\completion::class, $result->get_content());
111
    }
112
 
113
    /**
114
     * Data provider for test_get_completion_overview.
115
     *
116
     * @return array the testing scenarios
117
     */
118
    public static function provider_get_completion_overview(): array {
119
        return [
120
            'complet' => [
121
                'setcompletion' => \COMPLETION_COMPLETE,
122
            ],
123
            'incomplete' => [
124
                'setcompletion' => \COMPLETION_INCOMPLETE,
125
            ],
126
            'complete pass' => [
127
                'setcompletion' => \COMPLETION_COMPLETE_PASS,
128
            ],
129
            'complete fail' => [
130
                'setcompletion' => \COMPLETION_COMPLETE_FAIL,
131
            ],
132
        ];
133
    }
134
 
135
    /**
136
     * Test get_completion_overview method on an activity with no completion.
137
     *
138
     * @covers ::get_completion_overview
139
     */
140
    public function test_get_completion_overview_no_completion(): void {
141
        $this->resetAfterTest();
142
        $this->setAdminUser();
143
 
144
        $generator = $this->getDataGenerator();
145
        $course = $generator->create_course(['enablecompletion' => 1]);
146
 
147
        $user = $generator->create_user();
148
        $generator->enrol_user($user->id, $course->id);
149
 
150
        $this->setAdminUser();
151
 
152
        $activity = $this->getDataGenerator()->create_module(
153
            'assign',
154
            ['course' => $course->id]
155
        );
156
 
157
        rebuild_course_cache($course->id, true);
158
        $modinfo = get_fast_modinfo($course);
159
        $cm = $modinfo->get_cm($activity->cmid);
160
 
161
        $overview = new \core_courseformat\fake_activityoverview($cm);
162
 
163
        $this->setUser($user);
164
 
165
        $result = $overview->get_completion_overview();
166
        $this->assertEquals(get_string('completion_status', 'completion'), $result->get_name());
167
        $this->assertEquals(null, $result->get_value());
168
        $this->assertEquals('-', $result->get_content());
169
    }
170
 
171
    /**
172
     * Test get_grades_overviews method.
173
     *
174
     * @covers ::get_grades_overviews
175
     */
176
    public function test_get_grades_overviews(): void {
177
        $this->resetAfterTest();
178
        $this->setAdminUser();
179
 
180
        $generator = $this->getDataGenerator();
181
        $course = $this->getDataGenerator()->create_course();
182
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
183
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
184
 
185
        // Create some modules.
186
        $assign = $this->getDataGenerator()->create_module(
187
            'assign',
188
            ['course' => $course->id]
189
        );
190
        $workshop = $this->getDataGenerator()->create_module(
191
            'workshop',
192
            ['course' => $course->id],
193
            ['grade' => 100.0],
194
        );
195
        $page = $this->getDataGenerator()->create_module(
196
            'page',
197
            ['course' => $course->id]
198
        );
199
 
200
        // Assignments have one grade item.
201
        $assignitems = \grade_item::fetch_all([
202
            'itemtype' => 'mod',
203
            'itemmodule' => 'assign',
204
            'iteminstance' => (int) $assign->id,
205
            'courseid' => $course->id,
206
        ]);
207
        $gradegrade = new \grade_grade();
208
        $gradegrade->itemid = reset($assignitems)->id;
209
        $gradegrade->userid = (int) $student->id;
210
        $gradegrade->rawgrade = 88;
211
        $gradegrade->finalgrade = 88;
212
        $gradegrade->insert();
213
 
214
        // Workshops have two grade items.
215
        $workshopitems = array_values(
216
            \grade_item::fetch_all([
217
                'itemtype' => 'mod',
218
                'itemmodule' => 'workshop',
219
                'iteminstance' => (int) $workshop->id,
220
                'courseid' => $course->id,
221
                ['grade' => 100.0],
222
            ])
223
        );
224
        $gradegrade = new \grade_grade();
225
        $gradegrade->itemid = reset($workshopitems)->id;
226
        $gradegrade->userid = (int) $student->id;
227
        $gradegrade->rawgrade = 77;
228
        $gradegrade->finalgrade = 77;
229
        $gradegrade->insert();
230
 
231
        // Validate student grades.
232
        $this->setUser($student);
233
        $modinfo = get_fast_modinfo($course);
234
 
235
        // Validate assign gradeitems.
236
        $cm = $modinfo->get_cm($assign->cmid);
237
        $overview = new \core_courseformat\fake_activityoverview($cm);
238
        $result = $overview->get_grades_overviews();
239
        $this->assertCount(1, $result);
240
        $this->assertEquals(get_string('gradenoun'), $result[0]->get_name());
241
        $this->assertEquals(88, $result[0]->get_value());
242
        $this->assertEquals('88.00', $result[0]->get_content());
243
 
244
        // Validate workshop gradeitems (having two grade, they should return an empty array).
245
        $cm = $modinfo->get_cm($workshop->cmid);
246
        $overview = new \core_courseformat\fake_activityoverview($cm);
247
        $result = $overview->get_grades_overviews();
248
        $this->assertEmpty($result);
249
 
250
        // Validate page has no gradeitems.
251
        $cm = $modinfo->get_cm($page->cmid);
252
        $overview = new \core_courseformat\fake_activityoverview($cm);
253
        $result = $overview->get_grades_overviews();
254
        $this->assertEmpty($result);
255
 
256
        // Validate teacher does not has grade overiviews items.
257
        $this->setUser($teacher);
258
        $modinfo = get_fast_modinfo($course);
259
 
260
        // Validate assign gradeitems.
261
        $cm = $modinfo->get_cm($assign->cmid);
262
        $overview = new \core_courseformat\fake_activityoverview($cm);
263
        $result = $overview->get_grades_overviews();
264
        $this->assertEmpty($result);;
265
 
266
        // Validate workshop gradeitems (having two grade, they should return an empty array).
267
        $cm = $modinfo->get_cm($workshop->cmid);
268
        $overview = new \core_courseformat\fake_activityoverview($cm);
269
        $result = $overview->get_grades_overviews();
270
        $this->assertEmpty($result);
271
 
272
        // Validate page has no gradeitems.
273
        $cm = $modinfo->get_cm($page->cmid);
274
        $overview = new \core_courseformat\fake_activityoverview($cm);
275
        $result = $overview->get_grades_overviews();
276
        $this->assertEmpty($result);
277
    }
278
 
279
    /**
280
     * Test get_grades_overviews when the grade item is hidden.
281
     *
282
     * @covers ::get_grades_overviews
283
     */
284
    /**
285
     * Test get_grades_overviews method.
286
     *
287
     * @covers ::get_grades_overviews
288
     */
289
    public function test_get_grades_overviews_hidden(): void {
290
        $this->resetAfterTest();
291
        $this->setAdminUser();
292
 
293
        $generator = $this->getDataGenerator();
294
        $course = $this->getDataGenerator()->create_course();
295
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
296
 
297
        // Create some modules.
298
        $assign = $this->getDataGenerator()->create_module(
299
            'assign',
300
            ['course' => $course->id]
301
        );
302
 
303
        // Assignments have one grade item.
304
        $assignitems = \grade_item::fetch_all([
305
            'itemtype' => 'mod',
306
            'itemmodule' => 'assign',
307
            'iteminstance' => (int) $assign->id,
308
            'courseid' => $course->id,
309
        ]);
310
        $gradeitem = reset($assignitems);
311
        $gradegrade = new \grade_grade();
312
        $gradegrade->itemid = $gradeitem->id;
313
        $gradegrade->userid = (int) $student->id;
314
        $gradegrade->rawgrade = 88;
315
        $gradegrade->finalgrade = 88;
316
        $gradegrade->insert();
317
 
318
        // Hide some grades.
319
        $gradeitem->set_hidden(1, true);
320
 
321
        // Validate student grades.
322
        $this->setUser($student);
323
        $modinfo = get_fast_modinfo($course);
324
 
325
        // Validate assign gradeitems.
326
        $cm = $modinfo->get_cm($assign->cmid);
327
        $overview = new \core_courseformat\fake_activityoverview($cm);
328
        $result = $overview->get_grades_overviews();
329
        $this->assertCount(1, $result);
330
        $this->assertEquals(get_string('gradenoun'), $result[0]->get_name());
331
        $this->assertEquals('-', $result[0]->get_value());
332
        $this->assertEquals('-', $result[0]->get_content());
333
    }
334
}