Proyectos de Subversion Moodle

Rev

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

Rev 11 Rev 1441
Línea 84... Línea 84...
84
 * @copyright  2016 Juan Leyva <juan@moodle.com>
84
 * @copyright  2016 Juan Leyva <juan@moodle.com>
85
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
85
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
86
 * @since      Moodle 3.1
86
 * @since      Moodle 3.1
87
 * @covers \mod_quiz_external
87
 * @covers \mod_quiz_external
88
 */
88
 */
89
class external_test extends externallib_advanced_testcase {
89
final class external_test extends externallib_advanced_testcase {
Línea 90... Línea 90...
90
 
90
 
Línea 91... Línea 91...
91
    use \quiz_question_helper_test_trait;
91
    use \quiz_question_helper_test_trait;
92
 
92
 
Línea 117... Línea 117...
117
    /**
117
    /**
118
     * Set up for every test
118
     * Set up for every test
119
     */
119
     */
120
    public function setUp(): void {
120
    public function setUp(): void {
121
        global $DB;
121
        global $DB;
-
 
122
        parent::setUp();
122
        $this->resetAfterTest();
123
        $this->resetAfterTest();
123
        $this->setAdminUser();
124
        $this->setAdminUser();
Línea 124... Línea 125...
124
 
125
 
125
        // Setup test data.
126
        // Setup test data.
Línea 203... Línea 204...
203
                // Process some responses from the student.
204
                // Process some responses from the student.
204
                $tosubmit = [1 => ['answer' => '3.14']];
205
                $tosubmit = [1 => ['answer' => '3.14']];
205
                $attemptobj->process_submitted_actions(time(), false, $tosubmit);
206
                $attemptobj->process_submitted_actions(time(), false, $tosubmit);
Línea 206... Línea 207...
206
 
207
 
207
                // Finish the attempt.
208
                // Finish the attempt.
-
 
209
                $attemptobj->process_submit(time(), false);
208
                $attemptobj->process_finish(time(), false);
210
                $attemptobj->process_grade_submission(time());
209
            }
211
            }
210
            return [$quiz, $context, $quizobj, $attempt, $attemptobj, $quba];
212
            return [$quiz, $context, $quizobj, $attempt, $attemptobj, $quba];
211
        } else {
213
        } else {
212
            return [$quiz, $context, $quizobj];
214
            return [$quiz, $context, $quizobj];
Línea 225... Línea 227...
225
 
227
 
226
        // Second quiz.
228
        // Second quiz.
227
        $record = new \stdClass();
229
        $record = new \stdClass();
228
        $record->course = $course2->id;
230
        $record->course = $course2->id;
-
 
231
        $record->intro = '<button>Test with HTML allowed.</button>';
-
 
232
        $timeopen = time() - 1;
-
 
233
        $record->timeopen = $timeopen;
229
        $record->intro = '<button>Test with HTML allowed.</button>';
234
        $record->precreateattempts = 1;
Línea 230... Línea 235...
230
        $quiz2 = self::getDataGenerator()->create_module('quiz', $record);
235
        $quiz2 = self::getDataGenerator()->create_module('quiz', $record);
231
 
236
 
232
        // Execute real Moodle enrolment as we'll call unenrol() method on the instance later.
237
        // Execute real Moodle enrolment as we'll call unenrol() method on the instance later.
Línea 254... Línea 259...
254
                                        'reviewspecificfeedback', 'reviewgeneralfeedback', 'reviewrightanswer',
259
                                        'reviewspecificfeedback', 'reviewgeneralfeedback', 'reviewrightanswer',
255
                                        'reviewoverallfeedback', 'questionsperpage', 'navmethod',
260
                                        'reviewoverallfeedback', 'questionsperpage', 'navmethod',
256
                                        'browsersecurity', 'delay1', 'delay2', 'showuserpicture', 'showblocks',
261
                                        'browsersecurity', 'delay1', 'delay2', 'showuserpicture', 'showblocks',
257
                                        'completionattemptsexhausted', 'completionpass', 'autosaveperiod', 'hasquestions',
262
                                        'completionattemptsexhausted', 'completionpass', 'autosaveperiod', 'hasquestions',
258
                                        'overduehandling', 'graceperiod', 'canredoquestions', 'allowofflineattempts'];
263
                                        'overduehandling', 'graceperiod', 'canredoquestions', 'allowofflineattempts'];
259
        $managerfields = ['shuffleanswers', 'timecreated', 'timemodified', 'password', 'subnet'];
264
        $managerfields = ['shuffleanswers', 'timecreated', 'timemodified', 'password', 'subnet', 'precreateattempts'];
Línea 260... Línea 265...
260
 
265
 
261
        // Add expected coursemodule and other data.
266
        // Add expected coursemodule and other data.
262
        $quiz1 = $this->quiz;
267
        $quiz1 = $this->quiz;
263
        $quiz1->coursemodule = $quiz1->cmid;
268
        $quiz1->coursemodule = $quiz1->cmid;
Línea 422... Línea 427...
422
            $this->assertEquals('requireloginerror', $e->errorcode);
427
            $this->assertEquals('requireloginerror', $e->errorcode);
423
        }
428
        }
Línea 424... Línea 429...
424
 
429
 
Línea -... Línea 430...
-
 
430
    }
-
 
431
 
-
 
432
    /**
-
 
433
     * Test get_user_attempts
-
 
434
     *
425
    }
435
     * @todo Remove in Moodle 6.0 as part of MDL-80956 final deprecations.
Línea 426... Línea 436...
426
 
436
     */
