Proyectos de Subversion Moodle

Rev

Rev 1 | | 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 gradereport_user;
18
 
19
use core_external\external_api;
20
use externallib_advanced_testcase;
21
use gradereport_user\external\user as user_external;
22
 
23
defined('MOODLE_INTERNAL') || die();
24
 
25
global $CFG;
26
 
27
require_once($CFG->dirroot . '/webservice/tests/helpers.php');
28
 
29
/**
30
 * User grade report functions unit tests
31
 *
32
 * @package    gradereport_user
33
 * @category   external
34
 * @copyright  2015 Juan Leyva <juan@moodle.com>
35
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36
 */
37
class externallib_test extends externallib_advanced_testcase {
38
 
39
    /**
40
     * Loads some data to be used by the different tests
41
     * @param  int $s1grade Student 1 grade
42
     * @param  int $s2grade Student 2 grade
43
     * @return array Course and users instances
44
     */
45
    private function load_data(int $s1grade, int $s2grade, int $s3grade): array {
46
        global $DB;
47
 
48
        $course = $this->getDataGenerator()->create_course(['groupmode' => SEPARATEGROUPS, 'groupmodeforce' => 1]);
49
 
50
        $studentrole = $DB->get_record('role', ['shortname' => 'student']);
51
        $student1 = $this->getDataGenerator()->create_user(['idnumber' => 'testidnumber']);
52
        $this->getDataGenerator()->enrol_user($student1->id, $course->id, $studentrole->id);
53
 
54
        $student2 = $this->getDataGenerator()->create_user();
55
        $this->getDataGenerator()->enrol_user($student2->id, $course->id, $studentrole->id);
56
 
57
        // Student 3 is in no groups.
58
        $student3 = $this->getDataGenerator()->create_user();
59
        $this->getDataGenerator()->enrol_user($student3->id, $course->id, $studentrole->id);
60
 
61
        $teacherrole = $DB->get_record('role', ['shortname' => 'teacher']);
62
        $teacher = $this->getDataGenerator()->create_user();
63
        $this->getDataGenerator()->enrol_user($teacher->id, $course->id, $teacherrole->id);
64
 
65
        $context = \context_course::instance($course->id);
66
        assign_capability('moodle/site:accessallgroups', CAP_PROHIBIT, $teacherrole->id, $context);
67
        accesslib_clear_all_caches_for_unit_testing();
68
 
69
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
70
        $group2 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
71
        groups_add_member($group1->id, $student1->id);
72
        groups_add_member($group1->id, $teacher->id);
73
        groups_add_member($group2->id, $student2->id);
74
 
11 efrain 75
        $assignment = $this->getDataGenerator()->create_module('assign', ['name' => "Test assign & grade items", 'course' => $course->id]);
1 efrain 76
        $modcontext = get_coursemodule_from_instance('assign', $assignment->id, $course->id);
77
        $assignment->cmidnumber = $modcontext->id;
78
 
79
        $student1grade = ['userid' => $student1->id, 'rawgrade' => $s1grade, 'idnumber' => 'testidnumber1'];
80
        $student2grade = ['userid' => $student2->id, 'rawgrade' => $s2grade, 'idnumber' => 'testidnumber2'];
81
        $student3grade = ['userid' => $student3->id, 'rawgrade' => $s3grade, 'idnumber' => 'testidnumber3'];
82
        $studentgrades = [$student1->id => $student1grade, $student2->id => $student2grade, $student3->id => $student3grade];
83
        assign_grade_item_update($assignment, $studentgrades);
84
 
85
        return [
86
            $course,
87
            $teacher,
88
            $student1,
89
            $student2,
90
            $student3,
91
            $assignment
92
        ];
93
    }
94
 
95
    /**
96
     * Test get_grades_table function case teacher
97
     */
11 efrain 98
    public function test_get_grades_table_teacher(): void {
1 efrain 99
 
100
        $this->resetAfterTest(true);
101
 
102
        $s1grade = 80;
103
        $s2grade = 60;
104
        $s3grade = 50;
105
 
106
        list($course, $teacher, $student1, $student2, $student3, $assignment) = $this->load_data($s1grade, $s2grade, $s3grade);
107
 
108
        // A teacher must see all student grades (in their group only).
109
        $this->setUser($teacher);
110
 
111
        $studentgrades = user_external::get_grades_table($course->id);
112
        $studentgrades = external_api::clean_returnvalue(user_external::get_grades_table_returns(), $studentgrades);
113
 
114
        // No warnings returned.
115
        $this->assertCount(0, $studentgrades['warnings']);
116
 
117
        // Check that only grades for the student in the teacher group are returned.
118
        $this->assertCount(1, $studentgrades['tables']);
119
 
120
        // Read returned grades.
121
        $studentreturnedgrades = [];
122
 
123
        $studentreturnedgrades[$studentgrades['tables'][0]['userid']] =
124
            (int) $studentgrades['tables'][0]['tabledata'][2]['grade']['content'];
125
 
126
        $this->assertEquals($s1grade, $studentreturnedgrades[$student1->id]);
127
    }
128
 
129
    /**
130
     * Test get_grades_table function case student
131
     */
11 efrain 132
    public function test_get_grades_table_student(): void {
1 efrain 133
        global $CFG, $DB;
134
 
135
        $this->resetAfterTest(true);
136
 
137
        $s1grade = 80;
138
        $s2grade = 60;
139
        $s3grade = 50;
140
 
141
        list($course, $teacher, $student1, $student2, $student3, $assignment) = $this->load_data($s1grade, $s2grade, $s3grade);
142
 
143
        // A user can see his own grades.
144
        $this->setUser($student1);
145
        $studentgrade = user_external::get_grades_table($course->id, $student1->id);
146
        $studentgrade = external_api::clean_returnvalue(user_external::get_grades_table_returns(), $studentgrade);
147
 
148
        // No warnings returned.
149
        $this->assertTrue(count($studentgrade['warnings']) == 0);
150
 
151
        $this->assertTrue(count($studentgrade['tables']) == 1);
152
        $student1returnedgrade = (int) $studentgrade['tables'][0]['tabledata'][2]['grade']['content'];
153
        $this->assertEquals($s1grade, $student1returnedgrade);
154
 
155
        // A user can see his own even when in no groups.
156
        $this->setUser($student3);
157
        $studentgrade = user_external::get_grades_table($course->id, $student3->id);
158
        $studentgrade = external_api::clean_returnvalue(user_external::get_grades_table_returns(), $studentgrade);
159
 
160
        // No warnings returned.
161
        $this->assertTrue(count($studentgrade['warnings']) == 0);
162
 
163
        $this->assertTrue(count($studentgrade['tables']) == 1);
164
        $student3returnedgrade = (int) $studentgrade['tables'][0]['tabledata'][2]['grade']['content'];
165
        $this->assertEquals($s3grade, $student3returnedgrade);
166
 
167
        // Expect exception when user is not indicated.
168
        $this->setUser($student3);
169
        $this->expectException(\required_capability_exception::class);
170
        user_external::get_grades_table($course->id);
171
    }
172
 
173
    /**
174
     * Test get_grades_table function case incorrect permissions
175
     */
11 efrain 176
    public function test_get_grades_table_permissions(): void {
1 efrain 177
        global $CFG, $DB;
178
 
179
        $this->resetAfterTest(true);
180
 
181
        $s1grade = 80;
182
        $s2grade = 60;
183
        $s3grade = 50;
184
 
185
        list($course, $teacher, $student1, $student2, $student3, $assignment) = $this->load_data($s1grade, $s2grade, $s3grade);
186
 
187
        $this->setUser($student2);
188
 
189
        try {
190
            $studentgrade = user_external::get_grades_table($course->id, $student1->id);
191
            $this->fail('Exception expected due to not perissions to view other user grades.');
192
        } catch (\moodle_exception $e) {
193
            $this->assertEquals('notingroup', $e->errorcode);
194
        }
195
    }
196
 
197
    /**
198
     * Test view_grade_report function
199
     */
11 efrain 200
    public function test_view_grade_report(): void {
1 efrain 201
        global $USER;
202
 
203
        $this->resetAfterTest(true);
204
 
205
        $s1grade = 80;
206
        $s2grade = 60;
207
        $s3grade = 50;
208
        list($course, $teacher, $student1, $student2, $student3, $assignment) = $this->load_data($s1grade, $s2grade, $s3grade);
209
 
210
        // Redirect events to the sink, so we can recover them later.
211
        $sink = $this->redirectEvents();
212
 
213
        $this->setUser($student1);
214
        $result = user_external::view_grade_report($course->id);
215
        $result = external_api::clean_returnvalue(user_external::view_grade_report_returns(), $result);
216
        $events = $sink->get_events();
217
        $this->assertCount(1, $events);
218
        $event = reset($events);
219
 
220
        // Check the event details are correct.
221
        $this->assertInstanceOf('\gradereport_user\event\grade_report_viewed', $event);
222
        $this->assertEquals(\context_course::instance($course->id), $event->get_context());
223
        $this->assertEquals($USER->id, $event->get_data()['relateduserid']);
224
 
225
        $this->setUser($teacher);
226
        $result = user_external::view_grade_report($course->id, $student1->id);
227
        $result = external_api::clean_returnvalue(user_external::view_grade_report_returns(), $result);
228
        $events = $sink->get_events();
229
        $event = reset($events);
230
        $sink->close();
231
 
232
        // Check the event details are correct.
233
        $this->assertInstanceOf('\gradereport_user\event\grade_report_viewed', $event);
234
        $this->assertEquals(\context_course::instance($course->id), $event->get_context());
235
        $this->assertEquals($student1->id, $event->get_data()['relateduserid']);
236
 
237
        $this->setUser($student2);
238
        try {
239
            $studentgrade = user_external::view_grade_report($course->id, $student1->id);
240
            $this->fail('Exception expected due to not permissions to view other user grades.');
241
        } catch (\moodle_exception $e) {
242
            $this->assertEquals('nopermissiontoviewgrades', $e->errorcode);
243
        }
244
    }
245
 
246
    /**
247
     * Test get_grades_items function case teacher
248
     */
11 efrain 249
    public function test_get_grade_items_teacher(): void {
1 efrain 250
 
251
        $this->resetAfterTest(true);
252
 
253
        $s1grade = 80;
254
        $s2grade = 60;
255
        $s3grade = 50;
256
 
257
        list($course, $teacher, $student1, $student2, $student3, $assignment) = $this->load_data($s1grade, $s2grade, $s3grade);
258
 
259
        // A teacher must see all student grades (in their group only).
260
        $this->setUser($teacher);
261
 
262
        grade_set_setting($course->id, 'report_user_showrank', 1);
263
        grade_set_setting($course->id, 'report_user_showpercentage', 1);
264
        grade_set_setting($course->id, 'report_user_showhiddenitems', 1);
265
        grade_set_setting($course->id, 'report_user_showgrade', 1);
266
        grade_set_setting($course->id, 'report_user_showfeedback', 1);
267
        grade_set_setting($course->id, 'report_user_showweight', 1);
268
        grade_set_setting($course->id, 'report_user_showcontributiontocoursetotal', 1);
269
        grade_set_setting($course->id, 'report_user_showlettergrade', 1);
270
        grade_set_setting($course->id, 'report_user_showaverage', 1);
271
 
272
        $studentgrades = user_external::get_grade_items($course->id);
273
        $studentgrades = external_api::clean_returnvalue(user_external::get_grade_items_returns(), $studentgrades);
274
        // No warnings returned.
275
        $this->assertCount(0, $studentgrades['warnings']);
276
 
277
        // Check that only grades for the student in the teacher group are returned.
278
        $this->assertCount(1, $studentgrades['usergrades']);
279
        $this->assertCount(2, $studentgrades['usergrades'][0]['gradeitems']);
280
 
281
        $this->assertEquals($course->id, $studentgrades['usergrades'][0]['courseid']);
282
        $this->assertEquals($student1->id, $studentgrades['usergrades'][0]['userid']);
283
        // Module grades.
284
        $this->assertEquals($assignment->name, $studentgrades['usergrades'][0]['gradeitems'][0]['itemname']);
285
        $this->assertEquals('mod', $studentgrades['usergrades'][0]['gradeitems'][0]['itemtype']);
286
        $this->assertEquals('assign', $studentgrades['usergrades'][0]['gradeitems'][0]['itemmodule']);
287
        $this->assertEquals($assignment->id, $studentgrades['usergrades'][0]['gradeitems'][0]['iteminstance']);
288
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['locked']);
289
        $this->assertEquals($assignment->cmidnumber, $studentgrades['usergrades'][0]['gradeitems'][0]['cmid']);
290
        $this->assertEquals(0, $studentgrades['usergrades'][0]['gradeitems'][0]['itemnumber']);
291
        $this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][0]['outcomeid']);
