You are here

function CourseEnrollmentTest::testCourseBundles in Course 3.x

Test course enrollment bundles.

File

tests/src/Functional/CourseEnrollmentTest.php, line 93

Class

CourseEnrollmentTest
Tests for Course enrollment

Namespace

Drupal\Tests\course\Functional

Code

function testCourseBundles() {
  $enrollment_type = CourseEnrollmentType::create(array(
    'id' => 'type_a',
    'label' => t('Bundle type A'),
  ));
  $enrollment_type
    ->save();
  $enrollment_type = CourseEnrollmentType::create(array(
    'id' => 'type_b',
    'label' => t('Bundle type B'),
  ));
  $enrollment_type
    ->save();

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

  // Add a field to course result and make it required for starting.
  $field_storageb = FieldStorageConfig::create([
    'id' => 'course_enrollment.enrollment_field_b',
    'field_name' => 'enrollment_field_b',
    'entity_type' => 'course_enrollment',
    'type' => 'string',
    'module' => 'core',
  ]);
  $field_storageb
    ->save();
  $instanceb = FieldConfig::create([
    'field_storage' => $field_storageb,
    'bundle' => 'type_b',
    'label' => 'Enrollment field B',
    'required' => TRUE,
    'field_name' => 'enrollment_field_b',
    'entity_type' => 'course_enrollment',
    'third_party_settings' => array(
      'course' => [
        'show_field' => TRUE,
      ],
    ),
  ]);
  $instanceb
    ->save();
  Drupal::service('entity_display.repository')
    ->getFormDisplay('course_enrollment', 'type_b', 'default')
    ->setComponent('enrollment_field_b', array(
    'type' => 'text_textfield',
  ))
    ->save();
  $courseA = $this
    ->createCourse(array(
    'enrollment_type' => 'type_a',
  ));
  $courseB = $this
    ->createCourse(array(
    'enrollment_type' => 'type_b',
  ));
  $this
    ->drupalLogin($this->student_user);

  // Check if field shows up and user is not yet enrolled.
  $this
    ->drupalGet("course/{$courseA->id()}/take");
  $this
    ->assertFieldById('edit-enrollment-field-a-0-value');
  $this
    ->assertNoFieldById('edit-enrollment-field-b-0-value');
  $enrollment = $courseA
    ->getEnrollment($this->student_user);
  $this
    ->assertEmpty($enrollment);
  $this
    ->drupalPostForm(NULL, array(), t('Save'));

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

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

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