427
    public function test_get_user_attempts(): void {
437
    public function test_get_user_attempts(): void {
Línea 428... Línea 438...
428
 
438
 
429
        // Create a quiz with one attempt finished.
439
        // Create a quiz with one attempt finished.
-
 
440
        [$quiz, $context, $quizobj, $attempt, $attemptobj] = $this->create_quiz_with_questions(true, true);
430
        [$quiz, $context, $quizobj, $attempt, $attemptobj] = $this->create_quiz_with_questions(true, true);
441
 
Línea 431... Línea 442...
431
 
442
        $this->setUser($this->student);
432
        $this->setUser($this->student);
443
        $result = mod_quiz_external::get_user_attempts($quiz->id);
433
        $result = mod_quiz_external::get_user_attempts($quiz->id);
444
        $this->assertDebuggingCalled();
434
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
445
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
435
 
446
 
436
        $this->assertCount(1, $result['attempts']);
447
        $this->assertCount(1, $result['attempts']);
437
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
448
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
-
 
449
        $this->assertEquals($quiz->id, $result['attempts'][0]['quiz']);
Línea 438... Línea 450...
438
        $this->assertEquals($quiz->id, $result['attempts'][0]['quiz']);
450
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
-
 
451
        $this->assertEquals(1, $result['attempts'][0]['attempt']);
439
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
452
        $this->assertArrayHasKey('sumgrades', $result['attempts'][0]);
440
        $this->assertEquals(1, $result['attempts'][0]['attempt']);
453
        $this->assertEquals(1.0, $result['attempts'][0]['sumgrades']);
-
 
454
        $this->assertEquals(quiz_attempt::FINISHED, $result['attempts'][0]['state']);
Línea 441... Línea 455...
441
        $this->assertArrayHasKey('sumgrades', $result['attempts'][0]);
455
 
442
        $this->assertEquals(1.0, $result['attempts'][0]['sumgrades']);
456
        // Test filters. Only finished.
Línea 443... Línea 457...
443
 
457
        $this->resetDebugging();
-
 
458
        $result = mod_quiz_external::get_user_attempts($quiz->id, 0, 'finished', false);
444
        // Test filters. Only finished.
459
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
445
        $result = mod_quiz_external::get_user_attempts($quiz->id, 0, 'finished', false);
460
        $this->assertDebuggingCalled();
-
 
461
 
Línea 446... Línea 462...
446
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
462
        $this->assertCount(1, $result['attempts']);
447
 
463
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
Línea 448... Línea 464...
448
        $this->assertCount(1, $result['attempts']);
464
 
-
 
465
        // Test filters. All attempts.
449
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
466
        $this->resetDebugging();
450
 
467
        $result = mod_quiz_external::get_user_attempts($quiz->id, 0, 'all', false);
-
 
468
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
Línea 451... Línea 469...
451
        // Test filters. All attempts.
469
        $this->assertDebuggingCalled();
Línea 452... Línea 470...
452
        $result = mod_quiz_external::get_user_attempts($quiz->id, 0, 'all', false);
470
 
453
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
471
        $this->assertCount(1, $result['attempts']);
Línea 469... Línea 487...
469
 
487
 
470
        quiz_start_new_attempt($quizobj, $quba, $attempt, 1, $timenow);
488
        quiz_start_new_attempt($quizobj, $quba, $attempt, 1, $timenow);
Línea 471... Línea 489...
471
        quiz_attempt_save_started($quizobj, $quba, $attempt);
489
        quiz_attempt_save_started($quizobj, $quba, $attempt);
-
 
490
 
472
 
491
        // Test filters. All attempts.
473
        // Test filters. All attempts.
492
        $this->resetDebugging();
-
 
493
        $result = mod_quiz_external::get_user_attempts($quiz->id, 0, 'all', false);
Línea 474... Línea 494...
474
        $result = mod_quiz_external::get_user_attempts($quiz->id, 0, 'all', false);
494
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
Línea 475... Línea 495...
475
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
495
        $this->assertDebuggingCalled();
-
 
496
 
476
 
497
        $this->assertCount(2, $result['attempts']);
477
        $this->assertCount(2, $result['attempts']);
498
 
-
 
499
        // Test filters. Unfinished.
Línea 478... Línea 500...
478
 
500
        $this->resetDebugging();
Línea 479... Línea 501...
479
        // Test filters. Unfinished.
501
        $result = mod_quiz_external::get_user_attempts($quiz->id, 0, 'unfinished', false);
480
        $result = mod_quiz_external::get_user_attempts($quiz->id, 0, 'unfinished', false);
502
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
-
 
503
        $this->assertDebuggingCalled();
481
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
504
 
482
 
505
        $this->assertCount(1, $result['attempts']);
-
 
506
 
Línea 483... Línea 507...
483
        $this->assertCount(1, $result['attempts']);
507
        // Test manager can see user attempts.
484
 
508
        $this->setUser($this->teacher);
Línea -... Línea 509...
-
 
509
        $this->resetDebugging();
485
        // Test manager can see user attempts.
510
        $result = mod_quiz_external::get_user_attempts($quiz->id, $this->student->id);
486
        $this->setUser($this->teacher);
511
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
-
 
512
        $this->assertDebuggingCalled();
Línea 487... Línea 513...
487
        $result = mod_quiz_external::get_user_attempts($quiz->id, $this->student->id);
513
 
488
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
514
        $this->assertCount(1, $result['attempts']);
Línea 489... Línea 515...
489
 
515
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
490
        $this->assertCount(1, $result['attempts']);
516
 
-
 
517
        $this->resetDebugging();
491
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
518
        $result = mod_quiz_external::get_user_attempts($quiz->id, $this->student->id, 'all');
492
 
519
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
493
        $result = mod_quiz_external::get_user_attempts($quiz->id, $this->student->id, 'all');
520
        $this->assertDebuggingCalled();
-
 
521
 
494
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
522
        $this->assertCount(2, $result['attempts']);
495
 
523
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
496
        $this->assertCount(2, $result['attempts']);
524
 
Línea -... Línea 525...
-
 
525
        // Invalid parameters.
-
 
526
        try {
-
 
527
            $this->resetDebugging();
-
 
528
            mod_quiz_external::get_user_attempts($quiz->id, $this->student->id, 'INVALID_PARAMETER');
-
 
529
            $this->fail('Exception expected due to missing capability.');
497
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
530
        } catch (\invalid_parameter_exception $e) {
498
 
531
            $this->assertDebuggingCalled();
Línea 499... Línea 532...
499
        // Invalid parameters.
532
            $this->assertEquals('invalidparameter', $e->errorcode);
500
        try {
533
        }
Línea 518... Línea 551...
518
        $structure = $attemptobj->get_quizobj()->get_structure();
551
        $structure = $attemptobj->get_quizobj()->get_structure();
519
        $structure->update_slot_grade_item($structure->get_slot_by_number(1), $listeninggrade->id);
552
        $structure->update_slot_grade_item($structure->get_slot_by_number(1), $listeninggrade->id);
520
        $structure->update_slot_grade_item($structure->get_slot_by_number(2), $readinggrade->id);
553
        $structure->update_slot_grade_item($structure->get_slot_by_number(2), $readinggrade->id);
Línea 521... Línea 554...
521
 
554
 
-
 
555
        $this->setUser($this->student);
522
        $this->setUser($this->student);
556
        $this->resetDebugging();
523
        $result = mod_quiz_external::get_user_attempts($quiz->id);
557
        $result = mod_quiz_external::get_user_attempts($quiz->id);
-
 
558
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
Línea 524... Línea 559...
524
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
559
        $this->assertDebuggingCalled();
525
 
560
 
Línea 526... Línea 561...
526
        $this->assertCount(1, $result['attempts']);
561
        $this->assertCount(1, $result['attempts']);
527
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
562
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
528
 
563
 
Línea 529... Línea 564...
529
        // Verify additional grades.
564
        // Verify additional grades.
530
        $this->assertEquals(['name' => 'Listening', 'grade' => 1, 'maxgrade' => 1], $result['attempts'][0]['gradeitemmarks'][0]);
565
        $this->assertEquals(['name' => 'Listening', 'grade' => 1, 'maxgrade' => 1], $result['attempts'][0]['gradeitemmarks'][0]);
-
 
566
        $this->assertEquals(['name' => 'Reading', 'grade' => 0, 'maxgrade' => 1], $result['attempts'][0]['gradeitemmarks'][1]);
531
        $this->assertEquals(['name' => 'Reading', 'grade' => 0, 'maxgrade' => 1], $result['attempts'][0]['gradeitemmarks'][1]);
567
 
532
 
568
        // Now change the review options, so marks are not displayed, and check the result.
-
 
569
        $DB->set_field('quiz', 'reviewmarks', 0, ['id' => $quiz->id]);
Línea 533... Línea 570...
533
        // Now change the review options, so marks are not displayed, and check the result.
570
        $this->resetDebugging();
534
        $DB->set_field('quiz', 'reviewmarks', 0, ['id' => $quiz->id]);
571
        $result = mod_quiz_external::get_user_attempts($quiz->id);
535
        $result = mod_quiz_external::get_user_attempts($quiz->id);
572
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
536
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
573
        $this->assertDebuggingCalled();
Línea 537... Línea 574...
537
 
574
 
538
        $this->assertCount(1, $result['attempts']);
575
        $this->assertCount(1, $result['attempts']);
-
 
576
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
-
 
577
        $this->assertArrayNotHasKey('gradeitemmarks', $result['attempts'][0]);
539
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
578
    }
540
        $this->assertArrayNotHasKey('gradeitemmarks', $result['attempts'][0]);
579
 
541
    }
580
    /**
542
 
581
     * Test get_user_attempts with marks hidden
543
    /**
582
     *
544
     * Test get_user_attempts with marks hidden
583
     * @todo Remove in Moodle 6.0 as part of MDL-80956 final deprecations.
Línea 545... Línea 584...
545
     */
584
     */
546
    public function test_get_user_attempts_with_marks_hidden(): void {
585
    public function test_get_user_attempts_with_marks_hidden(): void {
-
 
586
        // Create quiz with one attempt finished and hide the mark.
547
        // Create quiz with one attempt finished and hide the mark.
587
        list($quiz, $context, $quizobj, $attempt, $attemptobj) = $this->create_quiz_with_questions(
548
        list($quiz, $context, $quizobj, $attempt, $attemptobj) = $this->create_quiz_with_questions(
588
                true, true, 'deferredfeedback', false,
-
 
589
                ['marksduring' => 0, 'marksimmediately' => 0, 'marksopen' => 0, 'marksclosed' => 0]);
Línea 549... Línea 590...
549
                true, true, 'deferredfeedback', false,
590
 
550
                ['marksduring' => 0, 'marksimmediately' => 0, 'marksopen' => 0, 'marksclosed' => 0]);
591
        // Student cannot see the grades.
551
 
592
        $this->setUser($this->student);
552
        // Student cannot see the grades.
593
        $this->resetDebugging();
Línea 562... Línea 603...
562
        $this->assertArrayHasKey('sumgrades', $result['attempts'][0]);
603
        $this->assertArrayHasKey('sumgrades', $result['attempts'][0]);
563
        $this->assertEquals(null, $result['attempts'][0]['sumgrades']);
604
        $this->assertEquals(null, $result['attempts'][0]['sumgrades']);
Línea 564... Línea 605...
564
 
605
 
565
        // Test manager can see user grades.
606
        // Test manager can see user grades.
-
 
607
        $this->setUser($this->teacher);
566
        $this->setUser($this->teacher);
608
        $this->resetDebugging();
567
        $result = mod_quiz_external::get_user_attempts($quiz->id, $this->student->id);
609
        $result = mod_quiz_external::get_user_attempts($quiz->id, $this->student->id);
-
 
610
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
-
 
611
        $this->assertDebuggingCalled();
-
 
612
 
-
 
613
        $this->assertCount(1, $result['attempts']);
-
 
614
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
-
 
615
        $this->assertEquals($quiz->id, $result['attempts'][0]['quiz']);
-
 
616
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
-
 
617
        $this->assertEquals(1, $result['attempts'][0]['attempt']);
-
 
618
        $this->assertArrayHasKey('sumgrades', $result['attempts'][0]);
-
 
619
        $this->assertEquals(1.0, $result['attempts'][0]['sumgrades']);
-
 
620
    }
-
 
621
 
-
 
622
    /**
-
 
623
     * Test get_user_attempts when the attempt is in 'submitted' state.
-
 
624
     *
-
 
625
     * @todo Remove in Moodle 6.0 as part of MDL-80956 final deprecations.
-
 
626
     * @covers \mod_quiz_external::get_user_attempts
-
 
627
     */
-
 
628
    public function test_get_user_attempts_submitted(): void {
-
 
629
 
-
 
630
        // Create a quiz with one attempt.
-
 
631
        [$quiz, , , $attempt, $attemptobj] = $this->create_quiz_with_questions(true);
-
 
632
        // Submit the attempt but do not finish it.
-
 
633
        // Process some responses from the student.
-
 
634
        $tosubmit = [1 => ['answer' => '3.14']];
-
 
635
        $attemptobj->process_submitted_actions(time(), false, $tosubmit);
-
 
636
        $attemptobj->process_submit(time(), false);
-
 
637
 
-
 
638
        $this->setUser($this->student);
-
 
639
        $result = mod_quiz_external::get_user_attempts($quiz->id);
-
 
640
        $this->assertDebuggingCalled();
-
 
641
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
-
 
642
 
-
 
643
        $this->assertCount(1, $result['attempts']);
-
 
644
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
-
 
645
        $this->assertEquals($quiz->id, $result['attempts'][0]['quiz']);
-
 
646
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
-
 
647
        $this->assertEquals(1, $result['attempts'][0]['attempt']);
-
 
648
        $this->assertArrayHasKey('sumgrades', $result['attempts'][0]);
-
 
649
        $this->assertNull($result['attempts'][0]['sumgrades']); // No grades.
-
 
650
        $this->assertEquals(quiz_attempt::FINISHED, $result['attempts'][0]['state']); // State is returned as finished.
-
 
651
    }
-
 
652
 
-
 
653
    /**
-
 
654
     * Test get_user_attempts when the attempt is in 'notstarted' state. The attempt should not be returned.
-
 
655
     *
-
 
656
     * @todo Remove in Moodle 6.0 as part of MDL-80956 final deprecations.
-
 
657
     * @covers \mod_quiz_external::get_user_attempts
-
 
658
     */
-
 
659
    public function test_get_user_attempts_notstarted(): void {
-
 
660
        // Create a quiz.
-
 
661
        [$quiz, , $quizobj, , ] = $this->create_quiz_with_questions();
-
 
662
        // Create an attempt but do not start it.
-
 
663
        // Now, do one attempt.
-
 
664
        $quba = \question_engine::make_questions_usage_by_activity('mod_quiz', $quizobj->get_context());
-
 
665
        $quba->set_preferred_behaviour($quizobj->get_quiz()->preferredbehaviour);
-
 
666
 
-
 
667
        $timenow = time();
-
 
668
        $attempt = quiz_create_attempt($quizobj, 1, false, $timenow, false, $this->student->id);
-
 
669
        quiz_start_new_attempt($quizobj, $quba, $attempt, 1, $timenow);
-
 
670
        quiz_attempt_save_not_started($quba, $attempt);
-
 
671
 
-
 
672
        $this->setUser($this->student);
-
 
673
        $result = mod_quiz_external::get_user_attempts($quiz->id, $this->student->id, 'all');
-
 
674
        $this->assertDebuggingCalled();
-
 
675
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
-
 
676
 
-
 
677
        $this->assertCount(0, $result['attempts']);
-
 
678
    }
-
 
679
 
-
 
680
    /**
-
 
681
     * Test get_quiz_user_attempts
-
 
682
     *
-
 
683
     * @covers \mod_quiz_external::get_user_quiz_attempts
-
 
684
     */
-
 
685
    public function test_get_user_quiz_attempts(): void {
-
 
686
 
-
 
687
        // Create a quiz with one attempt finished.
-
 
688
        [$quiz, , $quizobj, $attempt, ] = $this->create_quiz_with_questions(true, true);
-
 
689
 
-
 
690
        $this->setUser($this->student);
-
 
691
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id);
-
 
692
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
693
 
-
 
694
        $this->assertCount(1, $result['attempts']);
-
 
695
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
-
 
696
        $this->assertEquals($quiz->id, $result['attempts'][0]['quiz']);
-
 
697
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
-
 
698
        $this->assertEquals(1, $result['attempts'][0]['attempt']);
-
 
699
        $this->assertArrayHasKey('sumgrades', $result['attempts'][0]);
-
 
700
        $this->assertEquals(1.0, $result['attempts'][0]['sumgrades']);
-
 
701
        $this->assertEquals(quiz_attempt::FINISHED, $result['attempts'][0]['state']);
-
 
702
 
-
 
703
        // Test filters. Only finished.
-
 
704
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id, 0, 'finished', false);
-
 
705
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
706
 
-
 
707
        $this->assertCount(1, $result['attempts']);
-
 
708
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
-
 
709
 
-
 
710
        // Test filters. All attempts.
-
 
711
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id, 0, 'all', false);
-
 
