Proyectos de Subversion Moodle

Rev

Rev 11 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 11 Rev 1441
Línea 16... Línea 16...
16
 
16
 
17
/**
17
/**
18
 * Unit tests for (some of) mod/assign/locallib.php.
18
 * Unit tests for (some of) mod/assign/locallib.php.
19
 *
19
 *
20
 * @package    mod_assign
20
 * @package    mod_assign
21
 * @category   phpunit
21
 * @category   test
22
 * @copyright  1999 onwards Martin Dougiamas  {@link http://moodle.com}
22
 * @copyright  1999 onwards Martin Dougiamas  {@link http://moodle.com}
23
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24
 */
24
 */
Línea 38... Línea 38...
38
 * Unit tests for (some of) mod/assign/locallib.php.
38
 * Unit tests for (some of) mod/assign/locallib.php.
39
 *
39
 *
40
 * @copyright  1999 onwards Martin Dougiamas  {@link http://moodle.com}
40
 * @copyright  1999 onwards Martin Dougiamas  {@link http://moodle.com}
41
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
41
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
42
 */
42
 */
43
class locallib_test extends \advanced_testcase {
43
final class locallib_test extends \advanced_testcase {
44
 
-
 
45
    // Use the generator helper.
44
    // Use the generator helper.
46
    use mod_assign_test_generator;
45
    use mod_assign_test_generator;
Línea 47... Línea 46...
47
 
46
 
48
    /** @var array */
47
    /** @var array */
Línea 146... Línea 145...
146
    }
145
    }
Línea 147... Línea 146...
147
 
146
 
148
    /**
147
    /**
149
     * Data provider for test_get_assign_perpage
148
     * Data provider for test_get_assign_perpage
150
     *
149
     *
151
     * @return array Provider data
150
     * @return array[] Provider data
152
     */
151
     */
153
    public function get_assign_perpage_provider() {
152
    public static function get_assign_perpage_provider(): array {
154
        return array(
153
        return [
155
            array(
154
            [
156
                'maxperpage' => -1,
155
                'maxperpage' => -1,
157
                'userprefs' => array(
156
                'userprefs' => [
158
                    -1 => -1,
157
                    -1 => -1,
159
                    10 => 10,
158
                    10 => 10,
160
                    20 => 20,
159
                    20 => 20,
161
                    50 => 50,
160
                    50 => 50,
162
                ),
161
                ],
163
            ),
162
            ],
164
            array(
163
            [
165
                'maxperpage' => 15,
164
                'maxperpage' => 15,
166
                'userprefs' => array(
165
                'userprefs' => [
167
                    -1 => 15,
166
                    -1 => 15,
168
                    10 => 10,
167
                    10 => 10,
169
                    20 => 15,
168
                    20 => 15,
170
                    50 => 15,
169
                    50 => 15,
171
                ),
170
                ],
172
            ),
171
            ],
173
        );
172
        ];
Línea 174... Línea 173...
174
    }
173
    }
175
 
174
 
176
    /**
175
    /**
Línea 213... Línea 212...
213
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
212
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
214
        $this->setUser($teacher);
213
        $this->setUser($teacher);
215
        $assign = $this->create_instance($course, [
214
        $assign = $this->create_instance($course, [
216
                'assignsubmission_onlinetext_enabled' => 1,
215
                'assignsubmission_onlinetext_enabled' => 1,
217
                'assignfeedback_comments_enabled' => 0,
216
                'assignfeedback_comments_enabled' => 0,
218
                'grade' => GRADE_TYPE_NONE
217
                'grade' => GRADE_TYPE_NONE,
219
            ]);
218
            ]);
Línea 220... Línea 219...
220
 
219
 
221
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', array(
220
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', [
222
            'id' => $assign->get_course_module()->id,
221
            'id' => $assign->get_course_module()->id,
223
            'action' => 'grading',
222
            'action' => 'grading',
Línea 224... Línea 223...
224
        )));
223
        ]));
225
 
224
 
226
        // Render the table with the requires grading filter.
225
        // Render the table with the requires grading filter.
Línea 248... Línea 247...
248
        $time = time();
247
        $time = time();
249
        $assign = $this->create_instance($course, [
248
        $assign = $this->create_instance($course, [
250
                'assignsubmission_onlinetext_enabled' => 1,
249
                'assignsubmission_onlinetext_enabled' => 1,
251
                'duedate' => time() - (4 * DAYSECS),
250
                'duedate' => time() - (4 * DAYSECS),
252
            ]);
251
            ]);
253
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', array(
252
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', [
254
            'id' => $assign->get_course_module()->id,
253
            'id' => $assign->get_course_module()->id,
255
            'action' => 'grading',
254
            'action' => 'grading',
256
        )));
255
        ]));
Línea 257... Línea 256...
257
 
256
 
258
        // Check that the assignment is late.
257
        // Check that the assignment is late.
259
        $gradingtable = new \assign_grading_table($assign, 1, '', 0, true);
258
        $gradingtable = new \assign_grading_table($assign, 1, '', 0, true);
260
        $output = $assign->get_renderer()->render($gradingtable);
259
        $output = $assign->get_renderer()->render($gradingtable);
Línea 307... Línea 306...
307
        $time = time();
306
        $time = time();
308
        $assign = $this->create_instance($course, [
307
        $assign = $this->create_instance($course, [
309
                'assignsubmission_onlinetext_enabled' => 1,
308
                'assignsubmission_onlinetext_enabled' => 1,
310
                'duedate' => time() - (4 * DAYSECS),
309
                'duedate' => time() - (4 * DAYSECS),
311
            ]);
310
            ]);
312
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', array(
311
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', [
313
            'id' => $assign->get_course_module()->id,
312
            'id' => $assign->get_course_module()->id,
314
            'action' => 'grading',
313
            'action' => 'grading',
315
        )));
314
        ]));
Línea 316... Línea 315...
316
 
315
 
317
        // Check that the assignment is late.
316
        // Check that the assignment is late.
318
        $gradingtable = new \assign_grading_table($assign, 1, '', 0, true);
317
        $gradingtable = new \assign_grading_table($assign, 1, '', 0, true);
319
        $output = $assign->get_renderer()->render($gradingtable);
318
        $output = $assign->get_renderer()->render($gradingtable);
Línea 351... Línea 350...
351
        $output = $assign->get_renderer()->render($gradingtable);
350
        $output = $assign->get_renderer()->render($gradingtable);
352
        $this->assertStringContainsString(get_string('submissionstatus_submitted', 'assign'), $output);
351
        $this->assertStringContainsString(get_string('submissionstatus_submitted', 'assign'), $output);
353
        $this->assertStringContainsString(get_string('userextensiondate', 'assign', userdate($time - (2 * DAYSECS))), $output);
352
        $this->assertStringContainsString(get_string('userextensiondate', 'assign', userdate($time - (2 * DAYSECS))), $output);
Línea 354... Línea 353...
354
 
353
 
-
 
354
        $difftime = $submittedtime - $time;
355
        $difftime = $submittedtime - $time;
355
        $this->assertStringContainsString(
356
        $this->assertStringContainsString(get_string('submittedlateshort', 'assign', format_time((2 * DAYSECS) + $difftime)),
356
            get_string('submittedlateshort', 'assign', format_time((2 * DAYSECS) + $difftime)),
-
 
357
            $output
357
            $output);
358
        );
Línea 358... Línea 359...
358
    }
359
    }
359
 
360
 
Línea 370... Línea 371...
370
        $time = time();
371
        $time = time();
371
        $assign = $this->create_instance($course, [
372
        $assign = $this->create_instance($course, [
372
            'assignsubmission_onlinetext_enabled' => 1,
373
            'assignsubmission_onlinetext_enabled' => 1,
373
            'duedate' => $time - (4 * DAYSECS),
374
            'duedate' => $time - (4 * DAYSECS),
374
         ]);
375
         ]);
375
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', array(
376
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', [
376
            'id' => $assign->get_course_module()->id,
377
            'id' => $assign->get_course_module()->id,
377
            'action' => 'grading',
378
            'action' => 'grading',
378
        )));
379
        ]));
Línea 379... Línea 380...
379
 
380
 
380
        // Check that the assignment is late.
381
        // Check that the assignment is late.
381
        $gradingtable = new \assign_grading_table($assign, 1, '', 0, true);
382
        $gradingtable = new \assign_grading_table($assign, 1, '', 0, true);
382
        $output = $assign->get_renderer()->render($gradingtable);
383
        $output = $assign->get_renderer()->render($gradingtable);
Línea 399... Línea 400...
399
        $this->assertStringContainsString(get_string('overdue', 'assign', format_time((4 * DAYSECS) + $difftime)), $output);
400
        $this->assertStringContainsString(get_string('overdue', 'assign', format_time((4 * DAYSECS) + $difftime)), $output);
Línea 400... Línea 401...
400
 
401
 
401
        $document = new \DOMDocument();
402
        $document = new \DOMDocument();
402
        @$document->loadHTML($output);
403
        @$document->loadHTML($output);
403
        $xpath = new \DOMXPath($document);
404
        $xpath = new \DOMXPath($document);
404
        $this->assertEmpty($xpath->evaluate('string(//td[@id="mod_assign_grading-' . $assign->get_context()->id. '_r0_c8"])'));
405
        $this->assertEmpty($xpath->evaluate('string(//td[@id="mod_assign_grading-' . $assign->get_context()->id . '_r0_c6"])'));
Línea 405... Línea 406...
405
    }
406
    }
406
 
407
 
407
    /**
408
    /**
Línea 442... Línea 443...
442
            'teamsubmission' => 1,
443
            'teamsubmission' => 1,
443
            'assignsubmission_onlinetext_enabled' => 1,
444
            'assignsubmission_onlinetext_enabled' => 1,
444
            'submissiondrafts' => 1,
445
            'submissiondrafts' => 1,
445
            'requireallteammemberssubmit' => 0,
446
            'requireallteammemberssubmit' => 0,
446
        ]);
447
        ]);
447
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', array(
448
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', [
448
            'id' => $assign->get_course_module()->id,
449
            'id' => $assign->get_course_module()->id,
449
            'action' => 'grading',
450
            'action' => 'grading',
450
        )));
451
        ]));
Línea 451... Línea 452...
451
 
452
 
452
        // Add a submission.
453
        // Add a submission.
453
        $this->setUser($student);
454
        $this->setUser($student);
454
        $data = new \stdClass();
455
        $data = new \stdClass();
455
        $data->onlinetext_editor = [
456
        $data->onlinetext_editor = [
456
            'itemid' => file_get_unused_draft_itemid(),
457
            'itemid' => file_get_unused_draft_itemid(),
457
            'text' => 'Submission text',
458
            'text' => 'Submission text',
458
            'format' => FORMAT_MOODLE,
459
            'format' => FORMAT_MOODLE,
459
        ];
460
        ];
460
        $notices = array();
461
        $notices = [];
Línea 461... Línea 462...
461
        $assign->save_submission($data, $notices);
462
        $assign->save_submission($data, $notices);
462
 
463
 
463
        $submission = $assign->get_group_submission($student->id, 0, true);
464
        $submission = $assign->get_group_submission($student->id, 0, true);
Línea 474... Línea 475...
474
 
475
 
475
        // The XPath expression is based on the unique ID of the table.
476
        // The XPath expression is based on the unique ID of the table.
Línea 476... Línea 477...
476
        $xpathuniqueidroot = 'mod_assign_grading-' . $assign->get_context()->id;
477
        $xpathuniqueidroot = 'mod_assign_grading-' . $assign->get_context()->id;
-
 
478
 
477
 
479
        // Check status.
478
        // Check status.
480
        $this->assertSame(
-
 
481
            get_string('submissionstatus_submitted', 'assign'),
-
 
482
            $xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r0_c3"]//div[@class="submissionstatussubmitted"])')
479
        $this->assertSame(get_string('submissionstatus_submitted', 'assign'),
483
        );
480
            $xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r0_c4"]/div[@class="submissionstatussubmitted"])'));
484
        $this->assertSame(
-
 
485
            get_string('submissionstatus_submitted', 'assign'),
Línea 481... Línea 486...
481
        $this->assertSame(get_string('submissionstatus_submitted', 'assign'),
486
            $xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r3_c3"]//div[@class="submissionstatussubmitted"])')
482
            $xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r3_c4"]/div[@class="submissionstatussubmitted"])'));
487
        );
483
 
488
 
Línea 484... Línea 489...
484
        // Check submission last modified date.
489
        // Check submission last modified date.
485
        $this->assertGreaterThan(0, strtotime($xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r0_c8"])')));
490
        $this->assertGreaterThan(0, strtotime($xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r0_c6"])')));
486
        $this->assertGreaterThan(0, strtotime($xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r3_c8"])')));
491
        $this->assertGreaterThan(0, strtotime($xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r3_c6"])')));
Línea 487... Línea 492...
487
 
492
 
488
        // Check group.
493
        // Check group.
489
        $this->assertSame($group->name, $xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r0_c5"])'));
494
        $this->assertSame($group->name, $xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r0_c4"])'));
Línea 490... Línea 495...
490
        $this->assertSame($group->name, $xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r3_c5"])'));
495
        $this->assertSame($group->name, $xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r3_c4"])'));
491
 
496
 
492
        // Check submission text.
497
        // Check submission text.
493
        $this->assertSame('Submission text', $xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r0_c9"]/div/div)'));
498
        $this->assertSame('Submission text', $xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r0_c7"]/div/div)'));
Línea 494... Línea 499...
494
        $this->assertSame('Submission text', $xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r3_c9"]/div/div)'));
499
        $this->assertSame('Submission text', $xpath->evaluate('string(//td[@id="' . $xpathuniqueidroot . '_r3_c7"]/div/div)'));
495
 
500
 
496
        // Check comments can be made.
501
        // Check comments can be made.
Línea 546... Línea 551...
546
 
551
 
547
        // Submit the submission.
552
        // Submit the submission.
548
        $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
553
        $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
549
        $assign->testable_update_submission($submission, $student->id, true, false);
554
        $assign->testable_update_submission($submission, $student->id, true, false);
550
        $data = new \stdClass();
555
        $data = new \stdClass();
551
        $data->onlinetext_editor = array(
556
        $data->onlinetext_editor = [
552
            'itemid' => file_get_unused_draft_itemid(),
557
            'itemid' => file_get_unused_draft_itemid(),
553
            'text' => 'Submission text',
558
            'text' => 'Submission text',
554
            'format' => FORMAT_MOODLE);
559
            'format' => FORMAT_MOODLE];
555
        $plugin = $assign->get_submission_plugin_by_type('onlinetext');
560
        $plugin = $assign->get_submission_plugin_by_type('onlinetext');
Línea 556... Línea 561...
556
        $plugin->save($submission, $data);
561
        $plugin->save($submission, $data);
557
 
562
 
Línea 606... Línea 611...
606
        // Now try and delete.
611
        // Now try and delete.
607
        $this->setUser($teacher);
612
        $this->setUser($teacher);
608
        $this->assertEquals(true, $assign->delete_instance());
613
        $this->assertEquals(true, $assign->delete_instance());
609
    }
614
    }
Línea -... Línea 615...
-
 
615
 
-
 
616
    /**
-
 
617
     * @covers ::assign_reset_userdata
610
 
618
     */
611
    public function test_reset_userdata(): void {
619
    public function test_reset_userdata(): void {
Línea 612... Línea 620...
612
        global $DB;
620
        global $DB;
613
 
621
 
Línea 617... Línea 625...
617
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
625
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
Línea 618... Línea 626...
618
 
626
 
619
        $now = time();
627
        $now = time();
620
        $this->setUser($teacher);
628
        $this->setUser($teacher);
621
        $assign = $this->create_instance($course, [
629
        $assign = $this->create_instance($course, [
-
 
630
            'assignsubmission_onlinetext_enabled' => 1,
622
                'assignsubmission_onlinetext_enabled' => 1,
631
            'allowsubmissionsfromdate' => $now - HOURSECS,
-
 
632
            'duedate' => $now,
-
 
633
            'cutoffdate' => $now + HOURSECS,
623
                'duedate' => $now,
634
            'gradingduedate' => $now + DAYSECS,
Línea 624... Línea 635...
624
            ]);
635
        ]);
625
 
636
 
626
        // Simulate adding a grade.
637
        // Simulate adding a grade.
627
        $this->add_submission($student, $assign);
638
        $this->add_submission($student, $assign);
Línea 628... Línea 639...
628
        $this->submit_for_grading($student, $assign);
639
        $this->submit_for_grading($student, $assign);
629
        $this->mark_submission($teacher, $assign, $student, 50.0);
640
        $this->mark_submission($teacher, $assign, $student, 50.0);
630
 
641
 
631
        // Simulate a submission.
642
        // Simulate a submission.
632
        $this->setUser($student);
643
        $this->setUser($student);
633
        $submission = $assign->get_user_submission($student->id, true);
644
        $submission = $assign->get_user_submission($student->id, true);
634
        $data = new \stdClass();
645
        $data = new \stdClass();
635
        $data->onlinetext_editor = array(
646
        $data->onlinetext_editor = [
636
            'itemid' => file_get_unused_draft_itemid(),
647
            'itemid' => file_get_unused_draft_itemid(),
637
            'text' => 'Submission text',
648
            'text' => 'Submission text',
Línea 638... Línea 649...
638
            'format' => FORMAT_MOODLE);
649
            'format' => FORMAT_MOODLE];
639
        $plugin = $assign->get_submission_plugin_by_type('onlinetext');
650
        $plugin = $assign->get_submission_plugin_by_type('onlinetext');
Línea 651... Línea 662...
651
        $this->setUser($teacher);
662
        $this->setUser($teacher);
652
        $assign->reset_userdata($data);
663
        $assign->reset_userdata($data);
653
        $this->assertEquals(false, $assign->has_submissions_or_grades());
664
        $this->assertEquals(false, $assign->has_submissions_or_grades());
Línea 654... Línea 665...
654
 
665
 
655
        // Reload the instance data.
666
        // Reload the instance data.
-
 
667
        $instance = $DB->get_record('assign', ['id' => $assign->get_instance()->id]);
656
        $instance = $DB->get_record('assign', array('id' => $assign->get_instance()->id));
668
        $this->assertEquals($now - HOURSECS + DAYSECS, $instance->allowsubmissionsfromdate);
-
 
669
        $this->assertEquals($now + DAYSECS, $instance->duedate);
-
 
670
        $this->assertEquals($now + HOURSECS + DAYSECS, $instance->cutoffdate);
Línea 657... Línea 671...
657
        $this->assertEquals($now + DAYSECS, $instance->duedate);
671
        $this->assertEquals($now + DAYSECS + DAYSECS, $instance->gradingduedate);
658
 
672
 
659
        // Test reset using assign_reset_userdata().
673
        // Test reset using assign_reset_userdata().
660
        $assignduedate = $instance->duedate; // Keep old updated value for comparison.
674
        $assignduedate = $instance->duedate; // Keep old updated value for comparison.
661
        $data->timeshift = (2 * DAYSECS);
675
        $data->timeshift = (2 * DAYSECS);
662
        assign_reset_userdata($data);
676
        assign_reset_userdata($data);
Línea 663... Línea 677...
663
        $instance = $DB->get_record('assign', array('id' => $assign->get_instance()->id));
677
        $instance = $DB->get_record('assign', ['id' => $assign->get_instance()->id]);
664
        $this->assertEquals($assignduedate + (2 * DAYSECS), $instance->duedate);
678
        $this->assertEquals($assignduedate + (2 * DAYSECS), $instance->duedate);
665
 
679
 
666
        // Create one more assignment and reset, make sure time shifted for previous assignment is not changed.
680
        // Create one more assignment and reset, make sure time shifted for previous assignment is not changed.
667
        $assign2 = $this->create_instance($course, [
681
        $assign2 = $this->create_instance($course, [
668
                'assignsubmission_onlinetext_enabled' => 1,
682
                'assignsubmission_onlinetext_enabled' => 1,
669
                'duedate' => $now,
683
                'duedate' => $now,
670
            ]);
684
            ]);
671
        $assignduedate = $instance->duedate;
685
        $assignduedate = $instance->duedate;
672
        $data->timeshift = 3 * DAYSECS;
686
        $data->timeshift = 3 * DAYSECS;
673
        $assign2->reset_userdata($data);
687
        $assign2->reset_userdata($data);
674
        $instance = $DB->get_record('assign', array('id' => $assign->get_instance()->id));
688
        $instance = $DB->get_record('assign', ['id' => $assign->get_instance()->id]);
Línea 675... Línea 689...
675
        $this->assertEquals($assignduedate, $instance->duedate);
689
        $this->assertEquals($assignduedate, $instance->duedate);
676
        $instance2 = $DB->get_record('assign', array('id' => $assign2->get_instance()->id));
690
        $instance2 = $DB->get_record('assign', ['id' => $assign2->get_instance()->id]);
677
        $this->assertEquals($now + 3 * DAYSECS, $instance2->duedate);
691
        $this->assertEquals($now + 3 * DAYSECS, $instance2->duedate);
678
 
692
 
679
        // Reset both assignments using assign_reset_userdata() and make sure both assignments have same date.
693
        // Reset both assignments using assign_reset_userdata() and make sure both assignments have same date.
680
        $assignduedate = $instance->duedate;
694
        $assignduedate = $instance->duedate;
681
        $assign2duedate = $instance2->duedate;
695
        $assign2duedate = $instance2->duedate;
682
        $data->timeshift = (4 * DAYSECS);
696
        $data->timeshift = (4 * DAYSECS);
683
        assign_reset_userdata($data);
697
        assign_reset_userdata($data);
684
        $instance = $DB->get_record('assign', array('id' => $assign->get_instance()->id));
698
        $instance = $DB->get_record('assign', ['id' => $assign->get_instance()->id]);
Línea 685... Línea 699...
685
        $this->assertEquals($assignduedate + (4 * DAYSECS), $instance->duedate);
699
        $this->assertEquals($assignduedate + (4 * DAYSECS), $instance->duedate);
686
        $instance2 = $DB->get_record('assign', array('id' => $assign2->get_instance()->id));
700
        $instance2 = $DB->get_record('assign', ['id' => $assign2->get_instance()->id]);
Línea 723... Línea 737...
723
        $_REQUEST['introeditor'] = $draftid;
737
        $_REQUEST['introeditor'] = $draftid;
724
        $_POST['introeditor'] = $draftid;
738
        $_POST['introeditor'] = $draftid;
725
        $_POST['sesskey'] = sesskey();
739
        $_POST['sesskey'] = sesskey();
Línea 726... Línea 740...
726
 
740
 
-
 
741
        // Write links to a draft area.
727
        // Write links to a draft area.
742
        $fakearealink1 = file_rewrite_pluginfile_urls(
728
        $fakearealink1 = file_rewrite_pluginfile_urls('<a href="@@PLUGINFILE@@/pic.gif">link</a>', 'draftfile.php', $userctx,
743
            '<a href="@@PLUGINFILE@@/pic.gif">link</a>',
-
 
744
            'draftfile.php',
-
 
745
            $userctx,
-
 
746
            'user',
-
 
747
            'draft',
-
 
748
            $draftid
729
            'user', 'draft', $draftid);
749
        );
-
 
750
        $fakearealink2 = file_rewrite_pluginfile_urls(
730
        $fakearealink2 = file_rewrite_pluginfile_urls('<a href="@@PLUGINFILE@@/pic.gif">new</a>', 'draftfile.php', $userctx,
751
            '<a href="@@PLUGINFILE@@/pic.gif">new</a>',
-
 
752
            'draftfile.php',
-
 
753
            $userctx,
-
 
754
            'user',
-
 
755
            'draft',
-
 
756
            $draftid
Línea 731... Línea 757...
731
            'user', 'draft', $draftid);
757
        );
732
 
758
 
733
        // Create a new \assignment with links to a draft area.
759
        // Create a new \assignment with links to a draft area.
734
        $now = time();
760
        $now = time();
735
        $assign = $this->create_instance($course, [
761
        $assign = $this->create_instance($course, [
736
                'duedate' => $now,
762
                'duedate' => $now,
737
                'intro' => $fakearealink1,
763
                'intro' => $fakearealink1,
Línea 738... Línea 764...
738
                'introformat' => FORMAT_HTML
764
                'introformat' => FORMAT_HTML,
739
            ]);
765
            ]);
740
 
766
 
741
        // See if there is an event in the calendar.
767
        // See if there is an event in the calendar.
742
        $params = array('modulename' => 'assign', 'instance' => $assign->get_instance()->id);
768
        $params = ['modulename' => 'assign', 'instance' => $assign->get_instance()->id];
Línea 743... Línea 769...
743
        $event = $DB->get_record('event', $params);
769
        $event = $DB->get_record('event', $params);
744
        $this->assertNotEmpty($event);
770
        $this->assertNotEmpty($event);
745
        $this->assertSame('link', $event->description);     // The pluginfile links are removed.
771
        $this->assertSame('link', $event->description);     // The pluginfile links are removed.
746
 
772
 
747
        // Make sure the same works when updating the assignment.
773
        // Make sure the same works when updating the assignment.
748
        $instance = $assign->get_instance();
774
        $instance = $assign->get_instance();
749
        $instance->instance = $instance->id;
775
        $instance->instance = $instance->id;
750
        $instance->intro = $fakearealink2;
776
        $instance->intro = $fakearealink2;
751
        $instance->introformat = FORMAT_HTML;
777
        $instance->introformat = FORMAT_HTML;
752
        $assign->update_instance($instance);
778
        $assign->update_instance($instance);
Línea 753... Línea 779...
753
        $params = array('modulename' => 'assign', 'instance' => $assign->get_instance()->id);
779
        $params = ['modulename' => 'assign', 'instance' => $assign->get_instance()->id];
Línea 762... Línea 788...
762
                'allowsubmissionsfromdate' => $now + 60,
788
                'allowsubmissionsfromdate' => $now + 60,
763
                'intro' => 'Some text',
789
                'intro' => 'Some text',
764
            ]);
790
            ]);
