You are here

public function QuizResultBundleTest::testQuizResultBundles in Quiz 8.5

Same name and namespace in other branches
  1. 8.6 tests/src/Functional/QuizResultBundleTest.php \Drupal\Tests\quiz\Functional\QuizResultBundleTest::testQuizResultBundles()
  2. 6.x tests/src/Functional/QuizResultBundleTest.php \Drupal\Tests\quiz\Functional\QuizResultBundleTest::testQuizResultBundles()

Test quiz result bundles.

File

tests/src/Functional/QuizResultBundleTest.php, line 85

Class

QuizResultBundleTest
Test quiz result bundle and fields behavior.

Namespace

Drupal\Tests\quiz\Functional

Code

public function testQuizResultBundles() {
  QuizResultType::create([
    'id' => 'type_a',
    'label' => t('Bundle type A'),
  ])
    ->save();
  QuizResultType::create([
    'id' => 'type_b',
    'label' => t('Bundle type B'),
  ])
    ->save();

  // Add a field to quiz result and make it required for starting.
  $field_storagea = FieldStorageConfig::create([
    'id' => 'quiz_result.result_field_a',
    'field_name' => 'result_field_a',
    'entity_type' => 'quiz_result',
    'type' => 'string',
    'module' => 'core',
  ]);
  $field_storagea
    ->save();
  $instancea = FieldConfig::create([
    'field_storage' => $field_storagea,
    'bundle' => 'type_a',
    'label' => 'Result field A',
    'required' => TRUE,
    'field_name' => 'result_field_a',
    'entity_type' => 'quiz_result',
    'third_party_settings' => array(
      'quiz' => [
        'show_field' => TRUE,
      ],
    ),
  ]);
  $instancea
    ->save();
  Drupal::service('entity_display.repository')
    ->getFormDisplay('quiz_result', 'type_a', 'default')
    ->setComponent('result_field_a', array(
    'type' => 'text_textfield',
  ))
    ->save();

  // Add a field to quiz result and make it required for starting.
  $field_storageb = FieldStorageConfig::create([
    'id' => 'quiz_result.result_field_b',
    'field_name' => 'result_field_b',
    'entity_type' => 'quiz_result',
    'type' => 'string',
    'module' => 'core',
  ]);
  $field_storageb
    ->save();
  $instanceb = FieldConfig::create([
    'field_storage' => $field_storageb,
    'bundle' => 'type_b',
    'label' => 'Result field B',
    'required' => TRUE,
    'field_name' => 'result_field_b',
    'entity_type' => 'quiz_result',
    'third_party_settings' => array(
      'quiz' => [
        'show_field' => TRUE,
      ],
    ),
  ]);
  $instanceb
    ->save();
  Drupal::service('entity_display.repository')
    ->getFormDisplay('quiz_result', 'type_b', 'default')
    ->setComponent('result_field_b', array(
    'type' => 'text_textfield',
  ))
    ->save();
  $quizNodeA = $this
    ->createQuiz(array(
    'result_type' => 'type_a',
  ));
  $question1 = $this
    ->createQuestion(array(
    'type' => 'truefalse',
    'truefalse_correct' => 1,
  ));
  $this
    ->linkQuestionToQuiz($question1, $quizNodeA);
  $quizNodeB = $this
    ->createQuiz(array(
    'result_type' => 'type_b',
  ));
  $question2 = $this
    ->createQuestion(array(
    'type' => 'truefalse',
    'truefalse_correct' => 1,
  ));
  $this
    ->linkQuestionToQuiz($question2, $quizNodeB);
  $this
    ->drupalLogin($this->user);

  // Check if field shows up and user is not yet started.
  $this
    ->drupalGet("quiz/{$quizNodeA->id()}/take");
  $this
    ->assertFieldById('edit-result-field-a-0-value');
  $this
    ->assertNoFieldById('edit-result-field-b-0-value');
  $results = Drupal::entityQuery('quiz_result')
    ->condition('qid', $quizNodeA
    ->id())
    ->condition('uid', $this->user
    ->id())
    ->execute();
  $this
    ->assertEmpty($results);
  $this
    ->drupalPostForm(NULL, array(), t('Start Quiz'));

  // Check that form API is working.
  $this
    ->assertText('field is required');
  $this
    ->drupalPostForm(NULL, array(
    'result_field_a[0][value]' => 'test 123',
  ), t('Start Quiz'));

  // Check that a different field is on quiz B.
  $this
    ->drupalGet("quiz/{$quizNodeB->id()}/take");
  $this
    ->assertFieldById('edit-result-field-b-0-value');
  $this
    ->assertNoFieldById('edit-result-field-a-0-value');

  // Mark field B to not show on result.
  $instanceb
    ->setThirdPartySetting('quiz', 'show_field', FALSE);
  $instanceb
    ->save();
  $this
    ->drupalGet("quiz/{$quizNodeB->id()}/take");
  $this
    ->assertNoFieldById('edit-result-field-a-0-value');
  $this
    ->assertNoFieldById('edit-result-field-b-0-value');
}