712
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
713
 
-
 
714
        $this->assertCount(1, $result['attempts']);
-
 
715
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
-
 
716
 
-
 
717
        // Test filters. Unfinished.
-
 
718
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id, 0, 'unfinished', false);
-
 
719
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
720
 
-
 
721
        $this->assertCount(0, $result['attempts']);
-
 
722
 
-
 
723
        // Start a new attempt, but not finish it.
-
 
724
        $timenow = time();
-
 
725
        $attempt = quiz_create_attempt($quizobj, 2, false, $timenow, false, $this->student->id);
-
 
726
        $quba = \question_engine::make_questions_usage_by_activity('mod_quiz', $quizobj->get_context());
-
 
727
        $quba->set_preferred_behaviour($quizobj->get_quiz()->preferredbehaviour);
-
 
728
 
-
 
729
        quiz_start_new_attempt($quizobj, $quba, $attempt, 1, $timenow);
-
 
730
        quiz_attempt_save_started($quizobj, $quba, $attempt);
-
 
731
 
-
 
732
        // Test filters. All attempts.
-
 
733
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id, 0, 'all', false);
-
 
734
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
735
 
-
 
736
        $this->assertCount(2, $result['attempts']);
-
 
737
 
-
 
738
        // Test filters. Unfinished.
-
 