Línea 765... Línea 791...
765
 
791
 
766
        // Get the event from the calendar.
792
        // Get the event from the calendar.
767
        $params = array('modulename' => 'assign', 'instance' => $assign->get_instance()->id);
793
        $params = ['modulename' => 'assign', 'instance' => $assign->get_instance()->id];
768
        $event = $DB->get_record('event', [
794
        $event = $DB->get_record('event', [
769
            'modulename' => 'assign',
795
            'modulename' => 'assign',
770
            'instance' => $assign->get_instance()->id,
796
            'instance' => $assign->get_instance()->id,
Línea 771... Línea 797...
771
        ]);
797
        ]);
Línea 772... Línea 798...
772
 
798
 
773
        $this->assertEmpty($event->description);
799
        $this->assertEmpty($event->description);
774
 
800
 
775
        // Change the allowsubmissionfromdate to the past - do this directly in the DB
801
        // Change the allowsubmissionfromdate to the past - do this directly in the DB
776
        // because if we call the assignment update method - it will update the calendar
802
        // because if we call the assignment update method - it will update the calendar
777
        // and we want to test that this works from cron.
803
        // and we want to test that this works from cron.
778
        $DB->set_field('assign', 'allowsubmissionsfromdate', $now - 60, array('id' => $assign->get_instance()->id));
804
        $DB->set_field('assign', 'allowsubmissionsfromdate', $now - 60, ['id' => $assign->get_instance()->id]);
Línea 779... Línea 805...
779
        // Run cron to update the event in the calendar.
805
        // Run cron to update the event in the calendar.
780
        \assign::cron();
-
 
781
        $event = $DB->get_record('event', $params);
806
        \assign::cron();
Línea 782... Línea 807...
782
 
807
        $event = $DB->get_record('event', $params);
783
        $this->assertStringContainsString('Some text', $event->description);
808
 
Línea 820... Línea 845...
820
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', ['id' => $assign->get_course_module()->id]));
845
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', ['id' => $assign->get_course_module()->id]));
Línea 821... Línea 846...
821
 
846
 
822
        // Test you cannot see the submit button for an offline assignment regardless.
847
        // Test you cannot see the submit button for an offline assignment regardless.
823
        $this->setUser($student);
848
        $this->setUser($student);
-
 
849
        $output = $assign->view_student_summary($student, true);
824
        $output = $assign->view_student_summary($student, true);
850
        $this->assertStringNotContainsString(
-
 
851
            get_string('submitassignment', 'assign'),
825
        $this->assertStringNotContainsString(get_string('submitassignment', 'assign'),
852
            $output,
-
 
853
            'Can submit empty offline assignment'
826
            $output, 'Can submit empty offline assignment');
854
        );
Línea 827... Línea 855...
827
    }
855
    }
828
 
856
 
Línea 842... Línea 870...
842
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', ['id' => $assign->get_course_module()->id]));
870
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', ['id' => $assign->get_course_module()->id]));
Línea 843... Línea 871...
843
 
871
 
844
        // Test you cannot see the submit button for an online text assignment with no submission.
872
        // Test you cannot see the submit button for an online text assignment with no submission.
845
        $this->setUser($student);
873
        $this->setUser($student);
-
 
874
        $output = $assign->view_student_summary($student, true);
846
        $output = $assign->view_student_summary($student, true);
875
        $this->assertStringNotContainsString(
-
 
876
            get_string('submitassignment', 'assign'),
847
        $this->assertStringNotContainsString(get_string('submitassignment', 'assign'),
877
            $output,
-
 
878
            'Cannot submit empty onlinetext assignment'
848
            $output, 'Cannot submit empty onlinetext assignment');
879
        );
Línea 849... Línea 880...
849
    }
880
    }
850
 
881
 
Línea 867... Línea 898...
867
        $this->add_submission($student, $assign);
898
        $this->add_submission($student, $assign);
Línea 868... Línea 899...
868
 
899
 
869
        // Test you can see the submit button for an online text assignment with a submission.
900
        // Test you can see the submit button for an online text assignment with a submission.
870
        $this->setUser($student);
901
        $this->setUser($student);
-
 
902
        $output = $assign->view_submission_action_bar($assign->get_instance(), $student);
871
        $output = $assign->view_submission_action_bar($assign->get_instance(), $student);
903
        $this->assertStringContainsString(
-
 
904
            get_string('submitassignment', 'assign'),
872
        $this->assertStringContainsString(get_string('submitassignment', 'assign'),
905
            $output,
-
 
906
            'Can submit non empty onlinetext assignment'
873
            $output, 'Can submit non empty onlinetext assignment');
907
        );
Línea 874... Línea 908...
874
    }
908
    }
875
 
909
 
876
    /**
910
    /**
Línea 915... Línea 949...
915
    }
949
    }
Línea 916... Línea 950...
916
 
950
 
917
    /**
951
    /**
918
     * Dataprovider for the test_new_submission_empty testcase
952
     * Dataprovider for the test_new_submission_empty testcase
919
     *
953
     *
920
     * @return array of testcases
954
     * @return array[] An array of testcases
921
     */
955
     */
922
    public function new_submission_empty_testcases() {
956
    public static function new_submission_empty_testcases(): array {
923
        return [
957
        return [
924
            'With file and onlinetext' => [
958
            'With file and onlinetext' => [
925
                [
959
                [
926
                    'file' => [
960
                    'file' => [
927
                        'component' => 'user',
961
                        'component' => 'user',
928
                        'filearea' => 'draft',
962
                        'filearea' => 'draft',
929
                        'filepath' => '/',
963
                        'filepath' => '/',
930
                        'filename' => 'not_a_virus.exe'
964
                        'filename' => 'not_a_virus.exe',
931
                    ],
965
                    ],
932
                    'onlinetext' => 'Balin Fundinul Uzbadkhazaddumu'
966
                    'onlinetext' => 'Balin Fundinul Uzbadkhazaddumu',
933
                ],
967
                ],
934
                false
968
                false,
935
            ]
969
            ],
936
        ];
970
        ];
Línea 937... Línea 971...
937
    }
971
    }
938
 
972
 
Línea 1158... Línea 1192...
1158
        $course = $this->getDataGenerator()->create_course();
1192
        $course = $this->getDataGenerator()->create_course();
1159
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
1193
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
1160
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1194
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1161
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1195
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
Línea 1162... Línea 1196...
1162
 
1196
 
1163
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
1197
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
1164
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1198
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1165
        $group2 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1199
        $group2 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1166
        groups_add_member($group1, $student1);
1200
        groups_add_member($group1, $student1);
Línea 1182... Línea 1216...
1182
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
1216
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
1183
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1217
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1184
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1218
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1185
        $student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1219
        $student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
Línea 1186... Línea 1220...
1186
 
1220
 
1187
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
1221
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
Línea 1188... Línea 1222...
1188
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1222
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1189
 
1223
 
1190
        $this->getDataGenerator()->create_grouping_group(array('groupid' => $group1->id, 'groupingid' => $grouping->id));
1224
        $this->getDataGenerator()->create_grouping_group(['groupid' => $group1->id, 'groupingid' => $grouping->id]);
Línea 1191... Línea 1225...
1191
        $group2 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1225
        $group2 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1192
        $this->getDataGenerator()->create_grouping_group(array('groupid' => $group2->id, 'groupingid' => $grouping->id));
1226
        $this->getDataGenerator()->create_grouping_group(['groupid' => $group2->id, 'groupingid' => $grouping->id]);
Línea 1193... Línea 1227...
1193
 
1227
 
Línea 1218... Línea 1252...
1218
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
1252
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
1219
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1253
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1220
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1254
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1221
        $student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1255
        $student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
Línea 1222... Línea 1256...
1222
 
1256
 
1223
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
1257
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
Línea 1224... Línea 1258...
1224
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1258
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1225
 
1259
 
1226
        $this->getDataGenerator()->create_grouping_group(array('groupid' => $group1->id, 'groupingid' => $grouping->id));
1260
        $this->getDataGenerator()->create_grouping_group(['groupid' => $group1->id, 'groupingid' => $grouping->id]);
Línea 1227... Línea 1261...
1227
        $group2 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1261
        $group2 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1228
        $this->getDataGenerator()->create_grouping_group(array('groupid' => $group2->id, 'groupingid' => $grouping->id));
1262
        $this->getDataGenerator()->create_grouping_group(['groupid' => $group2->id, 'groupingid' => $grouping->id]);
Línea 1229... Línea 1263...
1229
 
1263
 
Línea 1248... Línea 1282...
1248
     */
1282
     */
1249
    public function test_count_teams_groups_only(): void {
1283
    public function test_count_teams_groups_only(): void {
1250
        $this->resetAfterTest();
1284
        $this->resetAfterTest();
Línea 1251... Línea 1285...
1251
 
1285
 
1252
        $course = $this->getDataGenerator()->create_course();
1286
        $course = $this->getDataGenerator()->create_course();
Línea 1253... Línea 1287...
1253
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
1287
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
1254
 
1288
 
1255
        $assign = $this->create_instance($course, [
1289
        $assign = $this->create_instance($course, [
1256
            'teamsubmission' => 1,
1290
            'teamsubmission' => 1,
Línea 1265... Línea 1299...
1265
 
1299
 
1266
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1300
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1267
        $group2 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
1301
        $group2 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
Línea 1268... Línea 1302...
1268
        groups_add_member($group2, $student2);
1302
        groups_add_member($group2, $student2);
1269
 
1303
 
Línea 1270... Línea 1304...
1270
        $this->getDataGenerator()->create_grouping_group(array('groupid' => $group1->id, 'groupingid' => $grouping->id));
1304
        $this->getDataGenerator()->create_grouping_group(['groupid' => $group1->id, 'groupingid' => $grouping->id]);
Línea 1271... Línea 1305...
1271
        $this->getDataGenerator()->create_grouping_group(array('groupid' => $group2->id, 'groupingid' => $grouping->id));
1305
        $this->getDataGenerator()->create_grouping_group(['groupid' => $group2->id, 'groupingid' => $grouping->id]);
1272
 
1306
 
Línea 1478... Línea 1512...
1478
        $this->setUser($this->extrastudents[1]);
1512
        $this->setUser($this->extrastudents[1]);
1479
        $submission = $assign->get_group_submission($this->extrastudents[1]->id, $groupid, true);
1513
        $submission = $assign->get_group_submission($this->extrastudents[1]->id, $groupid, true);
1480
        $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
1514
        $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
1481
        $assign->testable_update_submission($submission, $this->extrastudents[1]->id, true, false);
1515
        $assign->testable_update_submission($submission, $this->extrastudents[1]->id, true, false);
1482
        $data = new \stdClass();
1516
        $data = new \stdClass();
1483
        $data->onlinetext_editor = array(
1517
        $data->onlinetext_editor = [
1484
            'itemid' => file_get_unused_draft_itemid(),
1518
            'itemid' => file_get_unused_draft_itemid(),
1485
            'text' => 'Submission text',
1519
            'text' => 'Submission text',
1486
            'format' => FORMAT_MOODLE);
1520
            'format' => FORMAT_MOODLE];
1487
        $plugin = $assign->get_submission_plugin_by_type('onlinetext');
1521
        $plugin = $assign->get_submission_plugin_by_type('onlinetext');
1488
        $plugin->save($submission, $data);
1522
        $plugin->save($submission, $data);
Línea 1489... Línea 1523...
1489
 
1523
 
1490
        // Simulate a submission.
1524
        // Simulate a submission.
1491
        $this->setUser($this->extrastudents[2]);
1525
        $this->setUser($this->extrastudents[2]);
1492
        $submission = $assign->get_group_submission($this->extrastudents[2]->id, $groupid, true);
1526
        $submission = $assign->get_group_submission($this->extrastudents[2]->id, $groupid, true);
1493
        $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
1527
        $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
1494
        $assign->testable_update_submission($submission, $this->extrastudents[2]->id, true, false);
1528
        $assign->testable_update_submission($submission, $this->extrastudents[2]->id, true, false);
1495
        $data = new \stdClass();
1529
        $data = new \stdClass();
1496
        $data->onlinetext_editor = array(
1530
        $data->onlinetext_editor = [
1497
            'itemid' => file_get_unused_draft_itemid(),
1531
            'itemid' => file_get_unused_draft_itemid(),
1498
            'text' => 'Submission text',
1532
            'text' => 'Submission text',
1499
            'format' => FORMAT_MOODLE);
1533
            'format' => FORMAT_MOODLE];
1500
        $plugin = $assign->get_submission_plugin_by_type('onlinetext');
1534
        $plugin = $assign->get_submission_plugin_by_type('onlinetext');
Línea 1501... Línea 1535...
1501
        $plugin->save($submission, $data);
1535
        $plugin->save($submission, $data);
1502
 
1536
 
1503
        // Simulate a submission.
1537
        // Simulate a submission.
1504
        $this->setUser($this->extrastudents[3]);
1538
        $this->setUser($this->extrastudents[3]);
1505
        $submission = $assign->get_group_submission($this->extrastudents[3]->id, $groupid, true);
1539
        $submission = $assign->get_group_submission($this->extrastudents[3]->id, $groupid, true);
1506
        $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
1540
        $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
1507
        $assign->testable_update_submission($submission, $this->extrastudents[3]->id, true, false);
1541
        $assign->testable_update_submission($submission, $this->extrastudents[3]->id, true, false);
1508
        $data = new \stdClass();
1542
        $data = new \stdClass();
1509
        $data->onlinetext_editor = array(
1543
        $data->onlinetext_editor = [
1510
            'itemid' => file_get_unused_draft_itemid(),
1544
            'itemid' => file_get_unused_draft_itemid(),
1511
            'text' => 'Submission text',
1545
            'text' => 'Submission text',
1512
            'format' => FORMAT_MOODLE);
1546
            'format' => FORMAT_MOODLE];
Línea 1513... Línea 1547...
1513
        $plugin = $assign->get_submission_plugin_by_type('onlinetext');
1547
        $plugin = $assign->get_submission_plugin_by_type('onlinetext');
1514
        $plugin->save($submission, $data);
1548
        $plugin->save($submission, $data);
Línea 1536... Línea 1570...
1536
 
1570
 
1537
        $course = $this->getDataGenerator()->create_course();
1571
        $course = $this->getDataGenerator()->create_course();
1538
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
1572
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
1539
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
1573
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
-
 
1574
        $suspendedstudent = $this->getDataGenerator()->create_and_enrol(
-
 
1575
            $course,
-
 
1576
            'student',
-
 
1577
            null,
-
 
1578
            'manual',
-
 
1579
            0,
1540
        $suspendedstudent = $this->getDataGenerator()->create_and_enrol(
1580
            0,
-
 
1581
            ENROL_USER_SUSPENDED
Línea 1541... Línea 1582...
1541
            $course, 'student', null, 'manual', 0, 0, ENROL_USER_SUSPENDED);
1582
        );
Línea 1542... Línea 1583...
1542
 
1583
 
1543
        $this->setUser($teacher);
1584
        $this->setUser($teacher);
Línea 1551... Línea 1592...
1551
 
1592
 
1552
        $course = $this->getDataGenerator()->create_course();
1593
        $course = $this->getDataGenerator()->create_course();
1553
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
1594
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
1554
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
1595
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
-
 
1596
        $suspendedstudent = $this->getDataGenerator()->create_and_enrol(
-
 
1597
            $course,
-
 
1598
            'student',
-
 
1599
            null,
-
 
1600
            'manual',
-
 
1601
            0,
1555
        $suspendedstudent = $this->getDataGenerator()->create_and_enrol(
1602
            0,
-
 
1603
            ENROL_USER_SUSPENDED
Línea 1556... Línea 1604...
1556
            $course, 'student', null, 'manual', 0, 0, ENROL_USER_SUSPENDED);
1604
        );
1557
 
1605
 
Línea 1558... Línea 1606...
1558
        $this->setUser($teacher);
1606
        $this->setUser($teacher);
Línea 1683... Línea 1731...
1683
 
1731
 
1684
        // First run cron so there are no messages waiting to be sent (from other tests).
1732
        // First run cron so there are no messages waiting to be sent (from other tests).
1685
        \core\cron::setup_user();
1733
        \core\cron::setup_user();
Línea 1686... Línea 1734...
1686
        \assign::cron();
1734
        \assign::cron();
1687
 
1735
 
1688
        $course = $this->getDataGenerator()->create_course();
1736
        $course = $this->getDataGenerator()->create_course(['shortname' => 'E&U']);
Línea 1689... Línea 1737...
1689
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
1737
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
1690
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
1738
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
1691
 
1739
 
-
 
1740
        // Now create an assignment and add some feedback.
1692
        // Now create an assignment and add some feedback.
1741
        $this->setUser($teacher);
1693
        $this->setUser($teacher);
1742
        $assign = $this->create_instance($course, [
1694
        $assign = $this->create_instance($course, [
1743
            'name' => 'Escaping & Unescaping',
Línea 1695... Línea 1744...
1695
            'sendstudentnotifications' => 1,
1744
            'sendstudentnotifications' => 1,
Línea 1724... Línea 1773...
1724
        $this->expectOutputRegex('/Done processing 1 assignment submissions/');
1773
        $this->expectOutputRegex('/Done processing 1 assignment submissions/');
1725
        \assign::cron();
1774
        \assign::cron();
1726
        $messages = $sink->get_messages();
1775
        $messages = $sink->get_messages();
Línea 1727... Línea 1776...
1727
 
1776
 
-
 
1777
        $this->assertEquals(1, count($messages));
-
 
1778
 
-
 
1779
        // Get some bits we will need to verify the content of the message.
-
 
1780
        $assignname = $assign->get_instance()->name;
-
 
1781
        $assignurl = (new \moodle_url('/mod/assign/view.php', ['id' => $assign->get_course_module()->id]))->out();
-
 
1782
        $teachername = fullname($teacher);
-
 
1783
        $assignsurl = (new \moodle_url('/mod/assign/index.php', ['id' => $course->id]))->out();
-
 
1784
        $courseurl = (new \moodle_url('/course/view.php', ['id' => $course->id]))->out();
-
 
1785
 
1728
        $this->assertEquals(1, count($messages));
1786
        $message = $messages[0];
1729
        $this->assertEquals(1, $messages[0]->notification);
1787
        $this->assertEquals(1, $message->notification);
-
 
1788
        $this->assertEquals(format_string($assign->get_instance()->name), $message->contexturlname);
-
 
1789
        $this->assertEquals("$teachername has given feedback for assignment $assignname", $message->subject, );
-
 
1790
        $this->assertEquals("E&U -> Assignment -> Escaping & Unescaping
-
 
1791
---------------------------------------------------------------------
-
 
1792
$teachername has posted some feedback on your
-
 
1793
assignment submission for 'Escaping & Unescaping'
-
 
1794
 
-
 
1795
You can see it appended to your assignment submission:
-
 
1796
 
-
 
1797
    $assignurl
-
 
1798
 
-
 
1799
---------------------------------------------------------------------
-
 
1800
",
-
 
1801
            $message->fullmessage,
-
 
1802
        );
-
 
1803
        $this->assertEquals(
-
 
1804
            '<p><font face="sans-serif">
-
 
1805
    <a href="' . $courseurl . '">E&amp;U</a> ->
-
 
1806
    <a href="' . $assignsurl . '">Assignment</a> ->
-
 
1807
    <a href="' . $assignurl . '">Escaping &amp; Unescaping</a>
-
 
1808
</font></p>
-
 
1809
<hr>
-
 
1810
<font face="sans-serif"><p>' . $teachername . ' has posted some feedback on your ' .
-
 
1811
            'assignment submission for \'Escaping &amp; Unescaping\'.
-
 
1812
You can see it appended to your <a href="' . $assignurl .
-
 
1813
            '">assignment submission</a>.</p></font>
-
 
1814
<hr>',
-
 
1815
            $message->fullmessagehtml
1730
        $this->assertEquals($assign->get_instance()->name, $messages[0]->contexturlname);
1816
        );
Línea 1731... Línea 1817...
1731
    }
1817
    }
1732
 
1818
 
Línea 1810... Línea 1896...
1810
        $this->assertFalse($assign->can_grade($student->id));
1896
        $this->assertFalse($assign->can_grade($student->id));
Línea 1811... Línea 1897...
1811
 
1897
 
1812
        // Test the viewgrades capability - without mod/assign:grade.
1898
        // Test the viewgrades capability - without mod/assign:grade.
Línea 1813... Línea 1899...
1813
        $this->setUser($student);
1899
        $this->setUser($student);
1814
 
1900
 
1815
        $studentrole = $DB->get_record('role', array('shortname' => 'student'));
1901
        $studentrole = $DB->get_record('role', ['shortname' => 'student']);
1816
        assign_capability('mod/assign:viewgrades', CAP_ALLOW, $studentrole->id, $assign->get_context()->id);
1902
        assign_capability('mod/assign:viewgrades', CAP_ALLOW, $studentrole->id, $assign->get_context()->id);
Línea 1817... Línea 1903...
1817
        $this->assertEquals(false, $assign->can_grade());
1903
        $this->assertEquals(false, $assign->can_grade());
Línea 1826... Línea 1912...
1826
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
1912
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
1827
        $editingteacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
1913
        $editingteacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
1828
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
1914
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
1829
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
1915
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
1830
        $suspendedstudent = $this->getDataGenerator()->create_and_enrol(
1916
        $suspendedstudent = $this->getDataGenerator()->create_and_enrol(
-
 
1917
            $course,
-
 
1918
            'student',
-
 
1919
            null,
-
 
1920
            'manual',
-
 
1921
            0,
-
 
1922
            0,
1831
            $course, 'student', null, 'manual', 0, 0, ENROL_USER_SUSPENDED);
1923
            ENROL_USER_SUSPENDED
-
 
1924
        );
Línea 1832... Línea 1925...
1832
 
1925
 
Línea 1833... Línea 1926...
1833
        $assign = $this->create_instance($course);
1926
        $assign = $this->create_instance($course);
1834
 
1927
 
Línea 1849... Línea 1942...
1849
        $this->assertEquals(true, $assign->can_view_submission($teacher->id));
1942
        $this->assertEquals(true, $assign->can_view_submission($teacher->id));
1850
        $this->assertEquals(true, $assign->can_view_submission($suspendedstudent->id));
1943
        $this->assertEquals(true, $assign->can_view_submission($suspendedstudent->id));
Línea 1851... Línea 1944...
1851
 
1944
 
1852
        // Test the viewgrades capability - without mod/assign:grade.
1945
        // Test the viewgrades capability - without mod/assign:grade.
1853
        $this->setUser($student);
1946
        $this->setUser($student);
1854
        $studentrole = $DB->get_record('role', array('shortname' => 'student'));
1947
        $studentrole = $DB->get_record('role', ['shortname' => 'student']);
1855
        assign_capability('mod/assign:viewgrades', CAP_ALLOW, $studentrole->id, $assign->get_context()->id);
1948
        assign_capability('mod/assign:viewgrades', CAP_ALLOW, $studentrole->id, $assign->get_context()->id);
1856
        $this->assertEquals(true, $assign->can_view_submission($student->id));
1949
        $this->assertEquals(true, $assign->can_view_submission($student->id));
1857
        $this->assertEquals(true, $assign->can_view_submission($otherstudent->id));
1950
        $this->assertEquals(true, $assign->can_view_submission($otherstudent->id));
1858
        $this->assertEquals(true, $assign->can_view_submission($teacher->id));
1951
        $this->assertEquals(true, $assign->can_view_submission($teacher->id));
Línea 2095... Línea 2188...
2095
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
2188
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
2096
        $editingteacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
2189
        $editingteacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
2097
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
2190
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
2098
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
2191
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
2099
        $suspendedstudent = $this->getDataGenerator()->create_and_enrol(
2192
        $suspendedstudent = $this->getDataGenerator()->create_and_enrol(
-
 
2193
            $course,
-
 
2194
            'student',
-
 
2195
            null,
-
 
2196
            'manual',
-
 
2197
            0,
-
 
2198
            0,
2100
            $course, 'student', null, 'manual', 0, 0, ENROL_USER_SUSPENDED);
2199
            ENROL_USER_SUSPENDED
-
 
2200
        );
Línea 2101... Línea 2201...
2101
 
2201
 
Línea 2102... Línea 2202...
2102
        $this->setAdminUser();
2202
        $this->setAdminUser();
2103
 
2203
 
Línea 2164... Línea 2264...
2164
        $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
2264
        $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
2165
        $editingteacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
2265
        $editingteacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
2166
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
2266
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
2167
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
2267
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
Línea 2168... Línea 2268...
2168
 
2268
 
2169
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
2269
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
2170
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
2270
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
Línea 2171... Línea 2271...
2171
        groups_add_member($group1, $student);
2271
        groups_add_member($group1, $student);
Línea 2172... Línea 2272...
2172
 
2272
 
2173
        $this->setAdminUser();
2273
        $this->setAdminUser();
2174
 
2274
 
Línea 2175... Línea 2275...
2175
        // Force create an assignment with SEPARATEGROUPS.
2275
        // Force create an assignment with SEPARATEGROUPS.
2176
        $group = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
2276
        $group = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
2177
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
2277
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
2178
 
2278
 
Línea 2192... Línea 2292...
2192
        global $CFG, $DB;
2292
        global $CFG, $DB;
Línea 2193... Línea 2293...
2193
 
2293
 
Línea 2194... Línea 2294...
2194
        $this->resetAfterTest();
2294
        $this->resetAfterTest();
2195
 
2295
 
2196
        $course = $this->getDataGenerator()->create_course();
2296
        $course = $this->getDataGenerator()->create_course();
2197
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
2297
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
Línea 2198... Línea 2298...
2198
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
2298
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
2199
        $this->getDataGenerator()->create_grouping_group(array('groupid' => $group1->id, 'groupingid' => $grouping->id));
2299
        $this->getDataGenerator()->create_grouping_group(['groupid' => $group1->id, 'groupingid' => $grouping->id]);
Línea 2200... Línea 2300...
2200
 
2300
 
Línea 2210... Línea 2310...
2210
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
2310
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
2211
        $this->getDataGenerator()->create_and_enrol($course, 'teacher');
2311
        $this->getDataGenerator()->create_and_enrol($course, 'teacher');
Línea 2212... Línea 2312...
2212
 
2312
 
2213
        $capability = 'mod/assign:receivegradernotifications';
2313
        $capability = 'mod/assign:receivegradernotifications';
2214
        $coursecontext = \context_course::instance($course->id);
2314
        $coursecontext = \context_course::instance($course->id);
Línea 2215... Línea 2315...
2215
        $role = $DB->get_record('role', array('shortname' => 'teacher'));
2315
        $role = $DB->get_record('role', ['shortname' => 'teacher']);
Línea 2216... Línea 2316...
2216
 
2316
 
2217
        $this->setUser($teacher);
2317
        $this->setUser($teacher);
Línea 2236... Línea 2336...
2236
        global $CFG, $DB;
2336
        global $CFG, $DB;
Línea 2237... Línea 2337...
2237
 
2337
 
Línea 2238... Línea 2338...
2238
        $this->resetAfterTest();
2338
        $this->resetAfterTest();
2239
 
2339
 
2240
        $course = $this->getDataGenerator()->create_course();
2340
        $course = $this->getDataGenerator()->create_course();
2241
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
2341
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
Línea 2242... Línea 2342...
2242
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
2342
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
2243
        $this->getDataGenerator()->create_grouping_group(array('groupid' => $group1->id, 'groupingid' => $grouping->id));
2343
        $this->getDataGenerator()->create_grouping_group(['groupid' => $group1->id, 'groupingid' => $grouping->id]);
Línea 2244... Línea 2344...
2244
 
2344
 
Línea 2287... Línea 2387...
2287
        global $CFG;
2387
        global $CFG;
Línea 2288... Línea 2388...
2288
 
2388
 
Línea 2289... Línea 2389...
2289
        $this->resetAfterTest();
2389
        $this->resetAfterTest();
2290
 
2390
 
2291
        $course = $this->getDataGenerator()->create_course();
2391
        $course = $this->getDataGenerator()->create_course();
2292
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
2392
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
2293
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
2393
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
2294
        $this->getDataGenerator()->create_grouping_group([
2394
        $this->getDataGenerator()->create_grouping_group([
2295
            'groupid' => $group1->id,
2395
            'groupid' => $group1->id,
Línea 2390... Línea 2490...
2390
        $output = $assign->view_student_summary($student, true);
2490
        $output = $assign->view_student_summary($student, true);
2391
        $this->assertMatchesRegularExpression('/Feedback/', $output, 'Show feedback if there is a grade');
2491
        $this->assertMatchesRegularExpression('/Feedback/', $output, 'Show feedback if there is a grade');
Línea 2392... Línea 2492...
2392
 
2492
 
2393
        // Now hide the grade in gradebook.
2493
        // Now hide the grade in gradebook.
2394
        $this->setUser($teacher);
2494
        $this->setUser($teacher);
2395
        require_once($CFG->libdir.'/gradelib.php');
2495
        require_once($CFG->libdir . '/gradelib.php');
2396
        $gradeitem = new \grade_item(array(
2496
        $gradeitem = new \grade_item([
2397
            'itemtype'      => 'mod',
2497
            'itemtype'      => 'mod',
2398
            'itemmodule'    => 'assign',
2498
            'itemmodule'    => 'assign',
2399
            'iteminstance'  => $assign->get_instance()->id,
2499
            'iteminstance'  => $assign->get_instance()->id,
Línea 2400... Línea 2500...
2400
            'courseid'      => $course->id));
2500
            'courseid'      => $course->id]);
Línea 2401... Línea 2501...
2401
 
2501
 
2402
        $gradeitem->set_hidden(1, false);
2502
        $gradeitem->set_hidden(1, false);
2403
 
2503
 
2404
        // No feedback should be available because the grade is hidden.
2504
        // No feedback should be available because the grade is hidden.
-
 
2505
        $this->setUser($student);
-
 
2506
        $output = $assign->view_student_summary($student, true);
2405
        $this->setUser($student);
2507
        $this->assertDoesNotMatchRegularExpression(
-
 
2508
            '/Feedback/',
Línea 2406... Línea 2509...
2406
        $output = $assign->view_student_summary($student, true);
2509
            $output,
2407
        $this->assertDoesNotMatchRegularExpression('/Feedback/', $output,
2510
            'Do not show feedback if the grade is hidden in the gradebook'
2408
            'Do not show feedback if the grade is hidden in the gradebook');
2511
        );
2409
 
2512
 
2410
        // Freeze the context.
2513
        // Freeze the context.
Línea 2411... Línea 2514...
2411
        $this->setAdminUser();
2514
        $this->setAdminUser();
2412
        $context = $assign->get_context();
2515
        $context = $assign->get_context();
2413
        $CFG->contextlocking = true;
2516
        $CFG->contextlocking = true;
-
 
2517
        $context->set_locked(true);
-
 
2518
 
-
 
2519
        // No feedback should be available because the grade is hidden.
2414
        $context->set_locked(true);
2520
        $this->setUser($student);
-
 
2521
        $output = $assign->view_student_summary($student, true);
Línea 2415... Línea 2522...
2415
 
2522
        $this->assertDoesNotMatchRegularExpression(
2416
        // No feedback should be available because the grade is hidden.
2523
            '/Feedback/',
2417
        $this->setUser($student);
2524
            $output,
Línea 2435... Línea 2542...
2435
        $course = $this->getDataGenerator()->create_course();
2542
        $course = $this->getDataGenerator()->create_course();
2436
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
2543
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
2437
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
2544
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
2438
        $this->setUser($teacher);
2545
        $this->setUser($teacher);
2439
        $assign = $this->create_instance($course, [
2546
        $assign = $this->create_instance($course, [
2440
            'assignfeedback_comments_enabled' => 1
2547
            'assignfeedback_comments_enabled' => 1,
2441
        ]);
2548
        ]);
2442
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', ['id' => $assign->get_course_module()->id]));
2549
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', ['id' => $assign->get_course_module()->id]));
Línea 2443... Línea 2550...
2443
 
2550
 
2444
        // No feedback should be available because this student has not been graded.
2551
        // No feedback should be available because this student has not been graded.
Línea 2480... Línea 2587...
2480
        $this->assertMatchesRegularExpression('/Grade/', $output);
2587
        $this->assertMatchesRegularExpression('/Grade/', $output);
2481
        $this->assertMatchesRegularExpression('/Graded on/', $output);
2588
        $this->assertMatchesRegularExpression('/Graded on/', $output);
Línea 2482... Línea 2589...
2482
 
2589
 
2483
        // Now hide the grade in gradebook.
2590
        // Now hide the grade in gradebook.
2484
        $this->setUser($teacher);
2591
        $this->setUser($teacher);
2485
        $gradeitem = new \grade_item(array(
2592
        $gradeitem = new \grade_item([
2486
            'itemtype'      => 'mod',
2593
            'itemtype'      => 'mod',
2487
            'itemmodule'    => 'assign',
2594
            'itemmodule'    => 'assign',
2488
            'iteminstance'  => $assign->get_instance()->id,
2595
            'iteminstance'  => $assign->get_instance()->id,
Línea 2489... Línea 2596...
2489
            'courseid'      => $course->id));
2596
            'courseid'      => $course->id]);
Línea 2490... Línea 2597...
2490
 
2597
 
2491
        $gradeitem->set_hidden(1, false);
2598
        $gradeitem->set_hidden(1, false);
2492
 
2599
 
2493
        // No feedback should be available because the grade is hidden.
2600
        // No feedback should be available because the grade is hidden.
-
 
2601
        $this->setUser($student);
-
 
2602
        $output = $assign->view_student_summary($student, true);
2494
        $this->setUser($student);
2603
        $this->assertDoesNotMatchRegularExpression(
-
 
2604
            '/Feedback/',
2495
        $output = $assign->view_student_summary($student, true);
2605
            $output,
Línea 2496... Línea 2606...
2496
        $this->assertDoesNotMatchRegularExpression('/Feedback/', $output,
2606
            'Do not show feedback if the grade is hidden in the gradebook'
2497
            'Do not show feedback if the grade is hidden in the gradebook');
2607
        );
2498
    }
2608
    }
Línea 2652... Línea 2762...
2652
 
2762
 
2653
        // Add a second submission.
2763
        // Add a second submission.
2654
        $this->add_submission($student, $assign);
2764
        $this->add_submission($student, $assign);
Línea 2655... Línea 2765...
2655
        $this->submit_for_grading($student, $assign);
2765
        $this->submit_for_grading($student, $assign);
2656
 
2766
 
Línea 2657... Línea 2767...
2657
        // Mark the submission as passing.
2767
        // Mark the second submission as passing.
2658
        $this->mark_submission($teacher, $assign, $student, 80.0);
2768
        $this->mark_submission($teacher, $assign, $student, 80.0, [], 1);
2659
 
2769
 
2660
        // Check that the student does not have a button for Add a new attempt.
2770
        // Check that the student does not have a button for Add a new attempt.
Línea 2661... Línea 2771...
2661
        $this->setUser($student);
2771
        $this->setUser($student);
2662
        $output = $assign->view_student_summary($student, true);
2772
        $output = $assign->view_student_summary($student, true);
Línea 2663... Línea 2773...
2663
        $this->assertEquals(false, strpos($output, get_string('addnewattempt', 'assign')));
2773
        $this->assertEquals(false, strpos($output, get_string('addnewattempt', 'assign')));
2664
 
2774
 
2665
        // Re-mark the submission as not passing.
2775
        // Re-mark the second submission as not passing.
Línea 2757... Línea 2867...
2757
        $output = $assign->view_student_summary($student, true);
2867
        $output = $assign->view_student_summary($student, true);
2758
        $this->assertEquals(false, strpos($output, get_string('addnewattempt', 'assign')));
2868
        $this->assertEquals(false, strpos($output, get_string('addnewattempt', 'assign')));
2759
    }
2869
    }
Línea 2760... Línea 2870...
2760
 
2870
 
-
 
2871
    /**
-
 
2872
     * Test reopen behavior when in "Automatic" mode.
-
 
2873
     *
-
 
2874
     * @coversNothing
-
 
2875
     */
-
 
2876
    public function test_attempt_reopen_method_automatic(): void {
-
 
2877
        global $PAGE;
-
 
2878
 
-
 
2879
        $this->resetAfterTest();
-
 
2880
        $course = $this->getDataGenerator()->create_course();
-
 
2881
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
-
 
2882
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
-
 
2883
 
-
 
2884
        $assign = $this->create_instance($course, [
-
 
2885
            'attemptreopenmethod' => ASSIGN_ATTEMPT_REOPEN_METHOD_AUTOMATIC,
-
 
2886
            'maxattempts' => 3,
-
 
2887
            'submissiondrafts' => 1,
-
 
2888
            'assignsubmission_onlinetext_enabled' => 1,
-
 
2889
        ]);
-
 
2890
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', ['id' => $assign->get_course_module()->id]));
-
 
2891
 
-
 
2892
        // Set grade to pass to 80.
-
 
2893
        $gradeitem = $assign->get_grade_item();
-
 
2894
        $gradeitem->gradepass = '80.0';
-
 
2895
        $gradeitem->update();
-
 
2896
 
-
 
2897
        // Student should be able to see an add submission button.
-
 
2898
        $this->setUser($student);
-
 
2899
        $output = $assign->view_submission_action_bar($assign->get_instance(), $student);
-
 
2900
        $this->assertNotEquals(false, strpos($output, get_string('addsubmission', 'assign')));
-
 
2901
 
-
 
2902
        // Add a submission as a student.
-
 
2903
        $this->add_submission($student, $assign);
-
 
2904
        $this->submit_for_grading($student, $assign);
-
 
2905
 
-
 
2906
        // Verify the student cannot make a new attempt.
-
 
2907
        $output = $assign->view_student_summary($student, true);
-
 
2908
        $this->assertEquals(false, strpos($output, get_string('addnewattempt', 'assign')));
-
 
2909
 
-
 
2910
        // Mark the submission as non-passing.
-
 
2911
        $this->mark_submission($teacher, $assign, $student, 50.0);
-
 
2912
 
-
 
2913
        // Check the student now has a button for Add a new attempt.
-
 
2914
        $this->setUser($student);
-
 
2915
        $output = $assign->view_submission_action_bar($assign->get_instance(), $student);
-
 
2916
        $this->assertNotEquals(false, strpos($output, get_string('addnewattempt', 'assign')));
-
 
2917
 
-
 
2918
        // Add a second submission.
-
 
2919
        $this->add_submission($student, $assign);
-
 
2920
        $this->submit_for_grading($student, $assign);
-
 
2921
 
-
 
2922
        // Mark the submission as passing.
-
 
2923
        $this->mark_submission($teacher, $assign, $student, 80.0, [], 1);
-
 
2924
 
-
 
2925
        // Check the student now has a button for Add a new attempt.
-
 
2926
        $this->setUser($student);
-
 
2927
        $output = $assign->view_submission_action_bar($assign->get_instance(), $student);
-
 
2928
        $this->assertNotEquals(false, strpos($output, get_string('addnewattempt', 'assign')));
-
 
2929
    }
-
 
2930
 
2761
    /**
2931
    /**
2762
     * Test student visibility for each stage of the marking workflow.
2932
     * Test student visibility for each stage of the marking workflow.
2763
     */
2933
     */
2764
    public function test_markingworkflow(): void {
2934
    public function test_markingworkflow(): void {
Línea 2774... Línea 2944...
2774
        ]);
2944
        ]);
Línea 2775... Línea 2945...
2775
 
2945
 
Línea 2776... Línea 2946...
2776
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', ['id' => $assign->get_course_module()->id]));
2946
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', ['id' => $assign->get_course_module()->id]));
2777
 
2947
 
2778
        // Mark the submission and set to notmarked.
2948
        // Mark the submission and set to notmarked.
2779
        $this->mark_submission($teacher, $assign, $student, 50.0,  [
2949
        $this->mark_submission($teacher, $assign, $student, 50.0, [
Línea 2780... Línea 2950...
2780
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_NOTMARKED,
2950
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_NOTMARKED,
2781
        ]);
2951
        ]);
Línea 2788... Línea 2958...
2788
        // Make sure the grade isn't pushed to the gradebook.
2958
        // Make sure the grade isn't pushed to the gradebook.
2789
        $grades = $assign->get_user_grades_for_gradebook($student->id);
2959
        $grades = $assign->get_user_grades_for_gradebook($student->id);
2790
        $this->assertEmpty($grades);
2960
        $this->assertEmpty($grades);
Línea 2791... Línea 2961...
2791
 
2961
 
2792
        // Mark the submission and set to inmarking.
2962
        // Mark the submission and set to inmarking.
2793
        $this->mark_submission($teacher, $assign, $student, 50.0,  [
2963
        $this->mark_submission($teacher, $assign, $student, 50.0, [
2794
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_INMARKING,
2964
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_INMARKING,
Línea 2795... Línea 2965...
2795
        ]);
2965
        ]);
2796
 
2966
 
Línea 2802... Línea 2972...
2802
        // Make sure the grade isn't pushed to the gradebook.
2972
        // Make sure the grade isn't pushed to the gradebook.
2803
        $grades = $assign->get_user_grades_for_gradebook($student->id);
2973
        $grades = $assign->get_user_grades_for_gradebook($student->id);
2804
        $this->assertEmpty($grades);
2974
        $this->assertEmpty($grades);
Línea 2805... Línea 2975...
2805
 
2975
 
2806
        // Mark the submission and set to readyforreview.
2976
        // Mark the submission and set to readyforreview.
2807
        $this->mark_submission($teacher, $assign, $student, 50.0,  [
2977
        $this->mark_submission($teacher, $assign, $student, 50.0, [
2808
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_READYFORREVIEW,
2978
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_READYFORREVIEW,
Línea 2809... Línea 2979...
2809
        ]);
2979
        ]);
2810
 
2980
 
Línea 2816... Línea 2986...
2816
        // Make sure the grade isn't pushed to the gradebook.
2986
        // Make sure the grade isn't pushed to the gradebook.
2817
        $grades = $assign->get_user_grades_for_gradebook($student->id);
2987
        $grades = $assign->get_user_grades_for_gradebook($student->id);
2818
        $this->assertEmpty($grades);
2988
        $this->assertEmpty($grades);
Línea 2819... Línea 2989...
2819
 
2989
 
2820
        // Mark the submission and set to inreview.
2990
        // Mark the submission and set to inreview.
2821
        $this->mark_submission($teacher, $assign, $student, 50.0,  [
2991
        $this->mark_submission($teacher, $assign, $student, 50.0, [
2822
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_INREVIEW,
2992
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_INREVIEW,
Línea 2823... Línea 2993...
2823
        ]);
2993
        ]);
2824
 
2994
 
Línea 2830... Línea 3000...
2830
        // Make sure the grade isn't pushed to the gradebook.
3000
        // Make sure the grade isn't pushed to the gradebook.
2831
        $grades = $assign->get_user_grades_for_gradebook($student->id);
3001
        $grades = $assign->get_user_grades_for_gradebook($student->id);
2832
        $this->assertEmpty($grades);
3002
        $this->assertEmpty($grades);
Línea 2833... Línea 3003...
2833
 
3003
 
2834
        // Mark the submission and set to readyforrelease.
3004
        // Mark the submission and set to readyforrelease.
2835
        $this->mark_submission($teacher, $assign, $student, 50.0,  [
3005
        $this->mark_submission($teacher, $assign, $student, 50.0, [
2836
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_READYFORRELEASE,
3006
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_READYFORRELEASE,
Línea 2837... Línea 3007...
2837
        ]);
3007
        ]);
2838
 
3008
 
Línea 2844... Línea 3014...
2844
        // Make sure the grade isn't pushed to the gradebook.
3014
        // Make sure the grade isn't pushed to the gradebook.
2845
        $grades = $assign->get_user_grades_for_gradebook($student->id);
3015
        $grades = $assign->get_user_grades_for_gradebook($student->id);
2846
        $this->assertEmpty($grades);
3016
        $this->assertEmpty($grades);
Línea 2847... Línea 3017...
2847
 
3017
 
2848
        // Mark the submission and set to released.
3018
        // Mark the submission and set to released.
2849
        $this->mark_submission($teacher, $assign, $student, 50.0,  [
3019
        $this->mark_submission($teacher, $assign, $student, 50.0, [
2850
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_RELEASED,
3020
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_RELEASED,
Línea 2851... Línea 3021...
2851
        ]);
3021
        ]);
2852
 
3022
 
Línea 2872... Línea 3042...
2872
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
3042
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
2873
        $otherteacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
3043
        $otherteacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
Línea 2874... Línea 3044...
2874
 
3044
 
2875
        $assign = $this->create_instance($course, [
3045
        $assign = $this->create_instance($course, [
2876
            'markingworkflow' => 1,
3046
            'markingworkflow' => 1,
2877
            'markingallocation' => 1
3047
            'markingallocation' => 1,
Línea 2878... Línea 3048...
2878
        ]);
3048
        ]);
Línea 2879... Línea 3049...
2879
 
3049
 
Línea 3039... Línea 3209...
3039
            'assignsubmission_onlinetext_enabled' => 1,
3209
            'assignsubmission_onlinetext_enabled' => 1,
3040
        ]);
3210
        ]);
Línea 3041... Línea 3211...
3041
 
3211
 
3042
        $this->setUser($student);
3212
        $this->setUser($student);
-
 
3213
        $output = $assign->view_student_summary($student, true);
-
 
3214
        $this->assertStringNotContainsString(
3043
        $output = $assign->view_student_summary($student, true);
3215
            $output,
3044
        $this->assertStringNotContainsString($output, get_string('editsubmission', 'assign'),
3216
            get_string('editsubmission', 'assign'),
-
 
3217
            'Should not be able to edit after cutoff date.'
-
 
3218
        );
-
 
3219
        $this->assertStringNotContainsString(
3045
            'Should not be able to edit after cutoff date.');
3220
            $output,
3046
        $this->assertStringNotContainsString($output, get_string('submitassignment', 'assign'),
3221
            get_string('submitassignment', 'assign'),
-
 
3222
            'Should not be able to submit after cutoff date.'
3047
            'Should not be able to submit after cutoff date.');
3223
        );
Línea 3048... Línea 3224...
3048
    }
3224
    }
3049
 
3225
 
3050
    /**
3226
    /**
Línea 3065... Línea 3241...
3065
        $assign = $this->create_instance($course, $instanceconfig);
3241
        $assign = $this->create_instance($course, $instanceconfig);
3066
        $plugin = $assign->get_submission_plugin_by_type('comments');
3242
        $plugin = $assign->get_submission_plugin_by_type('comments');
3067
        $this->assertEquals($isenabled, (bool) $plugin->is_enabled('enabled'));
3243
        $this->assertEquals($isenabled, (bool) $plugin->is_enabled('enabled'));
3068
    }
3244
    }
Línea -... Línea 3245...
-
 
3245
 
-
 
3246
    /**
-
 
3247
     * Data provider for test_submission_comment_plugin_settings.
-
 
3248
     *
-
 
3249
     * @return array[]
3069
 
3250
     */
3070
    public function submission_plugin_settings_provider() {
3251
    public static function submission_plugin_settings_provider(): array {
3071
        return [
3252
        return [
3072
            'CFG->usecomments true, empty config => Enabled by default' => [
3253
            'CFG->usecomments true, empty config => Enabled by default' => [
3073
                true,
3254
                true,
3074
                [],
3255
                [],
Línea 3157... Línea 3338...
3157
            'rownum' => 0,
3338
            'rownum' => 0,
3158
            'last' => true,
3339
            'last' => true,
3159
            'useridlistid' => $assign->get_useridlist_key_id(),
3340
            'useridlistid' => $assign->get_useridlist_key_id(),
3160
            'attemptnumber' => 0,
3341
            'attemptnumber' => 0,
3161
        ];
3342
        ];
3162
        $formparams = array($assign, $data, $pagination);
3343
        $formparams = [$assign, $data, $pagination];
3163
        $mform = new mod_assign_grade_form(null, [$assign, $data, $pagination]);
3344
        $mform = new mod_assign_grade_form(null, [$assign, $data, $pagination]);
Línea 3164... Línea 3345...
3164
 
3345
 
3165
        // We need to get the URL these will be transformed to.
3346
        // We need to get the URL these will be transformed to.
3166
        $context = \context_user::instance($USER->id);
3347
        $context = \context_user::instance($USER->id);
Línea 3200... Línea 3381...
3200
        $assign = $this->create_instance($course, $instanceconfig);
3381
        $assign = $this->create_instance($course, $instanceconfig);
3201
        $plugin = $assign->get_feedback_plugin_by_type('comments');
3382
        $plugin = $assign->get_feedback_plugin_by_type('comments');
3202
        $this->assertEquals($isenabled, (bool) $plugin->is_enabled('enabled'));
3383
        $this->assertEquals($isenabled, (bool) $plugin->is_enabled('enabled'));
3203
    }
3384
    }
Línea -... Línea 3385...
-
 
3385
 
-
 
3386
    /**
-
 
3387
     * Data provider for test_feedback_plugin_settings.
-
 
3388
     *
-
 
3389
     * @return array[]
3204
 
3390
     */
3205
    public function feedback_plugin_settings_provider() {
3391
    public static function feedback_plugin_settings_provider(): array {
3206
        return [
3392
        return [
3207
            'No configuration => disabled' => [
3393
            'No configuration => disabled' => [
3208
                [],
3394
                [],
3209
                false,
3395
                false,
Línea 3338... Línea 3524...
3338
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3524
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3339
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3525
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3340
        $student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3526
        $student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3341
        $student4 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3527
        $student4 = $this->getDataGenerator()->create_and_enrol($course, 'student');
Línea 3342... Línea 3528...
3342
 
3528
 
3343
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
3529
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
3344
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3530
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3345
        groups_assign_grouping($grouping->id, $group1->id);
3531
        groups_assign_grouping($grouping->id, $group1->id);
3346
        groups_add_member($group1, $student1);
3532
        groups_add_member($group1, $student1);
Línea 3375... Línea 3561...
3375
 
3561
 
3376
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3562
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3377
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3563
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3378
        $student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3564
        $student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
-
 
3565
        $student4 = $this->getDataGenerator()->create_and_enrol($course, 'student');
Línea 3379... Línea 3566...
3379
        $student4 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3566
        $student5 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3380
 
3567
 
3381
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
3568
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
3382
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3569
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3383
        groups_assign_grouping($grouping->id, $group1->id);
3570
        groups_assign_grouping($grouping->id, $group1->id);
Línea 3392... Línea 3579...
3392
        $assign = $this->create_instance($course, [
3579
        $assign = $this->create_instance($course, [
3393
            'assignsubmission_onlinetext_enabled' => 1,
3580
            'assignsubmission_onlinetext_enabled' => 1,
3394
            'submissiondrafts' => 1,
3581
            'submissiondrafts' => 1,
3395
            'groupingid' => $grouping->id,
3582
            'groupingid' => $grouping->id,
3396
            'groupmode' => SEPARATEGROUPS,
3583
            'groupmode' => SEPARATEGROUPS,
-
 
3584
            'preventsubmissionnotingroup' => 0,
3397
        ]);
3585
        ]);
Línea 3398... Línea 3586...
3398
 
3586
 
3399
        // Add the capability to the new \assignment for student 1.
3587
        // Add the capability to the new \assignment for student 1.
3400
        $roleid = create_role('Dummy role', 'dummyrole', 'dummy role description');
3588
        $roleid = create_role('Dummy role', 'dummyrole', 'dummy role description');
Línea 3405... Línea 3593...
3405
        // Verify student1 has the ability to edit submissions for other users in their group, but not other groups.
3593
        // Verify student1 has the ability to edit submissions for other users in their group, but not other groups.
3406
        $this->assertTrue($assign->can_edit_submission($student1->id, $student1->id));
3594
        $this->assertTrue($assign->can_edit_submission($student1->id, $student1->id));
3407
        $this->assertTrue($assign->can_edit_submission($student2->id, $student1->id));
3595
        $this->assertTrue($assign->can_edit_submission($student2->id, $student1->id));
3408
        $this->assertFalse($assign->can_edit_submission($student3->id, $student1->id));
3596
        $this->assertFalse($assign->can_edit_submission($student3->id, $student1->id));
3409
        $this->assertFalse($assign->can_edit_submission($student4->id, $student1->id));
3597
        $this->assertFalse($assign->can_edit_submission($student4->id, $student1->id));
-
 
3598
        $this->assertFalse($assign->can_edit_submission($student5->id, $student1->id));
Línea 3410... Línea 3599...
3410
 
3599
 
3411
        // Verify other students do not have the ability to edit submissions for other users.
3600
        // Verify other students do not have the ability to edit submissions for other users.
3412
        $this->assertTrue($assign->can_edit_submission($student2->id, $student2->id));
3601
        $this->assertTrue($assign->can_edit_submission($student2->id, $student2->id));
3413
        $this->assertFalse($assign->can_edit_submission($student1->id, $student2->id));
3602
        $this->assertFalse($assign->can_edit_submission($student1->id, $student2->id));
3414
        $this->assertFalse($assign->can_edit_submission($student3->id, $student2->id));
3603
        $this->assertFalse($assign->can_edit_submission($student3->id, $student2->id));
-
 
3604
        $this->assertFalse($assign->can_edit_submission($student4->id, $student2->id));
-
 
3605
        $this->assertFalse($assign->can_edit_submission($student5->id, $student2->id));
-
 
3606
 
-
 
3607
        // Add the required capability to edit other submissions and to view all groups to the teacher.
-
 
3608
        $roleid = create_role('Dummy role 2', 'dummyrole2', 'dummy role description');
-
 
3609
        assign_capability('mod/assign:editothersubmission', CAP_ALLOW, $roleid, $assign->get_context()->id);
-
 
3610
        assign_capability('moodle/site:accessallgroups', CAP_ALLOW, $roleid, $assign->get_context()->id);
-
 
3611
        role_assign($roleid, $teacher->id, $assign->get_context()->id);
-
 
3612
 
-
 
3613
        // Verify the teacher has the ability to edit submissions for other users including users not in a group.
-
 
3614
        $this->assertTrue($assign->can_edit_submission($student1->id, $teacher->id));
-
 
3615
        $this->assertTrue($assign->can_edit_submission($student2->id, $teacher->id));
-
 
3616
        $this->assertTrue($assign->can_edit_submission($student3->id, $teacher->id));
-
 
3617
        $this->assertTrue($assign->can_edit_submission($student4->id, $teacher->id));
3415
        $this->assertFalse($assign->can_edit_submission($student4->id, $student2->id));
3618
        $this->assertTrue($assign->can_edit_submission($student5->id, $teacher->id));
Línea 3416... Línea 3619...
3416
    }
3619
    }
3417
 
3620
 
3418
    /**
3621
    /**
Línea 3459... Línea 3662...
3459
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3662
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3460
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3663
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3461
        $student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3664
        $student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3462
        $student4 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3665
        $student4 = $this->getDataGenerator()->create_and_enrol($course, 'student');
Línea 3463... Línea 3666...
3463
 
3666
 
3464
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
3667
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
3465
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3668
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3466
        groups_assign_grouping($grouping->id, $group1->id);
3669
        groups_assign_grouping($grouping->id, $group1->id);
3467
        groups_add_member($group1, $student1);
3670
        groups_add_member($group1, $student1);
Línea 3512... Línea 3715...
3512
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3715
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3513
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3716
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3514
        $student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3717
        $student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3515
        $student4 = $this->getDataGenerator()->create_and_enrol($course, 'student');
3718
        $student4 = $this->getDataGenerator()->create_and_enrol($course, 'student');
Línea 3516... Línea 3719...
3516
 
3719
 
3517
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
3720
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
3518
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3721
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3519
        groups_assign_grouping($grouping->id, $group1->id);
3722
        groups_assign_grouping($grouping->id, $group1->id);
3520
        groups_add_member($group1, $student1);
3723
        groups_add_member($group1, $student1);
Línea 3583... Línea 3786...
3583
                continue;
3786
                continue;
3584
            }
3787
            }
3585
            $fileareas = $plugin->get_file_areas();
3788
            $fileareas = $plugin->get_file_areas();
Línea 3586... Línea 3789...
3586
 
3789
 
3587
            if ($type == 'onlinetext') {
3790
            if ($type == 'onlinetext') {
3588
                $this->assertEquals(array('submissions_onlinetext' => 'Online text'), $fileareas);
3791
                $this->assertEquals(['submissions_onlinetext' => 'Online text'], $fileareas);
3589
                $usingfilearea++;
3792
                $usingfilearea++;
3590
            } else if ($type == 'file') {
3793
            } else if ($type == 'file') {
3591
                $this->assertEquals(array('submission_files' => 'File submissions'), $fileareas);
3794
                $this->assertEquals(['submission_files' => 'File submissions'], $fileareas);
3592
                $usingfilearea++;
3795
                $usingfilearea++;
3593
            } else {
3796
            } else {
3594
                $this->assertEmpty($fileareas);
3797
                $this->assertEmpty($fileareas);
3595
            }
3798
            }
Línea 3613... Línea 3816...
3613
                    'importhtml' => 'Annotate PDF',
3816
                    'importhtml' => 'Annotate PDF',
3614
                    'pages' => 'Annotate PDF',
3817
                    'pages' => 'Annotate PDF',
3615
                    'readonlypages' => 'Annotate PDF',
3818
                    'readonlypages' => 'Annotate PDF',
3616
                    'stamps' => 'Annotate PDF',
3819
                    'stamps' => 'Annotate PDF',
3617
                    'tmp_jpg_to_pdf' => 'Annotate PDF',
3820
                    'tmp_jpg_to_pdf' => 'Annotate PDF',
3618
                    'tmp_rotated_jpg' => 'Annotate PDF'
3821
                    'tmp_rotated_jpg' => 'Annotate PDF',
3619
                ];
3822
                ];
3620
                $this->assertEquals($checkareas, $fileareas);
3823
                $this->assertEquals($checkareas, $fileareas);
3621
                $usingfilearea++;
3824
                $usingfilearea++;
3622
            } else if ($type == 'file') {
3825
            } else if ($type == 'file') {
3623
                $this->assertEquals(array('feedback_files' => 'Feedback files'), $fileareas);
3826
                $this->assertEquals(['feedback_files' => 'Feedback files'], $fileareas);
3624
                $usingfilearea++;
3827
                $usingfilearea++;
3625
            } else if ($type == 'comments') {
3828
            } else if ($type == 'comments') {
3626
                $this->assertEquals(array('feedback' => 'Feedback comments'), $fileareas);
3829
                $this->assertEquals(['feedback' => 'Feedback comments'], $fileareas);
3627
                $usingfilearea++;
3830
                $usingfilearea++;
3628
            } else {
3831
            } else {
3629
                $this->assertEmpty($fileareas);
3832
                $this->assertEmpty($fileareas);
3630
            }
3833
            }
3631
        }
3834
        }
Línea 3643... Línea 3846...
3643
 
3846
 
3644
        $this->resetAfterTest();
3847
        $this->resetAfterTest();
3645
        $course = $this->getDataGenerator()->create_course();
3848
        $course = $this->getDataGenerator()->create_course();
Línea 3646... Línea 3849...
3646
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
3849
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
3647
 
3850
 
3648
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
3851
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
Línea 3649... Línea 3852...
3649
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3852
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3650
        $group2 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3853
        $group2 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
Línea 3683... Línea 3886...
3683
                'userid' => null,
3886
                'userid' => null,
3684
                'sortorder' => 1,
3887
                'sortorder' => 1,
3685
                'allowsubmissionsfromdate' => 1,
3888
                'allowsubmissionsfromdate' => 1,
3686
                'duedate' => 2,
3889
                'duedate' => 2,
3687
                'cutoffdate' => 3,
3890
                'cutoffdate' => 3,
3688
                'timelimit' => null
3891
                'timelimit' => null,
3689
            ],
3892
            ],
3690
            (object) [
3893
            (object) [
3691
                // Override for group 2, lower priority (numerically higher sortorder).
3894
                // Override for group 2, lower priority (numerically higher sortorder).
3692
                'assignid' => $instance->id,
3895
                'assignid' => $instance->id,
3693
                'groupid' => $group2->id,
3896
                'groupid' => $group2->id,
3694
                'userid' => null,
3897
                'userid' => null,
3695
                'sortorder' => 2,
3898
                'sortorder' => 2,
3696
                'allowsubmissionsfromdate' => 5,
3899
                'allowsubmissionsfromdate' => 5,
3697
                'duedate' => 6,
3900
                'duedate' => 6,
3698
                'cutoffdate' => 6,
3901
                'cutoffdate' => 6,
3699
                'timelimit' => null
3902
                'timelimit' => null,
3700
            ],
3903
            ],
3701
            (object) [
3904
            (object) [
3702
                // User override.
3905
                // User override.
3703
                'assignid' => $instance->id,
3906
                'assignid' => $instance->id,
3704
                'groupid' => null,
3907
                'groupid' => null,
3705
                'userid' => $student3->id,
3908
                'userid' => $student3->id,
3706
                'sortorder' => null,
3909
                'sortorder' => null,
3707
                'allowsubmissionsfromdate' => 7,
3910
                'allowsubmissionsfromdate' => 7,
3708
                'duedate' => 8,
3911
                'duedate' => 8,
3709
                'cutoffdate' => 9,
3912
                'cutoffdate' => 9,
3710
                'timelimit' => null
3913
                'timelimit' => null,
3711
            ],
3914
            ],
3712
        ];
3915
        ];
Línea 3713... Línea 3916...
3713
 
3916
 
3714
        foreach ($overrides as &$override) {
3917
        foreach ($overrides as &$override) {
Línea 3744... Línea 3947...
3744
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
3947
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
Línea 3745... Línea 3948...
3745
 
3948
 
3746
        $teacher->ignoresesskey = true;
3949
        $teacher->ignoresesskey = true;
3747
        $this->setUser($teacher);
3950
        $this->setUser($teacher);
-
 
3951
        $assign = $this->create_instance($course, [
3748
        $assign = $this->create_instance($course, [
3952
                'maxattempts' => ASSIGN_UNLIMITED_ATTEMPTS,
3749
                'attemptreopenmethod' => ASSIGN_ATTEMPT_REOPEN_METHOD_MANUAL,
3953
                'attemptreopenmethod' => ASSIGN_ATTEMPT_REOPEN_METHOD_MANUAL,
Línea 3750... Línea 3954...
3750
            ]);
3954
            ]);
3751
 
3955
 
Línea 3765... Línea 3969...
3765
        $grade = $assign->get_user_grade($student->id, false);
3969
        $grade = $assign->get_user_grade($student->id, false);
3766
        $this->assertEquals(60.0, $grade->grade);
3970
        $this->assertEquals(60.0, $grade->grade);
Línea 3767... Línea 3971...
3767
 
3971
 
3768
        // Attempt to grade with a past attempts grade info.
3972
        // Attempt to grade with a past attempts grade info.
3769
        $assign->testable_process_add_attempt($student->id);
3973
        $assign->testable_process_add_attempt($student->id);
3770
        $data = array(
3974
        $data = [
3771
            'grademodified_' . $student->id => $grade->timemodified,
3975
            'grademodified_' . $student->id => $grade->timemodified,
3772
            'gradeattempt_' . $student->id => $grade->attemptnumber,
3976
            'gradeattempt_' . $student->id => $grade->attemptnumber,
3773
            'quickgrade_' . $student->id => '50.0'
3977
            'quickgrade_' . $student->id => '50.0',
3774
        );
3978
        ];
3775
        $result = $assign->testable_process_save_quick_grades($data);
3979
        $result = $assign->testable_process_save_quick_grades($data);
3776
        $this->assertStringContainsString(get_string('errorrecordmodified', 'assign'), $result);
3980
        $this->assertStringContainsString(get_string('errorrecordmodified', 'assign'), $result);
3777
        $grade = $assign->get_user_grade($student->id, false);
3981
        $grade = $assign->get_user_grade($student->id, false);
Línea 3778... Línea 3982...
3778
        $this->assertFalse($grade);
3982
        $this->assertFalse($grade);
3779
 
3983
 
3780
        // Attempt to grade a the attempt.
3984
        // Attempt to grade a the attempt.
3781
        $submission = $assign->get_user_submission($student->id, false);
3985
        $submission = $assign->get_user_submission($student->id, false);
3782
        $data = array(
3986
        $data = [
3783
            'grademodified_' . $student->id => '',
3987
            'grademodified_' . $student->id => '',
3784
            'gradeattempt_' . $student->id => $submission->attemptnumber,
3988
            'gradeattempt_' . $student->id => $submission->attemptnumber,
3785
            'quickgrade_' . $student->id => '40.0'
3989
            'quickgrade_' . $student->id => '40.0',
3786
        );
3990
        ];
3787
        $result = $assign->testable_process_save_quick_grades($data);
3991
        $result = $assign->testable_process_save_quick_grades($data);
3788
        $this->assertStringContainsString(get_string('quickgradingchangessaved', 'assign'), $result);
3992
        $this->assertStringContainsString(get_string('quickgradingchangessaved', 'assign'), $result);
Línea 3789... Línea 3993...
3789
        $grade = $assign->get_user_grade($student->id, false);
3993
        $grade = $assign->get_user_grade($student->id, false);
3790
        $this->assertEquals(40.0, $grade->grade);
3994
        $this->assertEquals(40.0, $grade->grade);
3791
 
3995
 
3792
        // Catch grade update conflicts.
3996
        // Catch grade update conflicts.
3793
        // Save old data for later.
3997
        // Save old data for later.
3794
        $pastdata = $data;
3998
        $pastdata = $data;
3795
        // Update the grade the 'good' way.
3999
        // Update the grade the 'good' way.
3796
        $data = array(
4000
        $data = [
3797
            'grademodified_' . $student->id => $grade->timemodified,
4001
            'grademodified_' . $student->id => $grade->timemodified,
3798
            'gradeattempt_' . $student->id => $grade->attemptnumber,
4002
            'gradeattempt_' . $student->id => $grade->attemptnumber,
3799
            'quickgrade_' . $student->id => '30.0'
4003
            'quickgrade_' . $student->id => '30.0',
3800
        );
4004
        ];
3801
        $result = $assign->testable_process_save_quick_grades($data);
4005
        $result = $assign->testable_process_save_quick_grades($data);
Línea 3836... Línea 4040...
3836
        $completiondata = $completion->get_data($cm, false, $student->id);
4040
        $completiondata = $completion->get_data($cm, false, $student->id);
3837
        $this->assertEquals(0, $completiondata->completionstate);
4041
        $this->assertEquals(0, $completiondata->completionstate);
Línea 3838... Línea 4042...
3838
 
4042
 
3839
        // Update to mark as complete.
4043
        // Update to mark as complete.
3840
        $submission = $assign->get_user_submission($student->id, true);
4044
        $submission = $assign->get_user_submission($student->id, true);
-
 
4045
        $assign->testable_update_activity_completion_records(
-
 
4046
            0,
-
 
4047
            0,
-
 
4048
            $submission,
3841
        $assign->testable_update_activity_completion_records(0, 0, $submission,
4049
            $student->id,
-
 
4050
            COMPLETION_COMPLETE,
-
 
4051
            $completion
Línea 3842... Línea 4052...
3842
            $student->id, COMPLETION_COMPLETE, $completion);
4052
        );
3843
 
4053
 
3844
        // Completion should now be met.
4054
        // Completion should now be met.
3845
        $completiondata = $completion->get_data($cm, false, $student->id);
4055
        $completiondata = $completion->get_data($cm, false, $student->id);
Línea 3855... Línea 4065...
3855
        $course = $this->getDataGenerator()->create_course(['enablecompletion' => 1]);
4065
        $course = $this->getDataGenerator()->create_course(['enablecompletion' => 1]);
3856
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
4066
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
3857
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
4067
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
3858
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
4068
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
Línea 3859... Línea 4069...
3859
 
4069
 
3860
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
4070
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
Línea 3861... Línea 4071...
3861
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
4071
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3862
 
4072
 
Línea 3906... Línea 4116...
3906
        $course = $this->getDataGenerator()->create_course(['enablecompletion' => 1]);
4116
        $course = $this->getDataGenerator()->create_course(['enablecompletion' => 1]);
3907
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
4117
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
3908
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
4118
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
3909
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
4119
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
Línea 3910... Línea 4120...
3910
 
4120
 
3911
        $grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
4121
        $grouping = $this->getDataGenerator()->create_grouping(['courseid' => $course->id]);
Línea 3912... Línea 4122...
3912
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
4122
        $group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
3913
 
4123
 
Línea 3914... Línea 4124...
3914
        groups_add_member($group1, $student);
4124
        groups_add_member($group1, $student);
3915
        groups_add_member($group1, $otherstudent);
4125
        groups_add_member($group1, $otherstudent);
3916
 
4126
 
3917
        $assign = $this->create_instance($course, [
4127
        $assign = $this->create_instance($course, [
3918
            'submissiondrafts' => 0,
4128
            'submissiondrafts' => 0,
3919
            'completion' => COMPLETION_TRACKING_AUTOMATIC,
4129
            'completion' => COMPLETION_TRACKING_AUTOMATIC,
3920
            'completionsubmit' => 1,
4130
            'completionsubmit' => 1,
Línea 3921... Línea 4131...
3921
            'teamsubmission' => 1,
4131
            'teamsubmission' => 1,
Línea 3922... Línea 4132...
3922
            'assignsubmission_onlinetext_enabled' => 1
4132
            'assignsubmission_onlinetext_enabled' => 1,
Línea 3938... Línea 4148...
3938
 
4148
 
3939
    /**
4149
    /**
3940
     * Data provider for test_fix_null_grades
4150
     * Data provider for test_fix_null_grades
3941
     * @return array[] Test data for test_fix_null_grades. Each element should contain grade, expectedcount and gradebookvalue
4151
     * @return array[] Test data for test_fix_null_grades. Each element should contain grade, expectedcount and gradebookvalue
3942
     */
4152
     */
3943
    public function fix_null_grades_provider() {
4153
    public static function fix_null_grades_provider(): array {
3944
        return [
4154
        return [
3945
            'Negative less than one is errant' => [
4155
            'Negative less than one is errant' => [
3946
                'grade' => -0.64,
4156
                'grade' => -0.64,
3947
                'gradebookvalue' => null,
4157
                'gradebookvalue' => null,
Línea 4007... Línea 4217...
4007
        $assigntemp->cmidnumber = $assign->get_course_module()->idnumber;
4217
        $assigntemp->cmidnumber = $assign->get_course_module()->idnumber;
4008
        assign_update_grades($assigntemp);
4218
        assign_update_grades($assigntemp);
Línea 4009... Línea 4219...
4009
 
4219
 
4010
        // Check that the gradebook was updated with the assign grade. So we can guarentee test results later on.
4220
        // Check that the gradebook was updated with the assign grade. So we can guarentee test results later on.
4011
        $expectedgrade = $grade == -1 ? null : $grade; // Assign sends null to the gradebook for -1 grades.
4221
        $expectedgrade = $grade == -1 ? null : $grade; // Assign sends null to the gradebook for -1 grades.
4012
        $gradegrade = \grade_grade::fetch(array('userid' => $student->id, 'itemid' => $assign->get_grade_item()->id));
4222
        $gradegrade = \grade_grade::fetch(['userid' => $student->id, 'itemid' => $assign->get_grade_item()->id]);
4013
        $this->assertEquals(-1, $gradegrade->usermodified);
4223
        $this->assertEquals(-1, $gradegrade->usermodified);
Línea 4014... Línea 4224...
4014
        $this->assertEquals($expectedgrade, $gradegrade->rawgrade);
4224
        $this->assertEquals($expectedgrade, $gradegrade->rawgrade);
4015
 
4225
 
4016
        // Call fix_null_grades().
4226
        // Call fix_null_grades().
Línea 4017... Línea 4227...
4017
        $method = new \ReflectionMethod(\assign::class, 'fix_null_grades');
4227
        $method = new \ReflectionMethod(\assign::class, 'fix_null_grades');
Línea 4018... Línea 4228...
4018
        $result = $method->invoke($assign);
4228
        $result = $method->invoke($assign);
Línea 4019... Línea 4229...
4019
 
4229
 
4020
        $this->assertSame(true, $result);
4230
        $this->assertSame(true, $result);
Línea 4021... Línea 4231...
4021
 
4231
 
Línea 4092... Línea 4302...
4092
 
4302
 
4093
        $course = $this->getDataGenerator()->create_course();
4303
        $course = $this->getDataGenerator()->create_course();
4094
        $assign = $this->create_instance($course);
4304
        $assign = $this->create_instance($course);
Línea 4095... Línea 4305...
4095
        $valid = $assign->get_filters();
4305
        $valid = $assign->get_filters();
4096
 
4306
 
Línea 4097... Línea 4307...
4097
        $this->assertEquals(count($valid), 6);
4307
        $this->assertEquals(count($valid), 7);
4098
    }
4308
    }
4099
 
4309
 
Línea 4104... Línea 4314...
4104
     * @param array $courseconfig the config to use when creating the course.
4314
     * @param array $courseconfig the config to use when creating the course.
4105
     * @param array $assignconfig the config to use when creating the assignment.
4315
     * @param array $assignconfig the config to use when creating the assignment.
4106
     * @param array $enrolconfig the config to use when enrolling the user (this will be the active user).
4316
     * @param array $enrolconfig the config to use when enrolling the user (this will be the active user).
4107
     * @param array $expectedproperties an map containing the expected names and values for the assign instance data.
4317
     * @param array $expectedproperties an map containing the expected names and values for the assign instance data.
4108
     */
4318
     */
4109
    public function test_assign_get_instance(array $courseconfig, array $assignconfig, array $enrolconfig,
4319
    public function test_assign_get_instance(
-
 
4320
        array $courseconfig,
-
 
4321
        array $assignconfig,
-
 
4322
        array $enrolconfig,
4110
            array $expectedproperties): void {
4323
        array $expectedproperties
-
 
4324
    ): void {
4111
        $this->resetAfterTest();
4325
        $this->resetAfterTest();
Línea 4112... Línea 4326...
4112
 
4326
 
Línea 4113... Línea 4327...
4113
        set_config('enablecourserelativedates', true); // Enable relative dates at site level.
4327
        set_config('enablecourserelativedates', true); // Enable relative dates at site level.
Línea 4123... Línea 4337...
4123
        }
4337
        }
4124
    }
4338
    }
Línea 4125... Línea 4339...
4125
 
4339
 
4126
    /**
4340
    /**
-
 
4341
     * The test_assign_get_instance data provider.
-
 
4342
     *
4127
     * The test_assign_get_instance data provider.
4343
     * @return array[]
4128
     */
4344
     */
4129
    public function assign_get_instance_provider() {
4345
    public static function assign_get_instance_provider(): array {
Línea 4130... Línea 4346...
4130
        $timenow = time();
4346
        $timenow = time();
4131
 
4347
 
4132
        // The get_default_instance() method shouldn't calculate any properties per-user. It should just return the record data.
4348
        // The get_default_instance() method shouldn't calculate any properties per-user. It should just return the record data.
4133
        // We'll confirm this works for a few different user types anyway, just like we do for get_instance().
4349
        // We'll confirm this works for a few different user types anyway, just like we do for get_instance().
4134
        return [
4350
        return [
4135
            'Teacher whose enrolment starts after the course start date, relative dates mode enabled' => [
4351
            'Teacher whose enrolment starts after the course start date, relative dates mode enabled' => [
4136
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4352
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4137
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4353
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4138
                'enrolconfig' => ['shortname' => 'teacher', 'userparams' => null, 'method' => 'manual',
4354
                'enrolconfig' => ['shortname' => 'teacher', 'userparams' => null, 'method' => 'manual',
4139
                    'startdate' => $timenow - 8 * DAYSECS],
4355
                    'startdate' => $timenow - 8 * DAYSECS],
4140
                'expectedproperties' => ['duedate' => $timenow + 6 * DAYSECS]
4356
                'expectedproperties' => ['duedate' => $timenow + 6 * DAYSECS],
4141
            ],
4357
            ],
4142
            'Teacher whose enrolment starts before the course start date, relative dates mode enabled' => [
4358
            'Teacher whose enrolment starts before the course start date, relative dates mode enabled' => [
4143
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4359
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4144
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4360
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4145
                'enrolconfig' => ['shortname' => 'teacher', 'userparams' => null, 'method' => 'manual',
4361
                'enrolconfig' => ['shortname' => 'teacher', 'userparams' => null, 'method' => 'manual',
4146
                    'startdate' => $timenow - 12 * DAYSECS],
4362
                    'startdate' => $timenow - 12 * DAYSECS],
4147
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS]
4363
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS],
4148
            ],
4364
            ],
4149
            'Teacher whose enrolment starts after the course start date, relative dates mode disabled' => [
4365
            'Teacher whose enrolment starts after the course start date, relative dates mode disabled' => [
4150
                'courseconfig' => ['relativedatesmode' => false, 'startdate' => $timenow - 10 * DAYSECS],
4366
                'courseconfig' => ['relativedatesmode' => false, 'startdate' => $timenow - 10 * DAYSECS],
4151
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4367
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4152
                'enrolconfig' => ['shortname' => 'teacher', 'userparams' => null, 'method' => 'manual',
4368
                'enrolconfig' => ['shortname' => 'teacher', 'userparams' => null, 'method' => 'manual',
4153
                    'startdate' => $timenow - 8 * DAYSECS],
4369
                    'startdate' => $timenow - 8 * DAYSECS],
4154
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS]
4370
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS],
4155
            ],
4371
            ],
4156
            'Student whose enrolment starts after the course start date, relative dates mode enabled' => [
4372
            'Student whose enrolment starts after the course start date, relative dates mode enabled' => [
4157
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4373
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4158
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4374
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4159
                'enrolconfig' => ['shortname' => 'student', 'userparams' => null, 'method' => 'manual',
4375
                'enrolconfig' => ['shortname' => 'student', 'userparams' => null, 'method' => 'manual',
4160
                    'startdate' => $timenow - 8 * DAYSECS],
4376
                    'startdate' => $timenow - 8 * DAYSECS],
4161
                'expectedproperties' => ['duedate' => $timenow + 6 * DAYSECS]
4377
                'expectedproperties' => ['duedate' => $timenow + 6 * DAYSECS],
4162
            ],
4378
            ],
4163
            'Student whose enrolment starts before the course start date, relative dates mode enabled' => [
4379
            'Student whose enrolment starts before the course start date, relative dates mode enabled' => [
4164
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4380
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4165
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4381
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4166
                'enrolconfig' => ['shortname' => 'student', 'userparams' => null, 'method' => 'manual',
4382
                'enrolconfig' => ['shortname' => 'student', 'userparams' => null, 'method' => 'manual',
4167
                    'startdate' => $timenow - 12 * DAYSECS],
4383
                    'startdate' => $timenow - 12 * DAYSECS],
4168
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS]
4384
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS],
4169
            ],
4385
            ],
4170
            'Student whose enrolment starts after the course start date, relative dates mode disabled' => [
4386
            'Student whose enrolment starts after the course start date, relative dates mode disabled' => [
4171
                'courseconfig' => ['relativedatesmode' => false, 'startdate' => $timenow - 10 * DAYSECS],
4387
                'courseconfig' => ['relativedatesmode' => false, 'startdate' => $timenow - 10 * DAYSECS],
4172
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4388
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4173
                'enrolconfig' => ['shortname' => 'student', 'userparams' => null, 'method' => 'manual',
4389
                'enrolconfig' => ['shortname' => 'student', 'userparams' => null, 'method' => 'manual',
4174
                    'startdate' => $timenow - 8 * DAYSECS],
4390
                    'startdate' => $timenow - 8 * DAYSECS],
4175
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS]
4391
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS],
4176
            ],
4392
            ],
Línea 4177... Línea 4393...
4177
        ];
4393
        ];
Línea 4184... Línea 4400...
4184
     * @param array $courseconfig the config to use when creating the course.
4400
     * @param array $courseconfig the config to use when creating the course.
4185
     * @param array $assignconfig the config to use when creating the assignment.
4401
     * @param array $assignconfig the config to use when creating the assignment.
4186
     * @param array $enrolconfig the config to use when enrolling the user (this will be the active user).
4402
     * @param array $enrolconfig the config to use when enrolling the user (this will be the active user).
4187
     * @param array $expectedproperties an map containing the expected names and values for the assign instance data.
4403
     * @param array $expectedproperties an map containing the expected names and values for the assign instance data.
4188
     */
4404
     */
4189
    public function test_assign_get_default_instance(array $courseconfig, array $assignconfig, array $enrolconfig,
4405
    public function test_assign_get_default_instance(
-
 
4406
        array $courseconfig,
-
 
4407
        array $assignconfig,
-
 
4408
        array $enrolconfig,
4190
            array $expectedproperties): void {
4409
        array $expectedproperties
-
 
4410
    ): void {
4191
        $this->resetAfterTest();
4411
        $this->resetAfterTest();
Línea 4192... Línea 4412...
4192
 
4412
 
Línea 4193... Línea 4413...
4193
        set_config('enablecourserelativedates', true); // Enable relative dates at site level.
4413
        set_config('enablecourserelativedates', true); // Enable relative dates at site level.
Línea 4204... Línea 4424...
4204
        }
4424
        }
4205
    }
4425
    }
Línea 4206... Línea 4426...
4206
 
4426
 
4207
    /**
4427
    /**
-
 
4428
     * The test_assign_get_default_instance data provider.
-
 
4429
     *
4208
     * The test_assign_get_default_instance data provider.
4430
     * @return array[]
4209
     */
4431
     */
4210
    public function assign_get_default_instance_provider() {
4432
    public static function assign_get_default_instance_provider(): array {
Línea 4211... Línea 4433...
4211
        $timenow = time();
4433
        $timenow = time();
4212
 
4434
 
4213
        // The get_default_instance() method shouldn't calculate any properties per-user. It should just return the record data.
4435
        // The get_default_instance() method shouldn't calculate any properties per-user. It should just return the record data.
4214
        // We'll confirm this works for a few different user types anyway, just like we do for get_instance().
4436
        // We'll confirm this works for a few different user types anyway, just like we do for get_instance().
4215
        return [
4437
        return [
4216
            'Teacher whose enrolment starts after the course start date, relative dates mode enabled' => [
4438
            'Teacher whose enrolment starts after the course start date, relative dates mode enabled' => [
4217
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4439
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4218
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4440
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4219
                'enrolconfig' => ['shortname' => 'teacher', 'userparams' => null, 'method' => 'manual',
4441
                'enrolconfig' => ['shortname' => 'teacher', 'userparams' => null, 'method' => 'manual',
4220
                    'startdate' => $timenow - 8 * DAYSECS],
4442
                    'startdate' => $timenow - 8 * DAYSECS],
4221
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS]
4443
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS],
4222
            ],
4444
            ],
4223
            'Teacher whose enrolment starts before the course start date, relative dates mode enabled' => [
4445
            'Teacher whose enrolment starts before the course start date, relative dates mode enabled' => [
4224
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4446
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4225
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4447
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4226
                'enrolconfig' => ['shortname' => 'teacher', 'userparams' => null, 'method' => 'manual',
4448
                'enrolconfig' => ['shortname' => 'teacher', 'userparams' => null, 'method' => 'manual',
4227
                    'startdate' => $timenow - 12 * DAYSECS],
4449
                    'startdate' => $timenow - 12 * DAYSECS],
4228
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS]
4450
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS],
4229
            ],
4451
            ],
4230
            'Teacher whose enrolment starts after the course start date, relative dates mode disabled' => [
4452
            'Teacher whose enrolment starts after the course start date, relative dates mode disabled' => [
4231
                'courseconfig' => ['relativedatesmode' => false, 'startdate' => $timenow - 10 * DAYSECS],
4453
                'courseconfig' => ['relativedatesmode' => false, 'startdate' => $timenow - 10 * DAYSECS],
4232
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4454
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4233
                'enrolconfig' => ['shortname' => 'teacher', 'userparams' => null, 'method' => 'manual',
4455
                'enrolconfig' => ['shortname' => 'teacher', 'userparams' => null, 'method' => 'manual',
4234
                    'startdate' => $timenow - 8 * DAYSECS],
4456
                    'startdate' => $timenow - 8 * DAYSECS],
4235
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS]
4457
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS],
4236
            ],