292
        $this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][0]['scaleid']);
293
        $this->assertEquals(80, $studentgrades['usergrades'][0]['gradeitems'][0]['graderaw']);
294
        $this->assertEquals('80.00', $studentgrades['usergrades'][0]['gradeitems'][0]['gradeformatted']);
295
        $this->assertEquals(0, $studentgrades['usergrades'][0]['gradeitems'][0]['grademin']);
296
        $this->assertEquals(100, $studentgrades['usergrades'][0]['gradeitems'][0]['grademax']);
297
        $this->assertEquals('0&ndash;100', $studentgrades['usergrades'][0]['gradeitems'][0]['rangeformatted']);
298
        $this->assertEquals('80.00 %', $studentgrades['usergrades'][0]['gradeitems'][0]['percentageformatted']);
299
        $this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][0]['feedback']);
300
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradehiddenbydate']);
301
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradeneedsupdate']);
302
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradeishidden']);
303
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradeislocked']);
304
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradeisoverridden']);
305
        $this->assertEquals('B-', $studentgrades['usergrades'][0]['gradeitems'][0]['lettergradeformatted']);
306
        $this->assertEquals(1, $studentgrades['usergrades'][0]['gradeitems'][0]['rank']);
307
        $this->assertEquals(3, $studentgrades['usergrades'][0]['gradeitems'][0]['numusers']);