739
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id, 0, 'unfinished', false);
-
 
740
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
741
 
-
 
742
        $this->assertCount(1, $result['attempts']);
-
 
743
 
-
 
744
        // Test manager can see user attempts.
-
 
745
        $this->setUser($this->teacher);
-
 
746
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id, $this->student->id);
-
 
747
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
748
 
-
 
749
        $this->assertCount(1, $result['attempts']);
-
 
750
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
-
 
751
 
-
 
752
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id, $this->student->id, 'all');
-
 
753
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
754
 
-
 
755
        $this->assertCount(2, $result['attempts']);
-
 
756
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
-
 
757
 
-
 
758
        // Invalid parameters.
-
 
759
        try {
-
 
760
            mod_quiz_external::get_user_quiz_attempts($quiz->id, $this->student->id, 'INVALID_PARAMETER');
-
 
761
            $this->fail('Exception expected due to missing capability.');
-
 
762
        } catch (\invalid_parameter_exception $e) {
-
 
763
            $this->assertEquals('invalidparameter', $e->errorcode);
-
 
764
        }
-
 
765
    }
-
 
766
 
-
 
767
    /**
-
 
768
     * Test get_user_quiz_attempts with extra grades
-
 
769
     */
-
 
770
    public function test_get_user_quiz_attempts_with_extra_grades(): void {
-
 
771
        global $DB;
-
 
772
 
-
 
773
        // Create a quiz with one attempt finished.
-
 
774
        [$quiz, , , $attempt, $attemptobj] = $this->create_quiz_with_questions(true, true);
-
 
775
 
-
 
776
        // Add some extra grade items.
-
 
777
        $quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz');
-
 
778
        $listeninggrade = $quizgenerator->create_grade_item(['quizid' => $attemptobj->get_quizid(), 'name' => 'Listening']);
-
 
779
        $readinggrade = $quizgenerator->create_grade_item(['quizid' => $attemptobj->get_quizid(), 'name' => 'Reading']);
-
 
780
        $structure = $attemptobj->get_quizobj()->get_structure();
-
 
781
        $structure->update_slot_grade_item($structure->get_slot_by_number(1), $listeninggrade->id);
-
 
782
        $structure->update_slot_grade_item($structure->get_slot_by_number(2), $readinggrade->id);
-
 
783
 
-
 
784
        $this->setUser($this->student);
-
 
785
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id);
-
 