4458
            ],
4237
            'Student whose enrolment starts after the course start date, relative dates mode enabled' => [
4459
            'Student whose enrolment starts after the course start date, relative dates mode enabled' => [
4238
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4460
                'courseconfig' => ['relativedatesmode' => true, 'startdate' => $timenow - 10 * DAYSECS],
4239
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4461
                'assignconfig' => ['duedate' => $timenow + 4 * DAYSECS],
4240
                'enrolconfig' => ['shortname' => 'student', 'userparams' => null, 'method' => 'manual',
4462
                'enrolconfig' => ['shortname' => 'student', 'userparams' => null, 'method' => 'manual',
4241
                    'startdate' => $timenow - 8 * DAYSECS],
4463
                    'startdate' => $timenow - 8 * DAYSECS],
4242
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS]
4464
                'expectedproperties' => ['duedate' => $timenow + 4 * DAYSECS],
4243
            ],
4465
            ],
Línea 4244... Línea 4466...
4244
        ];
4466
        ];
Línea 4270... Línea 4492...
4270
 
4492
 
4271
        // Set last run time 2 days ago.
4493
        // Set last run time 2 days ago.
Línea 4272... Línea 4494...
4272
        $DB->set_field('task_scheduled', 'lastruntime', time() - 2 * DAYSECS, ['classname' => '\mod_assign\task\cron_task']);
