You are here

public function StateTransitionFormTest::testConfirmationForm in State Machine 8

Tests the confirmation form.

File

tests/src/Functional/StateTransitionFormTest.php, line 94

Class

StateTransitionFormTest
Tests the state transition form.

Namespace

Drupal\Tests\state_machine\Functional

Code

public function testConfirmationForm() {
  $view_display = EntityViewDisplay::create([
    'targetEntityType' => 'entity_test_with_bundle',
    'bundle' => 'first',
    'mode' => 'default',
    'status' => TRUE,
  ]);
  $view_display
    ->setComponent('field_state', [
    'type' => 'state_transition_form',
    'settings' => [
      'require_confirmation' => TRUE,
    ],
  ]);
  $view_display
    ->save();
  $first_entity = EntityTestWithBundle::create([
    'type' => 'first',
    'name' => 'First',
  ]);
  $first_entity
    ->save();
  $this
    ->drupalGet($first_entity
    ->toUrl('canonical'));
  $this
    ->assertSession()
    ->pageTextContains('First');
  $buttons = $this
    ->xpath('//form[@id="state-machine-transition-form-entity-test-with-bundle-field-state-1"]/div/a');
  $this
    ->assertCount(2, $buttons);
  $this
    ->assertEquals('Create', $buttons[0]
    ->getText());
  $this
    ->assertEquals('Cancel', $buttons[1]
    ->getText());
  $this
    ->assertSession()
    ->linkExists('Create');

  // Click the Create button.
  $buttons[0]
    ->click();
  $this
    ->assertSession()
    ->pageTextContains('Are you sure you want to apply this transition?');
  $this
    ->assertSession()
    ->pageTextContains('From: New');
  $this
    ->assertSession()
    ->pageTextContains('To: Fulfillment');
  $this
    ->assertSession()
    ->pageTextContains('Transition: Create');
  $this
    ->assertSession()
    ->pageTextContains('Test entity with bundle: First');
  $this
    ->assertSession()
    ->pageTextContains('This action cannot be undone.');
  $this
    ->assertSession()
    ->linkExists('Cancel');
  $this
    ->submitForm([], t('Confirm'));
  $buttons = $this
    ->xpath('//form[@id="state-machine-transition-form-entity-test-with-bundle-field-state-1"]/div/a');
  $this
    ->assertCount(1, $buttons);
  $this
    ->assertEquals('Fulfill', $buttons[0]
    ->getText());
  $transitions = [
    'create' => 403,
    'cancel' => 403,
    'fulfill' => 200,
  ];

  // Ensure the state transition form route doesn't allow access for
  // transitions that are not allowed.
  foreach ($transitions as $transition_id => $expected_status_code) {
    $route = Url::fromRoute('entity.entity_test_with_bundle.state_transition_form', [
      'entity_test_with_bundle' => $first_entity
        ->id(),
      'field_name' => 'field_state',
      'transition_id' => $transition_id,
    ]);
    $this
      ->drupalGet($route);
    $this
      ->assertSession()
      ->statusCodeEquals($expected_status_code);
  }
}