308
        $this->assertEquals(
309
            round(array_sum([$s1grade, $s2grade, $s3grade]) / 3, 2),
310
            $studentgrades['usergrades'][0]['gradeitems'][0]['averageformatted']);
311
 
312
        // Course grades.
313
        $this->assertEquals('course', $studentgrades['usergrades'][0]['gradeitems'][1]['itemtype']);
314
        $this->assertEquals(80, $studentgrades['usergrades'][0]['gradeitems'][1]['graderaw']);
315
        $this->assertEquals('80.00', $studentgrades['usergrades'][0]['gradeitems'][1]['gradeformatted']);
316
        $this->assertEquals(0, $studentgrades['usergrades'][0]['gradeitems'][1]['grademin']);
317
        $this->assertEquals(100, $studentgrades['usergrades'][0]['gradeitems'][1]['grademax']);
318
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][1]['locked']);
319
        $this->assertEquals('0&ndash;100', $studentgrades['usergrades'][0]['gradeitems'][1]['rangeformatted']);
320
        $this->assertEquals('80.00 %', $studentgrades['usergrades'][0]['gradeitems'][1]['percentageformatted']);
321
        $this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][1]['feedback']);
322
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][1]['gradehiddenbydate']);
323
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][1]['gradeneedsupdate']);
324
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][1]['gradeishidden']);
325
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][1]['gradeislocked']);
326
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][1]['gradeisoverridden']);
327
        $this->assertEquals('B-', $studentgrades['usergrades'][0]['gradeitems'][1]['lettergradeformatted']);
