public function test_assign_overdue()
 {
     global $PAGE;
     // Create one month overdue assignment.
     $this->setUser($this->teachers[0]);
     $assign = $this->create_instance(['duedate' => time() - 4 * DAYSECS, 'assignsubmission_onlinetext_enabled' => 1, 'name' => 'Overdue Assignment Test']);
     $this->setUser($this->students[0]);
     $modinfo = get_fast_modinfo($this->course);
     $assigncm = $modinfo->instances['assign'][$assign->get_instance()->id];
     $meta = activity::assign_meta($assigncm);
     $this->assertTrue($meta->overdue);
     // Make sure a submission record does not exist.
     $submission = activity::get_submission_row($this->course->id, $assigncm, 'submission', 'assignment');
     $this->assertEmpty($submission);
     // At one time there was an issue where the overdue status would flip after viewing the module.
     // Make sure this isn't happening by viewing the assignment.
     // Code taken from assign/tests/events_test.php test_submission_status_viewed.
     $PAGE->set_url('/a_url');
     // View the assignment.
     $assign->view();
     // Viewing an assignment creates a submission record with a status of new.
     // Make sure a submission record now exists with a status of new.
     $submission = activity::get_submission_row($this->course->id, $assigncm, 'submission', 'assignment');
     $this->assertNotEmpty($submission);
     $this->assertEquals(ASSIGN_SUBMISSION_STATUS_NEW, $submission->status);
     $meta = activity::assign_meta($assigncm);
     // Ensure that assignment is still classed as overdue.
     $this->assertTrue($meta->overdue);
 }
 public function test_assign_reopened_and_resubmitted()
 {
     $this->setUser($this->editingteachers[0]);
     $this->create_instance();
     $assign = $this->create_instance(array('duedate' => time(), 'attemptreopenmethod' => ASSIGN_ATTEMPT_REOPEN_METHOD_MANUAL, 'maxattempts' => 3, 'submissiondrafts' => 1, 'assignsubmission_onlinetext_enabled' => 1));
     // Add a submission.
     $this->setUser($this->students[0]);
     $submission = $assign->get_user_submission($this->students[0]->id, true);
     $data = new stdClass();
     $data->onlinetext_editor = array('itemid' => file_get_unused_draft_itemid(), 'text' => 'Submission text', 'format' => FORMAT_HTML);
     $plugin = $assign->get_submission_plugin_by_type('onlinetext');
     $plugin->save($submission, $data);
     // And now submit it for marking.
     $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
     $assign->testable_update_submission($submission, $this->students[0]->id, true, false);
     // Mark the submission.
     $this->setUser($this->teachers[0]);
     $data = new stdClass();
     $data->grade = '50.0';
     $assign->testable_apply_grade_to_user($data, $this->students[0]->id, 0);
     // TODO remove this next line when the above is fixed  to stop triggering debug messages.
     $this->resetDebugging();
     // This is required so that the submissions timemodified > the grade timemodified.
     sleep(2);
     // Edit the submission again.
     $this->setUser($this->students[0]);
     $submission = $assign->get_user_submission($this->students[0]->id, true);
     $assign->testable_update_submission($submission, $this->students[0]->id, true, false);
     // This is required so that the submissions timemodified > the grade timemodified.
     sleep(2);
     // Allow the student another attempt.
     $this->teachers[0]->ignoresesskey = true;
     $this->setUser($this->teachers[0]);
     $assign->testable_process_add_attempt($this->students[0]->id);
     // Add another submission.
     $this->setUser($this->students[0]);
     $submission = $assign->get_user_submission($this->students[0]->id, true);
     $data = new stdClass();
     $data->onlinetext_editor = array('itemid' => file_get_unused_draft_itemid(), 'text' => 'Submission text 2', 'format' => FORMAT_HTML);
     $plugin = $assign->get_submission_plugin_by_type('onlinetext');
     $plugin->save($submission, $data);
     // And now submit it for marking (again).
     $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
     $assign->testable_update_submission($submission, $this->students[0]->id, true, false);
     $modinfo = get_fast_modinfo($this->course);
     $assigncm = $modinfo->instances['assign'][$assign->get_instance()->id];
     $expnumsubmissions = 1;
     $expnumrequiregrading = 1;
     $this->setUser($this->editingteachers[0]);
     $actual = activity::assign_meta($assigncm);
     $this->assertSame($actual->numsubmissions, $expnumsubmissions);
     $this->assertSame($actual->numrequiregrading, $expnumrequiregrading);
     $this->assertTrue($actual->isteacher);
     $actual = activity::assign_meta($assigncm);
     $this->assertSame($actual->numsubmissions, $expnumsubmissions);
     $this->assertSame($actual->numrequiregrading, $expnumrequiregrading);
     $this->assertTrue($actual->isteacher);
     $this->setUser($this->teachers[0]);
     $actual = activity::assign_meta($assigncm);
     $this->assertSame($actual->numsubmissions, $expnumsubmissions);
     $this->assertSame($actual->numrequiregrading, $expnumrequiregrading);
     $this->assertTrue($actual->isteacher);
     $this->setUser($this->students[0]);
     $actual = activity::assign_meta($assigncm);
     $this->assertFalse($actual->isteacher);
 }