4494
        $DB->set_field('task_scheduled', 'lastruntime', time() - 2 * DAYSECS, ['classname' => '\mod_assign\task\cron_task']);
4273
 
4495
 
4274
        // Remove events to make sure cron will update calendar and re-create one of them.
4496
        // Remove events to make sure cron will update calendar and re-create one of them.
4275
        $params = array('modulename' => 'assign', 'instance' => $assign1->get_instance()->id);
4497
        $params = ['modulename' => 'assign', 'instance' => $assign1->get_instance()->id];
4276
        $DB->delete_records('event', $params);
4498
        $DB->delete_records('event', $params);
Línea 4277... Línea 4499...
4277
        $params = array('modulename' => 'assign', 'instance' => $assign2->get_instance()->id);
4499
        $params = ['modulename' => 'assign', 'instance' => $assign2->get_instance()->id];
4278
        $DB->delete_records('event', $params);
4500
        $DB->delete_records('event', $params);
Línea 4279... Línea 4501...
4279
 
4501
 
4280
        // Run cron.
4502
        // Run cron.
4281
        \assign::cron();
4503
        \assign::cron();
4282
 
4504
 
4283
        // Assert that calendar hasn't been updated for the first assignment as it's supposed to be
4505
        // Assert that calendar hasn't been updated for the first assignment as it's supposed to be
Línea 4284... Línea 4506...
4284
        // updated as part of previous cron runs (allowsubmissionsfromdate is less than lastruntime).
4506
        // updated as part of previous cron runs (allowsubmissionsfromdate is less than lastruntime).
4285
        $params = array('modulename' => 'assign', 'instance' => $assign1->get_instance()->id);
4507
        $params = ['modulename' => 'assign', 'instance' => $assign1->get_instance()->id];
4286
        $event1 = $DB->get_record('event', $params);
4508
        $event1 = $DB->get_record('event', $params);
4287
        $this->assertEmpty($event1);
4509
        $this->assertEmpty($event1);
4288
 
4510
 
4289
        // Assert that calendar has been updated for the second assignment
4511
        // Assert that calendar has been updated for the second assignment
4290
        // because its allowsubmissionsfromdate is greater than lastruntime.
4512
        // because its allowsubmissionsfromdate is greater than lastruntime.
Línea 4291... Línea 4513...
4291
        $params = array('modulename' => 'assign', 'instance' => $assign2->get_instance()->id);
4513
        $params = ['modulename' => 'assign', 'instance' => $assign2->get_instance()->id];
4292
        $event2 = $DB->get_record('event', $params);
-
 
4293
        $this->assertNotEmpty($event2);
-
 
4294
        $this->assertSame('This one should be re-created', $event2->description);
-
 
4295
    }
-
 
4296
 
-
 
4297
    /**
-
 
4298
     * Test submissions that need grading output after one ungraded submission
-
 
4299
     */
-
 
4300
    public function test_submissions_need_grading(): void {
-
 
4301
        global $PAGE;
-
 
4302
 
-
 
4303
        $this->resetAfterTest();
-
 
4304
        $course = $this->getDataGenerator()->create_course();
-
 
4305
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
-
 
4306
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
-
 
4307
 
-
 
4308
        // Setup the assignment.
-
 
4309
        $this->setUser($teacher);
-
 
4310
        $time = time();
-
 
4311
        $assign = $this->create_instance($course, [
-
 
4312
                'assignsubmission_onlinetext_enabled' => 1,
-
 
4313
            ]);
-
 
4314
        $PAGE->set_url(new \moodle_url('/mod/assign/view.php', [
-
 
4315
            'id' => $assign->get_course_module()->id,
-
 
4316
            'action' => 'grading',
-
 
4317
        ]));
-
 
4318
 
-
 
4319
        // Check for 0 submissions.
-
 
4320
        $summary = $assign->view('viewcourseindex');
-
 
4321
 
-
 
4322
        $this->assertStringContainsString('/mod/assign/view.php?id=' .
-
 
4323
            $assign->get_course_module()->id . '&amp;action=grading">' .
-
 
4324
            get_string('numberofsubmissionsneedgradinglabel', 'assign', 0) . '</a>', $summary);
-
 
4325
 
-
 
4326
        // Simulate an assignment submission.
-
 
4327
        $this->setUser($student);
-
 
4328
        $submission = $assign->get_user_submission($student->id, true);
-
 
4329
        $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
-
 
4330
        $assign->testable_update_submission($submission, $student->id, true, false);
-
 
4331
        $data = new \stdClass();
-
 
4332
        $data->onlinetext_editor = [
-
 
4333
            'itemid' => file_get_unused_draft_itemid(),
-
 
4334
            'text' => 'Submission text',
-
 
4335
            'format' => FORMAT_MOODLE,
-
 
4336
        ];
-
 
4337
        $plugin = $assign->get_submission_plugin_by_type('onlinetext');
-
 
4338
        $plugin->save($submission, $data);
-
 
4339
 
-
 
4340
        // Check for 1 ungraded submission.
-
 
4341
        $this->setUser($teacher);
-
 
4342
 
-
 
4343
        $summary = $assign->view('viewcourseindex');
-
 
4344
 
-
 
4345
        $this->assertStringContainsString('/mod/assign/view.php?id=' .
4514
        $event2 = $DB->get_record('event', $params);
4346
            $assign->get_course_module()->id .  '&amp;action=grading">' .
4515
        $this->assertNotEmpty($event2);
4347
            get_string('numberofsubmissionsneedgradinglabel', 'assign', 1) . '</a>', $summary);
4516
        $this->assertSame('This one should be re-created', $event2->description);
4348
    }
4517
    }
4349
 
4518
 
4350
    /**
4519
    /**
4351
     * Test that attachments should not be provided if \assign->show_intro returns false.
4520
     * Test that attachments should not be provided if \assign->show_intro returns false.
4352
     *
4521
     *
4353
     * @covers \assign::should_provide_intro_attachments
4522
     * @covers \assign::should_provide_intro_attachments
4354
     */
