graphql_compose-1.0.0-beta20/tests/src/Functional/Core/DateTest.php

tests/src/Functional/Core/DateTest.php
<?php

declare(strict_types=1);

namespace Drupal\Tests\graphql_compose\Functional\Core;

use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\Tests\graphql_compose\Functional\GraphQLComposeBrowserTestBase;
use Drupal\node\NodeInterface;

/**
 * Test date generation and formatting.
 *
 * @group graphql_compose
 */
class DateTest extends GraphQLComposeBrowserTestBase {

  /**
   * The test node.
   *
   * @var \Drupal\node\NodeInterface
   */
  protected NodeInterface $node;

  /**
   * The test date.
   *
   * @var int
   */
  protected int $now;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'datetime',
    'datetime_range',
  ];

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    $this->createContentType([
      'type' => 'test',
      'name' => 'Test node type',
    ]);

    // Create a datetime field, date only.
    FieldStorageConfig::create([
      'field_name' => 'field_date_only',
      'type' => 'datetime',
      'entity_type' => 'node',
      'settings' => [
        'datetime_type' => 'date',
      ],
    ])->save();

    FieldConfig::create([
      'field_name' => 'field_date_only',
      'entity_type' => 'node',
      'bundle' => 'test',
      'label' => 'Date only',
      'required' => FALSE,
    ])->save();

    // Create a date and time field.
    FieldStorageConfig::create([
      'field_name' => 'field_date_and_time',
      'type' => 'datetime',
      'entity_type' => 'node',
      'settings' => [
        'datetime_type' => 'datetime',
      ],
    ])->save();

    FieldConfig::create([
      'field_name' => 'field_date_and_time',
      'entity_type' => 'node',
      'bundle' => 'test',
      'label' => 'Date and time',
      'required' => FALSE,
    ])->save();

    // Create date range date only field.
    FieldStorageConfig::create([
      'field_name' => 'field_date_range_date_only',
      'type' => 'daterange',
      'entity_type' => 'node',
      'settings' => [
        'datetime_type' => 'date',
      ],
    ])->save();

    FieldConfig::create([
      'field_name' => 'field_date_range_date_only',
      'entity_type' => 'node',
      'bundle' => 'test',
      'label' => 'Date range date only',
      'required' => FALSE,
    ])->save();

    // Create date range date and time field.
    FieldStorageConfig::create([
      'field_name' => 'field_date_range_date_and_time',
      'type' => 'daterange',
      'entity_type' => 'node',
      'settings' => [
        'datetime_type' => 'datetime',
      ],
    ])->save();

    FieldConfig::create([
      'field_name' => 'field_date_range_date_and_time',
      'entity_type' => 'node',
      'bundle' => 'test',
      'label' => 'Date range date and time',
      'required' => FALSE,
    ])->save();

    // Create date range all day field.
    FieldStorageConfig::create([
      'field_name' => 'field_date_range_all_day',
      'type' => 'daterange',
      'entity_type' => 'node',
      'settings' => [
        'datetime_type' => 'allday',
      ],
    ])->save();

    FieldConfig::create([
      'field_name' => 'field_date_range_all_day',
      'entity_type' => 'node',
      'bundle' => 'test',
      'label' => 'Date range all day',
      'required' => FALSE,
    ])->save();

    $this->now = \Drupal::time()->getRequestTime();

    $this->node = $this->createNode([
      'type' => 'test',
      'title' => 'Test',
      'created' => $this->now,
      'changed' => $this->now,
      'field_date_only' => [
        'value' => '2025-05-25',
      ],
      'field_date_and_time' => [
        'value' => '2025-05-25 09:00:00',
      ],
      'field_date_range_date_only' => [
        'value' => '2025-05-25',
        'end_value' => '2025-05-26',
      ],
      'field_date_range_date_and_time' => [
        'value' => '2025-05-25T09:00:00',
        'end_value' => '2025-05-26T09:00:00',
      ],
      'field_date_range_all_day' => [
        'value' => '2025-05-25T00:00:00',
        'end_value' => '2025-05-26T00:00:00',
      ],
      'status' => 1,
    ]);

    $this->setEntityConfig('node', 'test', [
      'enabled' => TRUE,
      'query_load_enabled' => TRUE,
    ]);

    $this->setFieldConfig('node', 'test', 'field_date_only', [
      'enabled' => TRUE,
    ]);

    $this->setFieldConfig('node', 'test', 'field_date_and_time', [
      'enabled' => TRUE,
    ]);

    $this->setFieldConfig('node', 'test', 'field_date_range_date_only', [
      'enabled' => TRUE,
    ]);

    $this->setFieldConfig('node', 'test', 'field_date_range_date_and_time', [
      'enabled' => TRUE,
    ]);

    $this->setFieldConfig('node', 'test', 'field_date_range_all_day', [
      'enabled' => TRUE,
    ]);
  }

  /**
   * Test load entity by id.
   */
  public function testDateFields(): void {
    $query = <<<GQL
      query {
        node(id: "{$this->node->uuid()}") {
          ... on NodeInterface {
            created {
              time
              timezone
            }
            changed {
              time
              timezone
            }
          }
          ... on NodeTest {
            dateOnly {
              time
              timezone
            }
            dateAndTime {
              time
              timezone
            }
            dateRangeDateOnly {
              start {
                time
                timezone
              }
              end {
                time
                timezone
              }
            }
            dateRangeDateAndTime {
              start {
                time
                timezone
              }
              end {
                time
                timezone
              }
            }
            dateRangeAllDay {
              start {
                time
                timezone
              }
              end {
                time
                timezone
              }
            }
          }
        }
      }
    GQL;

    $content = $this->executeQuery($query);

    $node = $content['data']['node'];
    $this->assertNotNull($node['created'] ?? NULL);

    // Expected now stamp from string..
    $now = DrupalDateTime::createFromTimestamp($this->now, new \DateTimeZone('UTC'));
    $timezone = $now->getTimezone()->getName();

    // Created and changed are in the timezone of the server.
    $this->assertEquals($now->format(\DateTime::RFC3339), $node['created']['time']);
    $this->assertEquals($timezone, $node['created']['timezone']);

    // Stored dates and times are stored in UTC.
    $this->assertEquals('2025-05-25T12:00:00+00:00', $node['dateOnly']['time']);
    $this->assertEquals('UTC', $node['dateOnly']['timezone']);

    $this->assertEquals('2025-05-25T09:00:00+00:00', $node['dateAndTime']['time']);
    $this->assertEquals('UTC', $node['dateAndTime']['timezone']);

    // Date range date only.
    $this->assertEquals('2025-05-25T12:00:00+00:00', $node['dateRangeDateOnly']['start']['time']);
    $this->assertEquals('UTC', $node['dateRangeDateOnly']['start']['timezone']);

    $this->assertEquals('2025-05-26T12:00:00+00:00', $node['dateRangeDateOnly']['end']['time']);
    $this->assertEquals('UTC', $node['dateRangeDateOnly']['end']['timezone']);

    // Date range date and time.
    $this->assertEquals('2025-05-25T09:00:00+00:00', $node['dateRangeDateAndTime']['start']['time']);
    $this->assertEquals('UTC', $node['dateRangeDateAndTime']['start']['timezone']);

    $this->assertEquals('2025-05-26T09:00:00+00:00', $node['dateRangeDateAndTime']['end']['time']);
    $this->assertEquals('UTC', $node['dateRangeDateAndTime']['end']['timezone']);

    // Date range all day.
    $this->assertEquals('2025-05-25T00:00:00+00:00', $node['dateRangeAllDay']['start']['time']);
    $this->assertEquals('UTC', $node['dateRangeAllDay']['start']['timezone']);

    $this->assertEquals('2025-05-26T00:00:00+00:00', $node['dateRangeAllDay']['end']['time']);
    $this->assertEquals('UTC', $node['dateRangeAllDay']['end']['timezone']);

  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc