You are here

public function PaymentLineItemsInputTest::testValidate in Payment 8.2

@covers ::validate

File

tests/src/Unit/Element/PaymentLineItemsInputTest.php, line 560

Class

PaymentLineItemsInputTest
@coversDefaultClass \Drupal\payment\Element\PaymentLineItemsInput

Namespace

Drupal\Tests\payment\Unit\Element

Code

public function testValidate() {
  $line_item_name_a = $this
    ->randomMachineName();
  $line_item_name_b = $this
    ->randomMachineName();
  $line_item_name_c = $this
    ->randomMachineName();
  $root_element_name = $this
    ->randomMachineName();
  $form_build = array(
    'foo' => array(
      '#name' => $root_element_name,
      '#parents' => array(
        'foo',
      ),
      // The line items are built below.
      'line_items' => [],
    ),
  );
  $line_item_a = $this
    ->createMock(PaymentLineItemInterface::class);
  $line_item_b = $this
    ->createMock(PaymentLineItemInterface::class);
  $line_item_c = $this
    ->createMock(PaymentLineItemInterface::class);

  /** @var \PHPUnit\Framework\MockObject\MockObject[] $line_items */
  $line_items = array(
    $line_item_name_a => $line_item_a,
    $line_item_name_b => $line_item_b,
    $line_item_name_c => $line_item_c,
  );
  foreach ($line_items as $line_item_name => $line_item) {
    $form_build['foo']['line_items'][$line_item_name] = array(
      'plugin_form' => array(
        '#foo' => $this
          ->randomMachineName(),
      ),
    );
    $line_item
      ->expects($this
      ->atLeastOnce())
      ->method('getName')
      ->willReturn($line_item_name);
    $line_item
      ->expects($this
      ->once())
      ->method('validateConfigurationForm')
      ->with($form_build['foo']['line_items'][$line_item_name]['plugin_form']);
    $line_item
      ->expects($this
      ->once())
      ->method('submitConfigurationForm')
      ->with($form_build['foo']['line_items'][$line_item_name]['plugin_form']);
  }
  $form_state = new FormState();
  $form_state
    ->set('payment.element.payment_line_items_input.configured.' . $root_element_name, array_values($line_items));
  $form_state
    ->setValues(array(
    'foo' => array(
      'line_items' => array(
        $line_item_name_a => array(
          'weight' => 3,
        ),
        $line_item_name_b => array(
          'weight' => 1,
        ),
        $line_item_name_c => array(
          'weight' => 2,
        ),
      ),
    ),
  ));
  $this->sut
    ->validate($form_build['foo'], $form_state, $form_build);
  $element = $this->sut;
  $line_items = $element::getLineItems($form_build['foo'], $form_state);
  $this
    ->assertSame(array(
    $line_item_b,
    $line_item_c,
    $line_item_a,
  ), $line_items);
}