quiz-6.0.0-alpha4/modules/quiz_page/tests/src/Functional/QuizPageTestCase.php

modules/quiz_page/tests/src/Functional/QuizPageTestCase.php
<?php

namespace Drupal\Tests\quiz_page\Functional;

use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\quiz\Entity\QuizResult;
use Drupal\Tests\quiz\Functional\QuizQuestionTestBase;

/**
 * Test quiz page behavior.
 *
 * @group Quiz
 */
class QuizPageTestCase extends QuizQuestionTestBase {

  use StringTranslationTrait;

  /**
   * Modules to install.
   *
   * @var array
   */
  protected static $modules = ['quiz_page', 'quiz_truefalse'];

  /**
   * {@inheritdoc}
   */
  public function getQuestionType(): string {
    return 'page';
  }

  /**
   * Test that question parentage saves.
   *
   * @throws \Drupal\Core\Entity\EntityStorageException
   * @throws \Behat\Mink\Exception\ElementNotFoundException
   * @throws \Behat\Mink\Exception\ExpectationException
   */
  public function testQuizPageParentage() {
    $this->drupalLogin($this->admin);

    // Create Quiz with review of score.
    $quiz_node = $this->createQuiz();

    // Create the questions.
    $question_node1 = $this->createQuestion([
      'type' => 'truefalse',
      'truefalse_correct' => 1,
      'body' => 'TF 1 body text',
    ]);
    // QNR ID 1.
    $this->linkQuestionToQuiz($question_node1, $quiz_node);
    $question_node2 = $this->createQuestion([
      'type' => 'truefalse',
      'truefalse_correct' => 1,
      'body' => 'TF 2 body text',
    ]);
    // QNR ID 2.
    $this->linkQuestionToQuiz($question_node2, $quiz_node);
    $question_node3 = $this->createQuestion([
      'type' => 'truefalse',
      'truefalse_correct' => 1,
      'body' => 'TF 3 body text',
    ]);
    // QNR ID 3.
    $this->linkQuestionToQuiz($question_node3, $quiz_node);
    // Create the pages.
    $page_node1 = $this->createQuestion(['type' => 'page']);
    // QNR ID 4.
    $this->linkQuestionToQuiz($page_node1, $quiz_node);
    $page_node2 = $this->createQuestion(['type' => 'page']);
    // QNR ID 5.
    $this->linkQuestionToQuiz($page_node2, $quiz_node);
    // Go to the manage questions form.
    $this->drupalGet("quiz/{$quiz_node->id()}/questions");
    $post = [
      // Make the questions have parents.
      "question_list[{$question_node1->getRevisionId()}][qqr_pid]" => 4,
      "question_list[{$question_node2->getRevisionId()}][qqr_pid]" => 4,
      "question_list[{$question_node3->getRevisionId()}][qqr_pid]" => 5,
      // Mirror what JS would have done by adjusting the weights.
      "question_list[{$page_node1->getRevisionId()}][weight]" => 2,
      "question_list[{$question_node1->getRevisionId()}][weight]" => 3,
      "question_list[{$question_node2->getRevisionId()}][weight]" => 4,
      "question_list[{$page_node2->getRevisionId()}][weight]" => 3,
      "question_list[{$question_node3->getRevisionId()}][weight]" => 4,
    ];
    $this->submitForm($post, $this->t('Submit'));

    $sql = "SELECT * FROM {quiz_question_relationship}";
    $data = \Drupal::database()->query($sql)->fetchAllAssoc('qqr_id');
    // Check the relationships properly saved.
    foreach ($data as $qnr_id => $rel) {
      switch ($qnr_id) {
        case 1:
        case 2:
          $this->assertEquals(4, $rel->qqr_pid);
          break;

        case 3:
          $this->assertEquals(5, $rel->qqr_pid);
          break;

        case 4:
        case 5:
          $this->assertNull($rel->qqr_pid);
          break;
      }
    }

    // Take the quiz. Ensure the pages are correct.
    $this->drupalLogin($this->user);
    $this->drupalGet("quiz/{$quiz_node->id()}/take");
    // Questions 1 and 2 are present. Question 3 is hidden.
    $this->assertSession()->fieldExists("question[{$question_node1->id()}][answer]");
    $this->assertSession()->fieldExists("question[{$question_node2->id()}][answer]");
    $this->assertSession()->fieldNotExists("question[{$question_node3->id()}][answer]");
    $this->submitForm([
      "question[{$question_node1->id()}][answer]" => 1,
      "question[{$question_node2->id()}][answer]" => 1,
    ], $this->t('Next'));
    // Questions 1 and 2 are gone. Question 3 is present.
    $this->assertSession()->fieldNotExists("question[{$question_node1->id()}][answer]");
    $this->assertSession()->fieldNotExists("question[{$question_node2->id()}][answer]");
    $this->assertSession()->fieldExists("question[{$question_node3->id()}][answer]");
    $this->submitForm([
      "question[{$question_node3->id()}][answer]" => 1,
    ], $this->t('Finish'));

    // Check that the results page contains all the questions.
    $this->assertSession()->pageTextContains('You got 3 of 3 possible points.');
    $this->assertSession()->pageTextContains('TF 1 body text');
    $this->assertSession()->pageTextContains('TF 2 body text');
    $this->assertSession()->pageTextContains('TF 3 body text');

    foreach (QuizResult::loadMultiple() as $quiz_result) {
      $quiz_result->delete();
    }

    // Check to make sure that saving a new revision of the Quiz does not affect
    // the parentage.
    $this->drupalLogin($this->admin);
    $this->drupalGet("quiz/{$quiz_node->id()}/edit");
    $this->submitForm(['revision' => 1], $this->t('Save'));

    // Take the quiz. Ensure the pages are correct.
    $this->drupalLogin($this->user);
    $this->drupalGet("quiz/{$quiz_node->id()}/take");
    // Questions 1 and 2 are present. Question 3 is hidden.
    $this->assertSession()->pageTextContains("Page 1 of 2");
    $this->assertSession()->fieldExists("question[{$question_node1->id()}][answer]");
    $this->assertSession()->fieldExists("question[{$question_node2->id()}][answer]");
    $this->assertSession()->fieldNotExists("question[{$question_node3->id()}][answer]");
    $this->submitForm([
      "question[{$question_node1->id()}][answer]" => 1,
      "question[{$question_node2->id()}][answer]" => 1,
    ], $this->t('Next'));

    // Questions 1 and 2 are gone. Question 3 is present.
    $this->assertSession()->pageTextContains("Page 2 of 2");
    $this->assertSession()->fieldNotExists("question[{$question_node1->id()}][answer]");
    $this->assertSession()->fieldNotExists("question[{$question_node2->id()}][answer]");
    $this->assertSession()->fieldExists("question[{$question_node3->id()}][answer]");

    // Test backwards navigation.
    $this->submitForm([], $this->t('Back'));
    $this->assertSession()->pageTextContains("Page 1 of 2");
    $this->submitForm([], $this->t('Next'));

    $this->submitForm([
      "question[{$question_node3->id()}][answer]" => 1,
    ], $this->t('Finish'));
  }