786
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
787
 
-
 
788
        $this->assertCount(1, $result['attempts']);
-
 
789
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
-
 
790
 
-
 
791
        // Verify additional grades.
-
 
792
        $this->assertEquals(['name' => 'Listening', 'grade' => 1, 'maxgrade' => 1], $result['attempts'][0]['gradeitemmarks'][0]);
-
 
793
        $this->assertEquals(['name' => 'Reading', 'grade' => 0, 'maxgrade' => 1], $result['attempts'][0]['gradeitemmarks'][1]);
-
 
794
 
-
 
795
        // Now change the review options, so marks are not displayed, and check the result.
-
 
796
        $DB->set_field('quiz', 'reviewmarks', 0, ['id' => $quiz->id]);
-
 
797
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id);
-
 
798
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
799
 
-
 
800
        $this->assertCount(1, $result['attempts']);
-
 
801
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
-
 
802
        $this->assertArrayNotHasKey('gradeitemmarks', $result['attempts'][0]);
-
 
803
    }
-
 
804
 
-
 
805
    /**
-
 
806
     * Test get_user_quiz_attempts with marks hidden
-
 
807
     *
-
 
808
     * @covers \mod_quiz_external::get_user_quiz_attempts
-
 
809
     */
-
 
810
    public function test_get_user_quiz_attempts_with_marks_hidden(): void {
-
 
811
        // Create quiz with one attempt finished and hide the mark.
-
 
812
        [$quiz, , , $attempt, ] = $this->create_quiz_with_questions(
-
 
813
                true, true, 'deferredfeedback', false,
-
 
814
                ['marksduring' => 0, 'marksimmediately' => 0, 'marksopen' => 0, 'marksclosed' => 0]);
-
 
815
 
-
 
816
        // Student cannot see the grades.
-
 
817
        $this->setUser($this->student);
-
 
818
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id);
-
 
819
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
820
 
-
 
821
        $this->assertCount(1, $result['attempts']);
-
 
822
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
-
 
823
        $this->assertEquals($quiz->id, $result['attempts'][0]['quiz']);
-
 
824
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
-
 
825
        $this->assertEquals(1, $result['attempts'][0]['attempt']);
-
 
826
        $this->assertArrayHasKey('sumgrades', $result['attempts'][0]);
-
 
827
        $this->assertEquals(null, $result['attempts'][0]['sumgrades']);
-
 
828
 
-
 
829
        // Test manager can see user grades.
-
 
830
        $this->setUser($this->teacher);
-
 
831
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id, $this->student->id);
Línea 568... Línea 832...
568
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_attempts_returns(), $result);
832
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
569
 
833
 
570
        $this->assertCount(1, $result['attempts']);
834
        $this->assertCount(1, $result['attempts']);
571
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
835
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
Línea 575... Línea 839...
575
        $this->assertArrayHasKey('sumgrades', $result['attempts'][0]);
839
        $this->assertArrayHasKey('sumgrades', $result['attempts'][0]);
576
        $this->assertEquals(1.0, $result['attempts'][0]['sumgrades']);
840
        $this->assertEquals(1.0, $result['attempts'][0]['sumgrades']);
577
    }
841
    }
Línea 578... Línea 842...
578
 
842
 
-
 
843
    /**
-
 
844
     * Test get_user_quiz_attempts when the attempt is in 'submitted' state.
-
 
845
     *
-
 
846
     * @covers \mod_quiz_external::get_user_quiz_attempts
-
 
847
     */
-
 
848
    public function test_get_user_quiz_attempts_submitted(): void {
-
 
849
 
-
 
850
        // Create a quiz with one attempt.
-
 
851
        [$quiz, , , $attempt, $attemptobj] = $this->create_quiz_with_questions(true);
-
 
852
        // Submit the attempt but do not finish it.
-
 
853
        // Process some responses from the student.
-
 
854
        $tosubmit = [1 => ['answer' => '3.14']];
-
 
855
        $attemptobj->process_submitted_actions(time(), false, $tosubmit);
-
 
856
        $attemptobj->process_submit(time(), false);
-
 
857
 
-
 
858
        $this->setUser($this->student);
-
 
859
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id);
-
 
860
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
861
 
-
 
862
        $this->assertCount(1, $result['attempts']);
-
 
863
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
-
 
864
        $this->assertEquals($quiz->id, $result['attempts'][0]['quiz']);
-
 
865
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
-
 
866
        $this->assertEquals(1, $result['attempts'][0]['attempt']);
-
 
867
        $this->assertArrayHasKey('sumgrades', $result['attempts'][0]);
-
 
868
        $this->assertNull($result['attempts'][0]['sumgrades']); // No grades.
-
 
869
        $this->assertEquals(quiz_attempt::SUBMITTED, $result['attempts'][0]['state']);
-
 
870
    }
-
 
871
 
-
 
872
    /**
-
 
873
     * Test get_user_quiz_attempts when the attempt is in 'notstarted' state.
-
 
874
     *
-
 
875
     * @covers \mod_quiz_external::get_user_quiz_attempts
-
 
876
     */
-
 
877
    public function test_get_user_quiz_attempts_notstarted(): void {
-
 
878
        // Create a quiz.
-
 
879
        [$quiz, , $quizobj, , ] = $this->create_quiz_with_questions();
-
 
880
        // Create an attempt but do not start it.
-
 
881
        // Now, do one attempt.
-
 
882
        $quba = \question_engine::make_questions_usage_by_activity('mod_quiz', $quizobj->get_context());
-
 
883
        $quba->set_preferred_behaviour($quizobj->get_quiz()->preferredbehaviour);
-
 
884
 
-
 
885
        $timenow = time();
-
 
886
        $attempt = quiz_create_attempt($quizobj, 1, false, $timenow, false, $this->student->id);
-
 
887
        quiz_start_new_attempt($quizobj, $quba, $attempt, 1, $timenow);
-
 
888
        quiz_attempt_save_not_started($quba, $attempt);
-
 
889
 
-
 
890
        $this->setUser($this->student);
-
 
891
        $result = mod_quiz_external::get_user_quiz_attempts($quiz->id, $this->student->id, 'all');
-
 
892
        $result = external_api::clean_returnvalue(mod_quiz_external::get_user_quiz_attempts_returns(), $result);
-
 
893
 
-
 
894
        $this->assertCount(1, $result['attempts']);
-
 
895
        $this->assertEquals($attempt->id, $result['attempts'][0]['id']);
-
 
896
        $this->assertEquals($quiz->id, $result['attempts'][0]['quiz']);
-
 
897
        $this->assertEquals($this->student->id, $result['attempts'][0]['userid']);
-
 
898
        $this->assertEquals(1, $result['attempts'][0]['attempt']);
-
 
899
        $this->assertArrayHasKey('sumgrades', $result['attempts'][0]);
-
 
900
        $this->assertNull($result['attempts'][0]['sumgrades']);
-
 
901
        $this->assertEquals(quiz_attempt::NOT_STARTED, $result['attempts'][0]['state']);
-
 
902
    }
-
 
903
 
579
    /**
904
    /**
580
     * Test get_user_best_grade
905
     * Test get_user_best_grade
581
     */
906
     */
