date_recur-8.x-2.2/tests/src/Unit/DateRecurRlInterpretationUnitTest.php

tests/src/Unit/DateRecurRlInterpretationUnitTest.php
<?php

declare(strict_types=1);

namespace Drupal\Tests\date_recur\Unit;

use Drupal\Core\Datetime\DateFormatInterface;
use Drupal\Core\Datetime\DateFormatterInterface;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Tests\UnitTestCase;
use Drupal\date_recur\Plugin\DateRecurInterpreter\RlInterpreter;
use Drupal\date_recur\Rl\RlDateRecurRule;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Tests Rlanvin implementation of interpreter.
 *
 * Interpretations come from the RLanvin library, test the basics here.
 *
 * @coversDefaultClass \Drupal\date_recur\Plugin\DateRecurInterpreter\RlInterpreter
 * @group date_recur
 *
 * @ingroup RLanvinPhpRrule
 */
final class DateRecurRlInterpretationUnitTest extends UnitTestCase {

  /**
   * A test container.
   *
   * @var \Symfony\Component\DependencyInjection\ContainerInterface
   */
  protected ContainerInterface $testContainer;

  protected function setUp(): void {
    parent::setUp();

    $dateFormat = $this->createMock(DateFormatInterface::class);
    $dateFormat->expects($this::any())
      ->method('id')
      ->willReturn($this->randomMachineName());

    $dateFormatStorage = $this->createMock(EntityStorageInterface::class);
    $dateFormatStorage->expects($this::any())
      ->method('load')
      ->with($this::anything())
      ->willReturn($dateFormat);

    $entityTypeManager = $this->createMock(EntityTypeManagerInterface::class);
    $entityTypeManager->expects($this::any())
      ->method('getStorage')
      ->with('date_format')
      ->willReturn($dateFormatStorage);

    $dateFormatter = $this->createMock(DateFormatterInterface::class);
    $dateFormatter->expects($this::any())
      ->method('format')
      ->with($this::anything())
      // See \Drupal\Core\Datetime\DateFormatterInterface::format.
      ->willReturnCallback(static function ($timestamp, $type = 'medium', $format = '', ?string $timezone = NULL, $langcode = NULL) {
        $date = new \DateTime('@' . $timestamp);
        if (!$timezone) {
          $timezone = \date_default_timezone_get();
        }
        $date->setTimezone(new \DateTimeZone($timezone));
        return $date->format('r');
      });

    $container = new ContainerBuilder();
    $container->set('date.formatter', $dateFormatter);
    $container->set('entity_type.manager', $entityTypeManager);
    $this->testContainer = $container;
  }

  /**
   * Tests secondly interpretation.
   */
  public function testSecondly(): void {
    $parts = [
      'FREQ' => 'SECONDLY',
      'DTSTART' => new \DateTime('4am 15 July 2012', new \DateTimeZone('Pacific/Honolulu')),
      'BYSECOND' => '59',
    ];
    $rules[] = new RlDateRecurRule($parts);
    $configuration = ['date_format' => $this->randomMachineName()];
    $interpreter = RlInterpreter::create($this->testContainer, $configuration, '', []);
    $interpretation = $interpreter->interpret($rules, 'en');
    static::assertEquals('secondly at second 59, starting from Mon, 16 Jul 2012 00:00:00 +1000, forever', $interpretation);
  }

  /**
   * Tests minutely interpretation.
   */
  public function testMinutely(): void {
    $parts = [
      'FREQ' => 'MINUTELY',
      'DTSTART' => new \DateTime('4am 15 July 2012', new \DateTimeZone('Pacific/Honolulu')),
      'BYMINUTE' => '44',
    ];
    $rules[] = new RlDateRecurRule($parts);
    $configuration = ['date_format' => $this->randomMachineName()];
    $interpreter = RlInterpreter::create($this->testContainer, $configuration, '', []);
    $interpretation = $interpreter->interpret($rules, 'en');
    static::assertEquals('minutely at minute 44, starting from Mon, 16 Jul 2012 00:00:00 +1000, forever', $interpretation);
  }

