summaryrefslogtreecommitdiffstatshomepage
path: root/core/tests/Drupal
diff options
context:
space:
mode:
authorcatch <6915-catch@users.noreply.drupalcode.org>2025-04-30 09:28:53 +0100
committercatch <6915-catch@users.noreply.drupalcode.org>2025-04-30 09:28:53 +0100
commit6810f24aef13523c17d35d753cadb42ac5b9a0fc (patch)
tree388cac90b3b57d192d999aeea4e91c1001da3773 /core/tests/Drupal
parentac7afe45015efaa817e51806d00775996d2c7510 (diff)
downloaddrupal-6810f24aef13523c17d35d753cadb42ac5b9a0fc.tar.gz
drupal-6810f24aef13523c17d35d753cadb42ac5b9a0fc.zip
Issue #3505318 by macsim, smustgrave, cilefen: datetime-local element is failing on Datetime::valueCallback()
Diffstat (limited to 'core/tests/Drupal')
-rw-r--r--core/tests/Drupal/KernelTests/Core/Datetime/Element/DatetimeFormElementTest.php183
1 files changed, 183 insertions, 0 deletions
diff --git a/core/tests/Drupal/KernelTests/Core/Datetime/Element/DatetimeFormElementTest.php b/core/tests/Drupal/KernelTests/Core/Datetime/Element/DatetimeFormElementTest.php
new file mode 100644
index 00000000000..c287938f7b9
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Datetime/Element/DatetimeFormElementTest.php
@@ -0,0 +1,183 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\KernelTests\Core\Datetime\Element;
+
+use Drupal\Core\Datetime\DrupalDateTime;
+use Drupal\Core\Datetime\Element\Datetime;
+use Drupal\Core\Form\FormState;
+use Drupal\Core\Form\FormInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
+use Drupal\Tests\EntityViewTrait;
+
+/**
+ * Tests static callbacks returns and form submission with datetime elements.
+ *
+ * @coversDefaultClass \Drupal\Core\Datetime\Element\Datetime
+ * @group Datetime
+ */
+class DatetimeFormElementTest extends EntityKernelTestBase implements FormInterface {
+
+ use EntityViewTrait;
+
+ /**
+ * Form builder service.
+ *
+ * @var \Drupal\Core\Form\FormBuilder
+ */
+ protected $formBuilder;
+
+ /**
+ * {@inheritdoc}
+ */
+ protected static $modules = [
+ 'system',
+ 'datetime',
+ ];
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setUp(): void {
+ parent::setUp();
+
+ $this->installEntitySchema('date_format');
+ $this->installConfig(['system']);
+ $this->formBuilder = $this->container->get('form_builder');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getFormId(): string {
+ return 'datetime_form_element_test';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildForm(array $form, FormStateInterface $form_state): array {
+ // Test datetime-local element.
+ $form['datetime_local_picker'] = [
+ '#type' => 'datetime',
+ '#date_date_element' => 'datetime-local',
+ '#date_time_element' => 'none',
+ ];
+
+ $form['submit'] = [
+ '#type' => 'submit',
+ '#value' => 'Submit',
+ ];
+
+ return $form;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function submitForm(array &$form, FormStateInterface $form_state): void {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function validateForm(array &$form, FormStateInterface $form_state): void {
+ }
+
+ /**
+ * Checks we have no errors on form submit.
+ *
+ * @covers ::validateDatetime
+ */
+ public function testNoErrorMetOnFormSubmit(): void {
+ // No error expected when form elements have no value.
+ $form_state = new FormState();
+ $this->formBuilder->submitForm($this, $form_state);
+ $this->assertEmpty($form_state->getErrors());
+
+ // No error expected when a datetime-local element has a valid value.
+ $form_state = new FormState();
+ $form_state->setValue('datetime_local_picker', ['date' => '2025-02-18T12:00']);
+ $this->formBuilder->submitForm($this, $form_state);
+ $this->assertEmpty($form_state->getErrors());
+ }
+
+ /**
+ * Checks expected values are returned by ::valueCallback().
+ *
+ * Test only applied to 'datetime-local' date element.
+ *
+ * @covers ::valueCallback
+ */
+ public function testDatetimeLocalValueCallback(): void {
+ $element = [
+ '#type' => 'datetime',
+ '#date_date_element' => 'datetime-local',
+ '#date_time_element' => 'none',
+ ];
+ $input = [
+ 'date' => '2025-02-18T12:00',
+ ];
+ $form_state = new FormState();
+ $form_state->setValue('datetime_local_picker', ['date' => '2025-02-18T12:00']);
+
+ $result = Datetime::valueCallback($element, $input, $form_state);
+ $this->assertIsArray($result);
+ $this->assertArrayHasKey('date', $result);
+ $this->assertEquals('2025-02-18', $result['date']);
+ $this->assertArrayHasKey('time', $result);
+ $this->assertEquals('12:00:00', $result['time']);
+ $this->assertArrayHasKey('object', $result);
+ $this->assertNotEmpty($result['object']);
+ $this->assertInstanceOf(DrupalDateTime::class, $result['object']);
+ }
+
+ /**
+ * Checks expected values are returned by ::processDatetime().
+ *
+ * Test only applied to 'datetime-local' date element.
+ *
+ * @covers ::processDatetime
+ */
+ public function testDatetimeLocalProcessDatetime(): void {
+ $form = [
+ 'datetime_local_picker' => [
+ '#type' => 'datetime',
+ '#date_date_element' => 'datetime-local',
+ '#date_date_format' => 'Y-m-d',
+ '#date_time_element' => 'none',
+ '#date_time_format' => 'H:i:s',
+ '#value' => [
+ 'object' => new DrupalDateTime('2025-02-18T12:00'),
+ 'date' => '2025-02-18',
+ 'time' => '12:00:00',
+ ],
+ '#date_year_range' => '1900:2050',
+ '#attributes' => [],
+ '#required' => TRUE,
+ ],
+ 'submit' => [
+ '#type' => 'submit',
+ '#value' => 'Submit',
+ ],
+ ];
+ $element = $form['datetime_local_picker'];
+ $form_state = new FormState();
+ $form_state->setValue('datetime_local_picker', ['date' => '2025-02-18T12:00']);
+ $result = Datetime::processDatetime($element, $form_state, $form);
+ $this->assertIsArray($result);
+ $this->assertArrayHasKey('date', $result);
+ $this->assertIsArray($result['date']);
+ $this->assertArrayHasKey('#error_no_message', $result['date']);
+ $this->assertTrue($result['date']['#error_no_message']);
+ $this->assertArrayHasKey('#attributes', $result['date']);
+ $this->assertArrayHasKey('min', $result['date']['#attributes']);
+ $this->assertEquals('1900-01-01T00:00:00', $result['date']['#attributes']['min']);
+ $this->assertArrayHasKey('max', $result['date']['#attributes']);
+ $this->assertEquals('2050-12-31T23:59:59', $result['date']['#attributes']['max']);
+ $this->assertArrayNotHasKey('time', $result);
+ }
+
+}