4523
     */
4355
    public function test_should_provide_intro_attachments_with_show_intro_disabled(): void {
4524
    public function test_should_provide_intro_attachments_with_show_intro_disabled(): void {
4356
        $this->resetAfterTest();
4525
        $this->resetAfterTest();
4357
        $futuredate = time() + 300;
4526
        $futuredate = time() + 300;
Línea 4367... Línea 4536...
4367
     *
4536
     *
4368
     * @covers \assign::should_provide_intro_attachments
4537
     * @covers \assign::should_provide_intro_attachments
4369
     */
4538
     */
4370
    public function test_should_provide_intro_attachments_with_bypass_capability(): void {
4539
    public function test_should_provide_intro_attachments_with_bypass_capability(): void {
4371
        $this->resetAfterTest();
4540
        $this->resetAfterTest();
4372
        list($assign, $instance, $student) = $this->create_submission([
4541
        [$assign, $instance, $student] = $this->create_submission([
4373
            'submissionattachments' => 1,
4542
            'submissionattachments' => 1,
4374
        ]);
4543
        ]);
4375
        // Provide teaching role to student1 so they are able to bypass time limit restrictions on viewing attachments.
4544
        // Provide teaching role to student1 so they are able to bypass time limit restrictions on viewing attachments.
4376
        $this->getDataGenerator()->enrol_user($student->id, $instance->course, 'editingteacher');
4545
        $this->getDataGenerator()->enrol_user($student->id, $instance->course, 'editingteacher');
4377
        $this->assertTrue($assign->should_provide_intro_attachments($student->id));
4546
        $this->assertTrue($assign->should_provide_intro_attachments($student->id));
Línea 4382... Línea 4551...
4382
     *
4551
     *
4383
     * @covers \assign::should_provide_intro_attachments
4552
     * @covers \assign::should_provide_intro_attachments
4384
     */
4553
     */
4385
    public function test_should_provide_intro_attachments_with_submissionattachments_disabled(): void {
4554
    public function test_should_provide_intro_attachments_with_submissionattachments_disabled(): void {
4386
        $this->resetAfterTest();
4555
        $this->resetAfterTest();
4387
        list($assign, $instance, $student) = $this->create_submission();
4556
        [$assign, $instance, $student] = $this->create_submission();
4388
        $this->assertTrue($assign->should_provide_intro_attachments($student->id));
4557
        $this->assertTrue($assign->should_provide_intro_attachments($student->id));
4389
    }
4558
    }
Línea 4390... Línea 4559...
4390
 
4559
 
4391
    /**
4560
    /**
Línea 4394... Línea 4563...
4394
     * @covers \assign::should_provide_intro_attachments
4563
     * @covers \assign::should_provide_intro_attachments
4395
     */
4564
     */
4396
    public function test_should_provide_intro_attachments_with_submissionattachments_enabled_and_submissions_closed(): void {
4565
    public function test_should_provide_intro_attachments_with_submissionattachments_enabled_and_submissions_closed(): void {
4397
        $this->resetAfterTest();
4566
        $this->resetAfterTest();
4398
        // Set cut-off date to the past.
4567
        // Set cut-off date to the past.
4399
        list($assign, $instance, $student) = $this->create_submission([
4568
        [$assign, $instance, $student] = $this->create_submission([
4400
            'timelimit' => '300',
4569
            'timelimit' => '300',
4401
            'submissionattachments' => 1,
4570
            'submissionattachments' => 1,
4402
            'cutoffdate' => time() - 300,
4571
            'cutoffdate' => time() - 300,
4403
        ]);
4572
        ]);
4404
        $this->assertFalse($assign->should_provide_intro_attachments($student->id));
4573
        $this->assertFalse($assign->should_provide_intro_attachments($student->id));
Línea 4410... Línea 4579...
4410
     * @covers \assign::should_provide_intro_attachments
4579
     * @covers \assign::should_provide_intro_attachments
4411
     */
4580
     */
4412
    public function test_should_provide_intro_attachments_submissionattachments_enabled_and_an_open_submission(): void {
4581
    public function test_should_provide_intro_attachments_submissionattachments_enabled_and_an_open_submission(): void {
4413
        $this->resetAfterTest();
4582
        $this->resetAfterTest();
4414
        set_config('enabletimelimit', '1', 'assign');
4583
        set_config('enabletimelimit', '1', 'assign');
4415
        list($assign, $instance, $student) = $this->create_submission([
4584
        [$assign, $instance, $student] = $this->create_submission([
4416
            'timelimit' => '300',
4585
            'timelimit' => '300',
4417
            'submissionattachments' => 1,
4586
            'submissionattachments' => 1,
4418
        ]);
4587
        ]);
Línea 4419... Línea 4588...
4419
 
4588
 
Línea 4430... Línea 4599...
4430
     */
4599
     */
4431
    public function test_is_attempt_in_progress_with_open_submission(): void {
4600
    public function test_is_attempt_in_progress_with_open_submission(): void {
4432
        global $DB;
4601
        global $DB;
4433
        $this->resetAfterTest();
4602
        $this->resetAfterTest();
4434
        set_config('enabletimelimit', '1', 'assign');
4603
        set_config('enabletimelimit', '1', 'assign');
4435
        list($assign, $instance, $student) = $this->create_submission([
4604
        [$assign, $instance, $student] = $this->create_submission([
4436
            'timelimit' => '300',
4605
            'timelimit' => '300',
4437
        ]);
4606
        ]);
4438
        $submission = $assign->get_user_submission($student->id, true);
4607
        $submission = $assign->get_user_submission($student->id, true);
4439
        // Set a timestarted.
4608
        // Set a timestarted.
4440
        $submission->timestarted = time() - 300;
4609
        $submission->timestarted = time() - 300;
Línea 4448... Línea 4617...
4448
     * @covers \assign::is_attempt_in_progress
4617
     * @covers \assign::is_attempt_in_progress
4449
     */
4618
     */
4450
    public function test_is_attempt_in_progress_with_open_submission_and_no_timestarted(): void {
4619
    public function test_is_attempt_in_progress_with_open_submission_and_no_timestarted(): void {
4451
        $this->resetAfterTest();
4620
        $this->resetAfterTest();
4452
        set_config('enabletimelimit', '1', 'assign');
4621
        set_config('enabletimelimit', '1', 'assign');
4453
        list($assign, $instance, $student) = $this->create_submission([
4622
        [$assign, $instance, $student] = $this->create_submission([
4454
            'timelimit' => '300',
4623
            'timelimit' => '300',
4455
        ]);
4624
        ]);
4456
        $assign->get_user_submission($student->id, true);
4625
        $assign->get_user_submission($student->id, true);
4457
        $this->assertFalse($assign->is_attempt_in_progress());
4626
        $this->assertFalse($assign->is_attempt_in_progress());
4458
    }
4627
    }
Línea 4464... Línea 4633...
4464
     */
4633
     */
4465
    public function test_is_attempt_in_progress_with_no_open_submission(): void {
4634
    public function test_is_attempt_in_progress_with_no_open_submission(): void {
4466
        global $DB;
4635
        global $DB;
4467
        $this->resetAfterTest();
4636
        $this->resetAfterTest();
4468
        set_config('enabletimelimit', '1', 'assign');
4637
        set_config('enabletimelimit', '1', 'assign');
4469
        list($assign, $instance, $student) = $this->create_submission([
4638
        [$assign, $instance, $student] = $this->create_submission([
4470
            'timelimit' => '300',
4639
            'timelimit' => '300',
4471
        ]);
4640
        ]);
4472
        // Clear all current submissions.
4641
        // Clear all current submissions.
4473
        $DB->delete_records('assign_submission', ['assignment' => $instance->id]);
4642
        $DB->delete_records('assign_submission', ['assignment' => $instance->id]);
4474
        $this->assertFalse($assign->is_attempt_in_progress());
4643
        $this->assertFalse($assign->is_attempt_in_progress());
Línea 4481... Línea 4650...
4481
     */
4650
     */
4482
    protected function create_submission(array $params = []) {
4651
    protected function create_submission(array $params = []) {
4483
        global $DB;
4652
        global $DB;
Línea 4484... Línea 4653...
4484
 
4653
 
4485
        // Create a course and assignment and users.
4654
        // Create a course and assignment and users.
Línea 4486... Línea 4655...
4486
        $course = self::getDataGenerator()->create_course(array('groupmode' => SEPARATEGROUPS, 'groupmodeforce' => 1));
4655
        $course = self::getDataGenerator()->create_course(['groupmode' => SEPARATEGROUPS, 'groupmodeforce' => 1]);
4487
 
4656
 
4488
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
4657
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
4489
        $params = array_merge(array(
4658
        $params = array_merge([
4490
            'course' => $course->id,
4659
            'course' => $course->id,
4491
            'assignsubmission_file_maxfiles' => 1,
4660
            'assignsubmission_file_maxfiles' => 1,
4492
            'assignsubmission_file_maxsizebytes' => 1024 * 1024,
4661
            'assignsubmission_file_maxsizebytes' => 1024 * 1024,
4493
            'assignsubmission_onlinetext_enabled' => 1,
4662
            'assignsubmission_onlinetext_enabled' => 1,
4494
            'assignsubmission_file_enabled' => 1,
4663
            'assignsubmission_file_enabled' => 1,
4495
            'submissiondrafts' => 1,
4664
            'submissiondrafts' => 1,
4496
            'assignfeedback_file_enabled' => 1,
4665
            'assignfeedback_file_enabled' => 1,
4497
            'assignfeedback_comments_enabled' => 1,
4666
            'assignfeedback_comments_enabled' => 1,
4498
            'attemptreopenmethod' => ASSIGN_ATTEMPT_REOPEN_METHOD_MANUAL,
4667
            'attemptreopenmethod' => ASSIGN_ATTEMPT_REOPEN_METHOD_MANUAL,
Línea 4499... Línea 4668...
4499
            'sendnotifications' => 0
4668
            'sendnotifications' => 0,
Línea 4500... Línea 4669...
4500
        ), $params);
4669
        ], $params);
4501
 
4670
 
4502
        set_config('submissionreceipts', 0, 'assign');
4671
        set_config('submissionreceipts', 0, 'assign');
Línea 4503... Línea 4672...
4503
 
4672
 
Línea 4504... Línea 4673...
4504
        $instance = $generator->create_instance($params);
4673
        $instance = $generator->create_instance($params);
4505
        $cm = get_coursemodule_from_instance('assign', $instance->id);
4674
        $cm = get_coursemodule_from_instance('assign', $instance->id);
4506
        $context = \context_module::instance($cm->id);
4675
        $context = \context_module::instance($cm->id);
Línea 4507... Línea 4676...
4507
 
4676
 
Línea 4508... Línea 4677...
4508
        $assign = new \mod_assign_testable_assign($context, $cm, $course);
4677
        $assign = new \mod_assign_testable_assign($context, $cm, $course);
4509
 
4678
 
4510
        $student = self::getDataGenerator()->create_user();
4679
        $student = self::getDataGenerator()->create_user();
Línea 4511... Línea 4680...
4511
        $studentrole = $DB->get_record('role', array('shortname' => 'student'));
4680
        $studentrole = $DB->get_record('role', ['shortname' => 'student']);
4512
        $this->getDataGenerator()->enrol_user($student->id, $course->id, $studentrole->id);
4681
        $this->getDataGenerator()->enrol_user($student->id, $course->id, $studentrole->id);
4513
 
4682
 
4514
        $this->setUser($student);
4683
        $this->setUser($student);
4515
 
4684
 
Línea 4516... Línea 4685...
4516
        // Create a student1 with an online text submission.
4685
        // Create a student1 with an online text submission.
4517
        // Simulate a submission.
4686
        // Simulate a submission.
4518
        $submission = $assign->get_user_submission($student->id, true);
4687
        $submission = $assign->get_user_submission($student->id, true);
4519
 
4688
 
4520
        $data = new \stdClass();
4689
        $data = new \stdClass();
4521
        $data->onlinetext_editor = array(
4690
        $data->onlinetext_editor = [
4522
            'itemid' => file_get_unused_draft_itemid(),
4691
            'itemid' => file_get_unused_draft_itemid(),
4523
            'text' => 'Submission text with a <a href="@@PLUGINFILE@@/intro.txt">link</a>',
4692
            'text' => 'Submission text with a <a href="@@PLUGINFILE@@/intro.txt">link</a>',
4524
            'format' => FORMAT_MOODLE);
4693
            'format' => FORMAT_MOODLE];
4525
 
4694
 
4526
        $draftidfile = file_get_unused_draft_itemid();
4695
        $draftidfile = file_get_unused_draft_itemid();
4527
        $usercontext = \context_user::instance($student->id);
4696
        $usercontext = \context_user::instance($student->id);
Línea 4528... Línea 4697...
4528
        $filerecord = array(
4697
        $filerecord = [
Línea 4529... Línea 4698...
4529
            'contextid' => $usercontext->id,
4698
            'contextid' => $usercontext->id,
4530
            'component' => 'user',
4699
            'component' => 'user',
Línea 4531... Línea 4700...
4531
            'filearea'  => 'draft',
4700
            'filearea'  => 'draft',
4532
            'itemid'    => $draftidfile,
4701
            'itemid'    => $draftidfile,
Línea 4533... Línea 4702...
4533
            'filepath'  => '/',
4702
            'filepath'  => '/',
4534
            'filename'  => 't.txt',
4703
            'filename'  => 't.txt',
4535
        );
4704
        ];
Línea 4608... Línea 4777...
4608
        // Reset the filter.
4777
        // Reset the filter.
4609
        set_user_preference('assign_filter', '');
4778
        set_user_preference('assign_filter', '');
4610
        $this->AssertTrue($assign->is_userid_filtered($student1->id));
4779
        $this->AssertTrue($assign->is_userid_filtered($student1->id));
4611
        $this->AssertTrue($assign->is_userid_filtered($student2->id));
4780
        $this->AssertTrue($assign->is_userid_filtered($student2->id));
4612
    }
4781
    }
-
 
4782
 
-
 
4783
    /**
-
 
4784
     * Test get_error_messages like a public function.
-
 
4785
     *
-
 
4786
     * @covers \assign::get_error_messages
-
 
4787
     */
-
 
4788
    public function test_get_error_messages(): void {
-
 
4789
        $this->resetAfterTest();
-
 
4790
 
-
 
4791
        // Generate data.
-
 
4792
        $course = $this->getDataGenerator()->create_course();
-
 
4793
        $assign = $this->create_instance($course);
-
 
4794
 
-
 
4795
        // Get the empty error message list.
-
 
4796
        $result = $assign->get_error_messages();
-
 
4797
        $this->assertIsArray($result);
-
 
4798
        $this->assertEmpty($result);
-
 
4799
 
-
 
4800
        // Generate users.
-
 
4801
        $teacher  = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
-
 
4802
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
-
 
4803
 
-
 
4804
        // Set the teacher as user and try to delete the user's submission to create the error.
-
 
4805
        $this->setUser($teacher);
-
 
4806
        $assign->remove_submission($student1->id);
-
 
4807
 
-
 
4808
        // Get the created error messages.
-
 
4809
        $result = $assign->get_error_messages();
-
 
4810
        $this->assertIsArray($result);
-
 
4811
        $this->assertNotEmpty($result);
-
 
4812
    }
-
 
4813
 
-
 
4814
    /**
-
 
4815
     * Test that assignment grades are pushed to the gradebook when anonymous
-
 
4816
     * submissions and marking workflow are enabled (MDL-83195).
-
 
4817
     * @covers \assign::gradebook_item_update
-
 
4818
     */
-
 
4819
    public function test_release_grade_anon(): void {
-
 
4820
        $this->resetAfterTest();
-
 
4821
        $course = $this->getDataGenerator()->create_course();
-
 
4822
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
-
 
4823
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
-
 
4824
 
-
 
4825
        $assign = $this->create_instance($course, [
-
 
4826
            'blindmarking' => 1,
-
 
4827
            'markingworkflow' => 1,
-
 
4828
            'markinganonymous' => 1,
-
 
4829
        ]);
-
 
4830
 
-
 
4831
        // Add a grade and change the workflow status to "Released".
-
 
4832
        $this->mark_submission($teacher, $assign, $student, 50.0,  [
-
 
4833
            'workflowstate' => ASSIGN_MARKING_WORKFLOW_STATE_RELEASED,
-
 
4834
        ]);
-
 
4835
 
-
 
4836
        // Make sure the grade has been pushed to the gradebook.
-
 
4837
        $gradinginfo = grade_get_grades($course->id, 'mod', 'assign', $assign->get_instance()->id, $student->id);
-
 
4838
        $this->assertEquals(50, (int)$gradinginfo->items[0]->grades[$student->id]->grade);
-
 
4839
    }
4613
}
4840
}