  /**
   * Tests hourly interpretation.
   */
  public function testHourly(): void {
    $parts = [
      'FREQ' => 'HOURLY',
      'DTSTART' => new \DateTime('4am 15 July 2012', new \DateTimeZone('Pacific/Honolulu')),
      'BYHOUR' => '4,7',
    ];
    $rules[] = new RlDateRecurRule($parts);
    $configuration = ['date_format' => $this->randomMachineName()];
    $interpreter = RlInterpreter::create($this->testContainer, $configuration, '', []);
    $interpretation = $interpreter->interpret($rules, 'en');
    static::assertEquals('hourly at 4h and 7h, starting from Mon, 16 Jul 2012 00:00:00 +1000, forever', $interpretation);
  }

  /**
   * Tests daily interpretation.
   */
  public function testDaily(): void {
    $parts = [
      'FREQ' => 'DAILY',
      'DTSTART' => new \DateTime('4am 15 July 2012', new \DateTimeZone('Pacific/Honolulu')),
      'BYDAY' => 'WE,SU',
    ];
    $rules[] = new RlDateRecurRule($parts);
    $configuration = ['date_format' => $this->randomMachineName()];
    $interpreter = RlInterpreter::create($this->testContainer, $configuration, '', []);
    $interpretation = $interpreter->interpret($rules, 'en');
    static::assertEquals('daily on Wednesday and Sunday, starting from Mon, 16 Jul 2012 00:00:00 +1000, forever', $interpretation);
  }

  /**
   * Tests weekly interpretation.
   */
  public function testWeekly(): void {
    $parts = [
      'FREQ' => 'WEEKLY',
      'DTSTART' => new \DateTime('4am 15 July 2012', new \DateTimeZone('Pacific/Honolulu')),
      'BYDAY' => 'MO,TU',
    ];
    $rules[] = new RlDateRecurRule($parts);
    $configuration = ['date_format' => $this->randomMachineName()];
    $interpreter = RlInterpreter::create($this->testContainer, $configuration, '', []);
    $interpretation = $interpreter->interpret($rules, 'en');
    static::assertEquals('weekly on Monday and Tuesday, starting from Mon, 16 Jul 2012 00:00:00 +1000, forever', $interpretation);
  }

  /**
   * Tests monthly interpretation.
   */
  public function testMonthly(): void {
    $parts = [
      'FREQ' => 'MONTHLY',
      'DTSTART' => new \DateTime('4am 15 July 2012', new \DateTimeZone('Pacific/Honolulu')),
      'BYMONTH' => '2,10',
    ];
    $rules[] = new RlDateRecurRule($parts);
    $configuration = ['date_format' => $this->randomMachineName()];
    $interpreter = RlInterpreter::create($this->testContainer, $configuration, '', []);
    $interpretation = $interpreter->interpret($rules, 'en');
    static::assertEquals('monthly in February and October, starting from Mon, 16 Jul 2012 00:00:00 +1000, forever', $interpretation);
  }

  /**
   * Tests yearly interpretation.
   */
  public function testYearly(): void {
    $parts = [
      'FREQ' => 'YEARLY',
      'DTSTART' => new \DateTime('4am 15 July 2012', new \DateTimeZone('Pacific/Honolulu')),
    ];
    $rules[] = new RlDateRecurRule($parts);
    $configuration = ['date_format' => $this->randomMachineName()];
    $interpreter = RlInterpreter::create($this->testContainer, $configuration, '', []);
    $interpretation = $interpreter->interpret($rules, 'en');
    static::assertEquals('yearly, starting from Mon, 16 Jul 2012 00:00:00 +1000, forever', $interpretation);
  }

  /**
   * Tests output is in the same time zone as requested.
   */
  public function testDisplayTimeZone(): void {
    $parts = [
      'FREQ' => 'WEEKLY',
      // Africa/Tripoli: UTC+2 No DST.
      'DTSTART' => new \DateTime('4am 15 July 2012', new \DateTimeZone('Africa/Tripoli')),
    ];
    $rules[] = new RlDateRecurRule($parts);
    $configuration = ['date_format' => $this->randomMachineName()];
    $interpreter = RlInterpreter::create($this->testContainer, $configuration, '', []);
    // Asia/Singapore: UTC+8 No DST.
    $displayTimeZone = new \DateTimeZone('Asia/Singapore');
    $interpretation = $interpreter->interpret($rules, 'en', $displayTimeZone);
    static::assertEquals('weekly, starting from Sun, 15 Jul 2012 10:00:00 +0800, forever', $interpretation);
  }

}

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

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