quiz-6.0.0-alpha4/tests/src/Functional/QuizRevisioningTest.php
tests/src/Functional/QuizRevisioningTest.php
<?php
namespace Drupal\Tests\quiz\Functional;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\quiz\Entity\QuizQuestion;
/**
* Test quiz revisioning.
*
* @group Quiz
*/
class QuizRevisioningTest extends QuizTestBase {
use StringTranslationTrait;
/**
* {@inheritdoc}
*/
protected static $modules = ['quiz_truefalse'];
/**
* Test quiz revisioning.
*
* @throws \Drupal\Core\Entity\EntityStorageException
* @throws \Behat\Mink\Exception\ResponseTextException
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
public function testQuizRevisioning() {
$config = \Drupal::configFactory()->getEditable('quiz.settings');
$config->set('revisioning', TRUE)->save();
$this->drupalLogin($this->admin);
$question = $this->createQuestion([
'title' => 'Revision 1',
'body' => 'Revision 1',
'type' => 'truefalse',
'truefalse_correct' => 1,
'feedback' => 'Question feedback for Revision 1',
]);
$quiz_node = $this->linkQuestionToQuiz($question);
$quiz_node->set('allow_resume', 1)->save();
// Check for first revision.
$this->drupalLogin($this->user);
$this->drupalGet("quiz/{$quiz_node->id()}/take");
$this->assertSession()->pageTextContains("Revision 1");
// Attempt to update question. We have to create a new revision.
$this->drupalLogin($this->admin);
$this->drupalGet("quiz-question/{$question->id()}/edit");
$this->assertSession()->pageTextContains('Warning: This question has attempts.');
$this->submitForm([], (string) $this->t('Save'));
$this->assertSession()->pageTextContains('Create new revision field is required.');
$this->submitForm([
'title[0][value]' => 'Revision 2',
'body[0][value]' => 'Revision 2',
'truefalse_correct' => '0',
'feedback[0][value]' => 'Question feedback for Revision 2',
'revision' => '1',
], (string) $this->t('Save'));
// Reload the question to get current revision ID.
\Drupal::entityTypeManager()->getStorage('quiz_question')->resetCache();
$question = QuizQuestion::load($question->id());
// As the quiz taker, finish out the attempt.
$this->drupalLogin($this->user);
$this->drupalGet("quiz/{$quiz_node->id()}/take");
$this->assertSession()->pageTextContains("Revision 1");
$this->submitForm([
"question[{$question->id()}][answer]" => '1',
], (string) $this->t('Finish'));
$this->assertSession()->pageTextContains('You got 1 of 1 possible points.');
$this->assertSession()->pageTextContains('Question feedback for Revision 1');
// Take quiz again. Should be on SAME revision of the question. We have not
// yet updated the Quiz with the new revision of the Question.
$this->drupalGet("quiz/{$quiz_node->id()}/take");
$this->assertSession()->pageTextContains("Revision 1");
// We have an updated question and one Quiz revision with an attempt. We
// need to update the quiz to use the new question. But there are attempts
// on the quiz. Update the quiz to use the latest revision.
$this->drupalLogin($this->admin);
$this->drupalGet("quiz/{$quiz_node->id()}/questions");
$this->assertSession()->pageTextContains('This quiz has been answered.');
$this->clickLink('create a new revision');
$this->assertSession()->pageTextContains('Warning: This quiz has attempts.');
$this->submitForm([
'revision' => TRUE,
], (string) $this->t('Save'));
$this->assertSession()->pageTextNotContains('This quiz has been answered.');
$this->submitForm([
"question_list[{$question->getRevisionId()}][question_vid]" => TRUE,
], (string) $this->t('Submit'));
// Take quiz again. Should be on SAME revision. We have not yet finished
// this attempt.
$this->drupalLogin($this->user);
$this->drupalGet("quiz/{$quiz_node->id()}/take");
$this->assertSession()->pageTextContains("Revision 1");
// Finish the attempt.
$this->submitForm([
"question[{$question->id()}][answer]" => '1',
], (string) $this->t('Finish'));
$this->assertSession()->pageTextContains('You got 1 of 1 possible points.');
$this->assertSession()->pageTextContains('Question feedback for Revision 1');
// Take quiz again we should be on the new result, finally.
$this->drupalGet("quiz/{$quiz_node->id()}/take");
$this->assertSession()->pageTextContains("Revision 2");
// Finish the attempt.
$this->submitForm([
"question[{$question->id()}][answer]" => '1',
], (string) $this->t('Finish'));
$this->assertSession()->pageTextContains('You got 0 of 1 possible points.');
$this->assertSession()->pageTextContains('Question feedback for Revision 2');
// Check admin override.
$mega_admin = $this->createUser([
'administer quiz',
'administer quiz_question',
'override quiz revisioning',
]);
$this->drupalLogin($mega_admin);
$this->drupalGet("quiz/{$quiz_node->id()}/questions");
}
/**
* Test quiz with revisioning off.
*
* @throws \Drupal\Core\Entity\EntityStorageException
* @throws \Behat\Mink\Exception\ResponseTextException
*/
public function testQuizNoRevisioning() {
$this->drupalLogin($this->admin);
$question_node = $this->createQuestion([
'title' => 'Revision 1',
'body' => 'Revision 1',
'type' => 'truefalse',
'truefalse_correct' => 1,
'feedback' => 'Question feedback for Revision 1',
]);
$quiz_node = $this->linkQuestionToQuiz($question_node);
$this->drupalGet("quiz/{$quiz_node->id()}/take");
$this->assertSession()->pageTextContains("Revision 1");
// Finish the attempt.
$this->submitForm([
"question[{$question_node->id()}][answer]" => '1',
], (string) $this->t('Finish'));
// Check blocked access to update quiz and question.
$this->drupalGet("quiz/{$quiz_node->id()}/edit");
$this->assertSession()->pageTextContains('You must delete all attempts on this quiz before editing.');
$this->assertSession()
->elementAttributeExists('css', '#edit-submit', 'disabled');
$this->drupalGet("quiz-question/{$question_node->id()}/edit");
$this->assertSession()->pageTextContains('You must delete all attempts on this question before editing.');
$this->assertSession()
->elementAttributeExists('css', '#edit-submit', 'disabled');
// Check admin override.
$mega_admin = $this->createUser([
'administer quiz',
'administer quiz_question',
'override quiz revisioning',
]);
$this->drupalLogin($mega_admin);
$this->drupalGet("quiz/{$quiz_node->id()}/edit");
$this->assertSession()->pageTextContains('You should delete all attempts on this quiz before editing.');
$this->submitForm([], (string) $this->t('Save'));
$this->drupalGet("quiz-question/{$question_node->id()}/edit");
$this->assertSession()->pageTextContains('You should delete all attempts on this question before editing.');
$this->submitForm([], (string) $this->t('Save'));
}
}