  /**
   * Test page feedback.
   *
   * @throws \Drupal\Core\Entity\EntityStorageException
   * @throws \Behat\Mink\Exception\ResponseTextException
   */
  public function testPageFeedback() {
    $this->drupalLogin($this->admin);

    $quiz_node = $this->createQuiz(
      [
        'review_options' => ['question' => ['question_feedback' => 'question_feedback']],
      ]
    );

    // Create the questions.
    $question_node1 = $this->createQuestion([
      'type' => 'truefalse',
      'truefalse_correct' => 1,
      'body' => 'TF 1 body text',
      'feedback' => 'This is the feedback for question 1.',
    ]);
    // QNR ID 1.
    $this->linkQuestionToQuiz($question_node1, $quiz_node);
    $question_node2 = $this->createQuestion([
      'type' => 'truefalse',
      'truefalse_correct' => 1,
      'body' => 'TF 2 body text',
      'feedback' => 'This is the feedback for question 2.',
    ]);
    // QNR ID 2.
    $this->linkQuestionToQuiz($question_node2, $quiz_node);
    $question_node3 = $this->createQuestion([
      'type' => 'truefalse',
      'truefalse_correct' => 1,
      'body' => 'TF 3 body text',
      'feedback' => 'This is the feedback for question 3.',
    ]);
    // QNR ID 3.
    $this->linkQuestionToQuiz($question_node3, $quiz_node);
    //
    // Create the page.
    $page_node1 = $this->createQuestion([
      'type' => 'page',
      'body' => 'PG 1 body text',
    ]);
    // QNR ID 4.
    $this->linkQuestionToQuiz($page_node1, $quiz_node);
    // Go to the manage questions form.
    $this->drupalGet("quiz/{$quiz_node->id()}/questions");
    $post = [
      // Make the questions have parents.
      "question_list[{$question_node1->getRevisionId()}][qqr_pid]" => 4,
      "question_list[{$question_node2->getRevisionId()}][qqr_pid]" => 4,
      // Mirror what JS would have done by adjusting the weights.
      "question_list[{$page_node1->getRevisionId()}][weight]" => 1,
      "question_list[{$question_node1->getRevisionId()}][weight]" => 2,
      "question_list[{$question_node2->getRevisionId()}][weight]" => 3,
      "question_list[{$question_node3->getRevisionId()}][weight]" => 4,
    ];
    $this->submitForm($post, $this->t('Submit'));

    $this->drupalLogin($this->user);
    $this->drupalGet("quiz/{$quiz_node->id()}/take");

    $this->submitForm([
      "question[{$question_node1->id()}][answer]" => 1,
      "question[{$question_node2->id()}][answer]" => 1,
    ], $this->t('Next'));

    $this->assertSession()->pageTextContains('This is the feedback for question 1.');
    $this->assertSession()->pageTextContains('This is the feedback for question 2.');
    $this->assertSession()->pageTextNotContains('This is the feedback for question 3.');
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc