Version 1
[yaffs-website] / web / core / tests / Drupal / KernelTests / Core / Form / TriggeringElementProgrammedTest.php
diff --git a/web/core/tests/Drupal/KernelTests/Core/Form/TriggeringElementProgrammedTest.php b/web/core/tests/Drupal/KernelTests/Core/Form/TriggeringElementProgrammedTest.php
new file mode 100644 (file)
index 0000000..b2552c8
--- /dev/null
@@ -0,0 +1,86 @@
+<?php
+
+namespace Drupal\KernelTests\Core\Form;
+
+use Drupal\Core\Form\FormInterface;
+use Drupal\Core\Form\FormState;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Tests detection of triggering_element for programmed form submissions.
+ *
+ * @group Form
+ */
+class TriggeringElementProgrammedTest extends KernelTestBase implements FormInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'triggering_element_programmed_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $form['one'] = [
+      '#type' => 'textfield',
+      '#title' => 'One',
+      '#required' => TRUE,
+    ];
+    $form['two'] = [
+      '#type' => 'textfield',
+      '#title' => 'Two',
+      '#required' => TRUE,
+    ];
+    $form['actions'] = ['#type' => 'actions'];
+    $user_input = $form_state->getUserInput();
+    $form['actions']['submit'] = [
+      '#type' => 'submit',
+      '#value' => 'Save',
+      '#limit_validation_errors' => [
+        [$user_input['section']],
+      ],
+      // Required for #limit_validation_errors.
+      '#submit' => [[$this, 'submitForm']],
+    ];
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, FormStateInterface $form_state) {
+    // Verify that the only submit button was recognized as triggering_element.
+    $this->assertEqual($form['actions']['submit']['#array_parents'], $form_state->getTriggeringElement()['#array_parents']);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+  }
+
+  /**
+   * Tests that #limit_validation_errors of the only submit button takes effect.
+   */
+  public function testLimitValidationErrors() {
+    // Programmatically submit the form.
+    $form_state = new FormState();
+    $form_state->setValue('section', 'one');
+    $form_builder = $this->container->get('form_builder');
+    $form_builder->submitForm($this, $form_state);
+
+    // Verify that only the specified section was validated.
+    $errors = $form_state->getErrors();
+    $this->assertTrue(isset($errors['one']), "Section 'one' was validated.");
+    $this->assertFalse(isset($errors['two']), "Section 'two' was not validated.");
+
+    // Verify that there are only values for the specified section.
+    $this->assertTrue($form_state->hasValue('one'), "Values for section 'one' found.");
+    $this->assertFalse($form_state->hasValue('two'), "Values for section 'two' not found.");
+  }
+
+}