328
        $this->assertEquals(1, $studentgrades['usergrades'][0]['gradeitems'][1]['rank']);
329
        $this->assertEquals(3, $studentgrades['usergrades'][0]['gradeitems'][1]['numusers']);
330
        $this->assertEquals(
331
            round(array_sum([$s1grade, $s2grade, $s3grade]) / 3, 2),
332
            $studentgrades['usergrades'][0]['gradeitems'][1]['averageformatted']);
333
 
334
        // Now, override and lock a grade.
335
        $gradegrade = \grade_grade::fetch(['itemid' => $studentgrades['usergrades'][0]['gradeitems'][0]['id'],
336
            'userid' => $studentgrades['usergrades'][0]['userid']]);
337
        $gradegrade->set_overridden(true);
338
        $gradegrade->set_locked(1);
339
 
340
        $studentgrades = user_external::get_grade_items($course->id);
341
        $studentgrades = external_api::clean_returnvalue(user_external::get_grade_items_returns(), $studentgrades);
342
        // No warnings returned.
343
        $this->assertCount(0, $studentgrades['warnings']);
344
 
345
        // Module grades.
346
        $this->assertTrue($studentgrades['usergrades'][0]['gradeitems'][0]['gradeislocked']);
347
        $this->assertTrue($studentgrades['usergrades'][0]['gradeitems'][0]['gradeisoverridden']);
348
    }
349
 
350
    /**
351
     * Test get_grades_items function case student
352
     */
