cache_entity_type-1.x-dev/tests/src/Kernel/CacheEntityStorageTest.php

tests/src/Kernel/CacheEntityStorageTest.php
<?php

declare(strict_types=1);

namespace Drupal\Tests\cache_entity_type\Kernel;

use Drupal\cache_entity_type\Entity\Cache\CacheEntityStorage;
use Drupal\cache_entity_type_example\Entity\DailyWeatherForecast;
use Drupal\Core\Entity\EntityStorageException;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\KernelTests\KernelTestBase;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;

/**
 * Tests the CacheEntityStorage class.
 *
 * @package Drupal\Tests\cache_entity_type\Kernel
 * @coversDefaultClass \Drupal\cache_entity_type\Entity\Cache\CacheEntityStorage
 * @group cache_entity_type
 */
class CacheEntityStorageTest extends KernelTestBase {

  /**
   * {@inheritdoc}
   */
  public static $modules = [
    'cache_entity_type_example',
  ];

  private const ENTITY_TYPE_ID = 'example_daily_weather_forecast';

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  private EntityTypeManagerInterface $entityTypeManager;

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

    $this->installEntitySchema(self::ENTITY_TYPE_ID);

    $entityTypeManager = $this->container->get('entity_type.manager');
    if (!$entityTypeManager instanceof EntityTypeManagerInterface) {
      throw new ServiceNotFoundException('entity_type.manager');
    }
    $this->entityTypeManager = $entityTypeManager;
  }

  /**
   * Checks if the storage can be loaded.
   *
   * @covers ::createInstance
   */
  public function testStorageCanBeLoaded(): void {
    $storage = NULL;

    try {
      $storage = $this->entityTypeManager->getStorage(self::ENTITY_TYPE_ID);
    }
    catch (\Exception $exception) {
      $this->fail('Getting cache entity type storage failed.');
    }

    $this->assertInstanceOf(CacheEntityStorage::class, $storage);
  }

  /**
   * @covers ::doSave
   */
  public function testEntityCreationAndSavingAndPropertyGetting(): void {
    $storage = $this->entityTypeManager->getStorage(self::ENTITY_TYPE_ID);

    $entity1 = $storage->create([
      'key' => 'forecast_st_gallen_2020_09_15',
      'averageTemperature' => 25.3
    ]);

    $this->assertInstanceOf(DailyWeatherForecast::class, $entity1);
    /** @var \Drupal\cache_entity_type_example\Entity\DailyWeatherForecast $entity1 */
    self::assertEquals('forecast_st_gallen_2020_09_15', $entity1->getKey());
    self::assertEqualsWithDelta(25.3, $entity1->getAverageTemperature(), 0.1, 'Entity value is not the same as passed to ::create.');

    try {
      $entity1->save();
    }
    catch (EntityStorageException $entityStorageException) {
      $this->fail('Saving entity threw an EntityStorageException.');
    }

    // Check that saving does not change any values.
    $this->assertInstanceOf(DailyWeatherForecast::class, $entity1);
    self::assertEquals('forecast_st_gallen_2020_09_15', $entity1->getKey());
    self::assertEqualsWithDelta(25.3, $entity1->getAverageTemperature(), 0.1, 'Entity value is not the same as passed to ::create.');
  }

  /**
   * Asserts that two DailyWeatherForecast entities are the same one.
   *
   * @param \Drupal\cache_entity_type_example\Entity\DailyWeatherForecast $expectedEntity
   *   The expected entity.
   * @param mixed $actualEntity
   *   The actual entity.
   */
  protected function assertIsEntityEqual(DailyWeatherForecast $expectedEntity, $actualEntity): void {
    $this->assertInstanceOf(DailyWeatherForecast::class, $actualEntity);

    /** @var \Drupal\cache_entity_type_example\Entity\DailyWeatherForecast $actualEntity */
    self::assertEquals($expectedEntity->getKey(), $actualEntity->getKey());
    self::assertEqualsWithDelta($expectedEntity->getAverageTemperature(), $actualEntity->getAverageTemperature(), 0.1);
    self::assertEquals($expectedEntity->id(), $actualEntity->id());
  }

  /**
   * @covers ::doSave
   * @covers ::doLoadMultiple
   */
  public function testCrud(): void {
    $storage = $this->entityTypeManager->getStorage(self::ENTITY_TYPE_ID);

    $entity1 = $storage->create([
      'key' => 'forecast_st_gallen_2020_09_20',
      'averageTemperature' => 25.3
    ]);
    $entity1->save();
    $this->assertInstanceOf(DailyWeatherForecast::class, $entity1);
    self::assertEquals(1, $entity1->id());

    $entity2 = $storage->create([
      'key' => 'forecast_st_gallen_2020_09_21',
      'averageTemperature' => 23.6
    ]);
    $entity2->save();
    $this->assertInstanceOf(DailyWeatherForecast::class, $entity2);
    self::assertEquals(2, $entity2->id());

    $entity3 = $storage->create([
      'key' => 'forecast_st_gallen_2020_09_22',
      'averageTemperature' => 21.1
    ]);
    $entity3->save();
    $this->assertInstanceOf(DailyWeatherForecast::class, $entity3);
    self::assertEquals(3, $entity3->id());

    $entity4 = $storage->create([
      'key' => 'forecast_st_gallen_2020_09_23',
      'averageTemperature' => 26.5
    ]);
    $entity4->save();
    $this->assertInstanceOf(DailyWeatherForecast::class, $entity4);
    self::assertEquals(4, $entity4->id());

    $allEntities = $storage->loadMultiple();
    self::assertCount(4, $allEntities);
    self::assertContainsOnlyInstancesOf(DailyWeatherForecast::class, $allEntities);

    $loadedEntity1 = $storage->load($entity1->id());
    /** @var \Drupal\cache_entity_type_example\Entity\DailyWeatherForecast $entity1 */
    $this->assertIsEntityEqual($entity1, $loadedEntity1);
    /** @var \Drupal\cache_entity_type_example\Entity\DailyWeatherForecast $entity2 */
    $loadedEntity2 = $storage->load($entity2->id());
    $this->assertIsEntityEqual($entity2, $loadedEntity2);

    $storage->delete([$entity2]);
    $loadedDeletedEntity2 = $storage->load($entity2->id());
    self::assertNull($loadedDeletedEntity2);

    $allEntitiesWithout2 = $storage->loadMultiple();
    self::assertCount(3, $allEntitiesWithout2);
    self::assertContainsOnlyInstancesOf(DailyWeatherForecast::class, $allEntitiesWithout2);

    $filledInEntity2 = $storage->create([
      'key' => 'forecast_st_gallen_2020_09_21_v2',
      'averageTemperature' => 24.8
    ]);
    $filledInEntity2->save();
    $this->assertInstanceOf(DailyWeatherForecast::class, $filledInEntity2);
    self::assertEquals(2, $filledInEntity2->id());

    $allEntitiesWithFilledIn = $storage->loadMultiple();
    self::assertCount(4, $allEntitiesWithFilledIn);
    self::assertContainsOnlyInstancesOf(DailyWeatherForecast::class, $allEntitiesWithFilledIn);

    $storage->delete($allEntitiesWithFilledIn);
    self::assertCount(0, $storage->loadMultiple());
  }

}

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

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