582
    public function test_get_user_best_grade(): void {
907
    public function test_get_user_best_grade(): void {
583
        $quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz');
908
        $quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz');
Línea 658... Línea 983...
658
        // Process some responses from the student.
983
        // Process some responses from the student.
659
        $attemptobj = quiz_attempt::create($attempt->id);
984
        $attemptobj = quiz_attempt::create($attempt->id);
660
        $attemptobj->process_submitted_actions($timenow, false, [1 => ['answer' => '3.14']]);
985
        $attemptobj->process_submitted_actions($timenow, false, [1 => ['answer' => '3.14']]);
Línea 661... Línea 986...
661
 
986
 
662
        // Finish the attempt.
987
        // Finish the attempt.
-
 
988
        $attemptobj->process_submit($timenow, false);
Línea 663... Línea 989...
663
        $attemptobj->process_finish($timenow, false);
989
        $attemptobj->process_grade_submission($timenow);
664
 
990
 
Línea 665... Línea 991...
665
        $result = mod_quiz_external::get_user_best_grade($quizapi1->id);
991
        $result = mod_quiz_external::get_user_best_grade($quizapi1->id);
Línea 720... Línea 1046...
720
        // Process some responses from the student.
1046
        // Process some responses from the student.
721
        $attemptobj = quiz_attempt::create($attempt->id);
1047
        $attemptobj = quiz_attempt::create($attempt->id);
722
        $attemptobj->process_submitted_actions($timenow, false, [1 => ['answer' => '3.14']]);
1048
        $attemptobj->process_submitted_actions($timenow, false, [1 => ['answer' => '3.14']]);
Línea 723... Línea 1049...
723
 
1049
 
724
        // Finish the attempt.
1050
        // Finish the attempt.
-
 
1051
        $attemptobj->process_submit($timenow, false);
Línea 725... Línea 1052...
725
        $attemptobj->process_finish($timenow, false);
1052
        $attemptobj->process_grade_submission($timenow);
726
 
1053
 
Línea 727... Línea 1054...
727
        $result = mod_quiz_external::get_user_best_grade($quizapi2->id);
1054
        $result = mod_quiz_external::get_user_best_grade($quizapi2->id);
Línea 806... Línea 1133...
806
 
1133
 
Línea 807... Línea 1134...
807
        $this->assertEquals($expected, $result);
1134
        $this->assertEquals($expected, $result);
808
 
1135
 
809
        // Now, finish the attempt.
1136
        // Now, finish the attempt.
-
 
1137
        $attemptobj = quiz_attempt::create($attempt->id);
Línea 810... Línea 1138...
810
        $attemptobj = quiz_attempt::create($attempt->id);
1138
        $attemptobj->process_submit($timenow, false);
811
        $attemptobj->process_finish($timenow, false);
1139
        $attemptobj->process_grade_submission($timenow);
812
 
1140
 
813
        $expected = [
1141
        $expected = [
Línea 1023... Línea 1351...
1023
        $attemptobj->process_submitted_actions($timenow, false, $tosubmit);
1351
        $attemptobj->process_submitted_actions($timenow, false, $tosubmit);
Línea 1024... Línea 1352...
1024
 
1352
 
1025
        // Finish the attempt.
1353
        // Finish the attempt.
1026
        $attemptobj = quiz_attempt::create($attemptid);
1354
        $attemptobj = quiz_attempt::create($attemptid);
1027
        $this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
1355
        $this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
-
 
1356
        $attemptobj->process_submit($timenow, false);
Línea 1028... Línea 1357...
1028
        $attemptobj->process_finish($timenow, false);
1357
        $attemptobj->process_grade_submission($timenow);
1029
 
1358
 
1030
        // We should be able to start a new attempt.
1359
        // We should be able to start a new attempt.
Línea 1124... Línea 1453...
1124
            $this->assertEquals('attempterror', $e->errorcode);
1453
            $this->assertEquals('attempterror', $e->errorcode);
1125
        }
1454
        }
Línea 1126... Línea 1455...
1126
 
1455
 
1127
        // Finish the attempt.
1456
        // Finish the attempt.
1128
        $attemptobj = quiz_attempt::create($attempt->id);
1457
        $attemptobj = quiz_attempt::create($attempt->id);
-
 
1458
        $attemptobj->process_submit(time(), false);
Línea 1129... Línea 1459...
1129
        $attemptobj->process_finish(time(), false);
1459
        $attemptobj->process_grade_submission(time());
1130
 
1460
 
1131
        try {
1461
        try {
1132
            testable_mod_quiz_external::validate_attempt($params, false);
1462
            testable_mod_quiz_external::validate_attempt($params, false);
Línea 1205... Línea 1535...
1205
        $this->assertFalse($result['questions'][0]['flagged']);
1535
        $this->assertFalse($result['questions'][0]['flagged']);
1206
        $this->assertEquals(0, $result['questions'][0]['page']);
1536
        $this->assertEquals(0, $result['questions'][0]['page']);
1207
        $this->assertEmpty($result['questions'][0]['mark']);
1537
        $this->assertEmpty($result['questions'][0]['mark']);
1208
        $this->assertEquals(1, $result['questions'][0]['maxmark']);
1538
        $this->assertEquals(1, $result['questions'][0]['maxmark']);
1209
        $this->assertEquals(1, $result['questions'][0]['sequencecheck']);
1539
        $this->assertEquals(1, $result['questions'][0]['sequencecheck']);
1210
        $this->assertGreaterThanOrEqual($timenow, $result['questions'][0]['lastactiontime']);
1540
        $this->assertEquals(\question_attempt_step::TIMECREATED_ON_FIRST_RENDER, $result['questions'][0]['lastactiontime']);
1211
        $this->assertEquals(false, $result['questions'][0]['hasautosavedstep']);
1541
        $this->assertEquals(false, $result['questions'][0]['hasautosavedstep']);
Línea 1212... Línea 1542...
1212
 
1542
 
1213
        // Now try the last page.
1543
        // Now try the last page.
1214
        $result = mod_quiz_external::get_attempt_data($attempt->id, 1);
1544
        $result = mod_quiz_external::get_attempt_data($attempt->id, 1);
Línea 1226... Línea 1556...
1226
        $this->assertArrayNotHasKey('state', $result['questions'][0]);  // We don't receive the state yet.
1556
        $this->assertArrayNotHasKey('state', $result['questions'][0]);  // We don't receive the state yet.
1227
        $this->assertEquals(get_string('notyetanswered', 'question'), $result['questions'][0]['status']);
1557
        $this->assertEquals(get_string('notyetanswered', 'question'), $result['questions'][0]['status']);
1228
        $this->assertFalse($result['questions'][0]['flagged']);
1558
        $this->assertFalse($result['questions'][0]['flagged']);
1229
        $this->assertEquals(1, $result['questions'][0]['page']);
1559
        $this->assertEquals(1, $result['questions'][0]['page']);
1230
        $this->assertEquals(1, $result['questions'][0]['sequencecheck']);
1560
        $this->assertEquals(1, $result['questions'][0]['sequencecheck']);
1231
        $this->assertGreaterThanOrEqual($timenow, $result['questions'][0]['lastactiontime']);
1561
        $this->assertEquals(\question_attempt_step::TIMECREATED_ON_FIRST_RENDER, $result['questions'][0]['lastactiontime']);
1232
        $this->assertEquals(false, $result['questions'][0]['hasautosavedstep']);
1562
        $this->assertEquals(false, $result['questions'][0]['hasautosavedstep']);
Línea 1233... Línea 1563...
1233
 
1563
 
1234
        // Finish previous attempt.
1564
        // Finish previous attempt.
-
 
1565
        $attemptobj->process_submit(time(), false);
Línea 1235... Línea 1566...
1235
        $attemptobj->process_finish(time(), false);
1566
        $attemptobj->process_grade_submission(time());
1236
 
1567
 
1237
        // Now we should receive the question state.
1568
        // Now we should receive the question state.
1238
        $result = mod_quiz_external::get_attempt_review($attempt->id, 1);
1569
        $result = mod_quiz_external::get_attempt_review($attempt->id, 1);
Línea 1343... Línea 1674...
1343
        $this->assertFalse($result['questions'][1]['flagged']);
1674
        $this->assertFalse($result['questions'][1]['flagged']);
1344
        $this->assertEmpty($result['questions'][0]['mark']);
1675
        $this->assertEmpty($result['questions'][0]['mark']);
1345
        $this->assertEmpty($result['questions'][1]['mark']);
1676
        $this->assertEmpty($result['questions'][1]['mark']);
1346
        $this->assertEquals(1, $result['questions'][0]['sequencecheck']);
1677
        $this->assertEquals(1, $result['questions'][0]['sequencecheck']);
1347
        $this->assertEquals(1, $result['questions'][1]['sequencecheck']);
1678
        $this->assertEquals(1, $result['questions'][1]['sequencecheck']);
1348
        $this->assertGreaterThanOrEqual($timenow, $result['questions'][0]['lastactiontime']);
1679
        $this->assertEquals(\question_attempt_step::TIMECREATED_ON_FIRST_RENDER, $result['questions'][0]['lastactiontime']);
1349
        $this->assertGreaterThanOrEqual($timenow, $result['questions'][1]['lastactiontime']);
1680
        $this->assertEquals(\question_attempt_step::TIMECREATED_ON_FIRST_RENDER, $result['questions'][1]['lastactiontime']);
1350
        $this->assertEquals(false, $result['questions'][0]['hasautosavedstep']);
1681
        $this->assertEquals(false, $result['questions'][0]['hasautosavedstep']);
1351
        $this->assertEquals(false, $result['questions'][1]['hasautosavedstep']);
1682
        $this->assertEquals(false, $result['questions'][1]['hasautosavedstep']);
Línea 1352... Línea 1683...
1352
 
1683
 
1353
        // Check question options.
1684
        // Check question options.
Línea 1422... Línea 1753...
1422
        $this->assertEmpty($result['questions'][0]['mark']);
1753
        $this->assertEmpty($result['questions'][0]['mark']);
1423
        $this->assertEmpty($result['questions'][1]['mark']);
1754
        $this->assertEmpty($result['questions'][1]['mark']);
1424
        $this->assertEquals(1, $result['questions'][0]['sequencecheck']);
1755
        $this->assertEquals(1, $result['questions'][0]['sequencecheck']);
1425
        $this->assertEquals(1, $result['questions'][1]['sequencecheck']);
1756
        $this->assertEquals(1, $result['questions'][1]['sequencecheck']);
1426
        $this->assertGreaterThanOrEqual($timenow, $result['questions'][0]['lastactiontime']);
1757
        $this->assertGreaterThanOrEqual($timenow, $result['questions'][0]['lastactiontime']);
1427
        $this->assertGreaterThanOrEqual($timenow, $result['questions'][1]['lastactiontime']);
1758
        $this->assertEquals(\question_attempt_step::TIMECREATED_ON_FIRST_RENDER, $result['questions'][1]['lastactiontime']);
1428
        $this->assertEquals(true, $result['questions'][0]['hasautosavedstep']);
1759
        $this->assertEquals(true, $result['questions'][0]['hasautosavedstep']);
1429
        $this->assertEquals(false, $result['questions'][1]['hasautosavedstep']);
1760
        $this->assertEquals(false, $result['questions'][1]['hasautosavedstep']);
Línea 1430... Línea 1761...
1430
 
1761
 
1431
        // Now, second slot.
1762
        // Now, second slot.
Línea 2123... Línea 2454...
2123
        $attemptobj->process_submitted_actions($timenow, false, $tosubmit);
2454
        $attemptobj->process_submitted_actions($timenow, false, $tosubmit);
Línea 2124... Línea 2455...
2124
 
2455
 
2125
        // Finish the attempt.
2456
        // Finish the attempt.
2126
        $attemptobj = quiz_attempt::create($attempt->id);
2457
        $attemptobj = quiz_attempt::create($attempt->id);
2127
        $this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
2458
        $this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
-
 
2459
        $attemptobj->process_submit($timenow, false);
Línea 2128... Línea 2460...
2128
        $attemptobj->process_finish($timenow, false);
2460
        $attemptobj->process_grade_submission($timenow);
2129
 
2461
 
2130
        // Can we start a new attempt? We shall not!
2462
        // Can we start a new attempt? We shall not!