11 efrain 353
    public function test_get_grade_items_student(): void {
1 efrain 354
 
355
        $this->resetAfterTest(true);
356
 
357
        $s1grade = 80;
358
        $s2grade = 60;
359
        $s3grade = 50;
360
 
361
        list($course, $teacher, $student1, $student2, $student3, $assignment) = $this->load_data($s1grade, $s2grade, $s3grade);
362
 
363
        grade_set_setting($course->id, 'report_user_showrank', 1);
364
        grade_set_setting($course->id, 'report_user_showpercentage', 1);
365
        grade_set_setting($course->id, 'report_user_showgrade', 1);
366
        grade_set_setting($course->id, 'report_user_showfeedback', 1);
367
        grade_set_setting($course->id, 'report_user_showweight', 1);
368
        grade_set_setting($course->id, 'report_user_showcontributiontocoursetotal', 1);
369
        grade_set_setting($course->id, 'report_user_showlettergrade', 1);
370
        grade_set_setting($course->id, 'report_user_showaverage', 1);
371
 
372
        $this->setUser($student1);
373
 
374
        $studentgrades = user_external::get_grade_items($course->id, $student1->id);
375
        $studentgrades = external_api::clean_returnvalue(user_external::get_grade_items_returns(), $studentgrades);
376
        // No warnings returned.
377
        $this->assertCount(0, $studentgrades['warnings']);
378
 
379
        // Check that only grades for the student in the teacher group are returned.
380
        $this->assertCount(1, $studentgrades['usergrades']);
381
        $this->assertCount(2, $studentgrades['usergrades'][0]['gradeitems']);
382
 
383
        $this->assertEquals($course->id, $studentgrades['usergrades'][0]['courseid']);
384
        $this->assertEquals($student1->id, $studentgrades['usergrades'][0]['userid']);
385
        $this->assertEquals($student1->idnumber, $studentgrades['usergrades'][0]['useridnumber']);
386
        $this->assertEquals($assignment->name, $studentgrades['usergrades'][0]['gradeitems'][0]['itemname']);
387
        $this->assertEquals('mod', $studentgrades['usergrades'][0]['gradeitems'][0]['itemtype']);
388
        $this->assertEquals('assign', $studentgrades['usergrades'][0]['gradeitems'][0]['itemmodule']);
389
        $this->assertEquals($assignment->id, $studentgrades['usergrades'][0]['gradeitems'][0]['iteminstance']);
390
        $this->assertNull($studentgrades['usergrades'][0]['gradeitems'][0]['locked']);
391
        $this->assertEquals($assignment->cmidnumber, $studentgrades['usergrades'][0]['gradeitems'][0]['cmid']);
392
        $this->assertEquals(0, $studentgrades['usergrades'][0]['gradeitems'][0]['itemnumber']);
393
        $this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][0]['outcomeid']);
394
        $this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][0]['scaleid']);
395
        $this->assertEquals(80, $studentgrades['usergrades'][0]['gradeitems'][0]['graderaw']);
396
        $this->assertEquals('80.00', $studentgrades['usergrades'][0]['gradeitems'][0]['gradeformatted']);
397
        $this->assertEquals(0, $studentgrades['usergrades'][0]['gradeitems'][0]['grademin']);
398
        $this->assertEquals(100, $studentgrades['usergrades'][0]['gradeitems'][0]['grademax']);
399
        $this->assertEquals('0&ndash;100', $studentgrades['usergrades'][0]['gradeitems'][0]['rangeformatted']);
400
        $this->assertEquals('80.00 %', $studentgrades['usergrades'][0]['gradeitems'][0]['percentageformatted']);
401
        $this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][0]['feedback']);
402
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradehiddenbydate']);
403
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradeneedsupdate']);
404
        $this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradeishidden']);
405
        $this->assertNull($studentgrades['usergrades'][0]['gradeitems'][0]['gradeislocked']);
406
        $this->assertNull($studentgrades['usergrades'][0]['gradeitems'][0]['gradeisoverridden']);
407
        $this->assertEquals('B-', $studentgrades['usergrades'][0]['gradeitems'][0]['lettergradeformatted']);
408
        $this->assertEquals(1, $studentgrades['usergrades'][0]['gradeitems'][0]['rank']);
409
        $this->assertEquals(3, $studentgrades['usergrades'][0]['gradeitems'][0]['numusers']);
410
        $this->assertEquals(
411
            round(array_sum([$s1grade, $s2grade, $s3grade]) / 3, 2),
412
            $studentgrades['usergrades'][0]['gradeitems'][0]['averageformatted']);
413
 
414
        // Check that the idnumber for assignment grades is equal to the cmid.
415
        $this->assertEquals((string) $studentgrades['usergrades'][0]['gradeitems'][0]['cmid'],
416
            $studentgrades['usergrades'][0]['gradeitems'][0]['idnumber']);
417
 
418
        // Hide one grade for the user.
419
        $gradegrade = new \grade_grade([
420
            'userid' => $student1->id,
421
            'itemid' => $studentgrades['usergrades'][0]['gradeitems'][0]['id']
422
        ], true);
423
        $gradegrade->set_hidden(1);
424
        $studentgrades = user_external::get_grade_items($course->id, $student1->id);
425
        $studentgrades = external_api::clean_returnvalue(user_external::get_grade_items_returns(), $studentgrades);
426
 
427
        // Check we get only the course final grade.
428
        $this->assertCount(1, $studentgrades['usergrades']);
429
        $this->assertCount(1, $studentgrades['usergrades'][0]['gradeitems']);
430
        $this->assertEquals('course', $studentgrades['usergrades'][0]['gradeitems'][0]['itemtype']);
431
    }
432
 
433
}