class ReadOnlyStorageTest

Same name and namespace in other branches
  1. 9 core/tests/Drupal/Tests/Core/Config/ReadOnlyStorageTest.php \Drupal\Tests\Core\Config\ReadOnlyStorageTest
  2. 8.9.x core/tests/Drupal/Tests/Core/Config/ReadOnlyStorageTest.php \Drupal\Tests\Core\Config\ReadOnlyStorageTest
  3. 10 core/tests/Drupal/Tests/Core/Config/ReadOnlyStorageTest.php \Drupal\Tests\Core\Config\ReadOnlyStorageTest

@coversDefaultClass \Drupal\Core\Config\ReadOnlyStorage
@group Config

Hierarchy

Expanded class hierarchy of ReadOnlyStorageTest

File

core/tests/Drupal/Tests/Core/Config/ReadOnlyStorageTest.php, line 18

Namespace

Drupal\Tests\Core\Config
View source
class ReadOnlyStorageTest extends UnitTestCase {
  use StorageCopyTrait;
  
  /**
   * The memory storage containing the data.
   *
   * @var \Drupal\Core\Config\MemoryStorage
   */
  protected $memory;
  
  /**
   * The read-only storage under test.
   *
   * @var \Drupal\Core\Config\ReadOnlyStorage
   */
  protected $storage;
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    // Set up a memory storage we can manipulate to set fixtures.
    $this->memory = new MemoryStorage();
    // Wrap the memory storage in the read-only storage to test it.
    $this->storage = new ReadOnlyStorage($this->memory);
  }
  
  /**
   * @covers ::exists
   * @covers ::read
   * @covers ::readMultiple
   * @covers ::listAll
   *
   * @dataProvider readMethodsProvider
   */
  public function testReadOperations($method, $arguments, $fixture) : void {
    $this->setRandomFixtureConfig($fixture);
    $expected = call_user_func_array([
      $this->memory,
      $method,
    ], $arguments);
    $actual = call_user_func_array([
      $this->storage,
      $method,
    ], $arguments);
    $this->assertEquals($expected, $actual);
  }
  
  /**
   * Provide the methods that work transparently.
   *
   * @return array
   *   The data.
   */
  public static function readMethodsProvider() {
    $fixture = [
      StorageInterface::DEFAULT_COLLECTION => [
        'config.a',
        'config.b',
        'other.a',
      ],
    ];
    $data = [];
    $data[] = [
      'exists',
      [
        'config.a',
      ],
      $fixture,
    ];
    $data[] = [
      'exists',
      [
        'not.existing',
      ],
      $fixture,
    ];
    $data[] = [
      'read',
      [
        'config.a',
      ],
      $fixture,
    ];
    $data[] = [
      'read',
      [
        'not.existing',
      ],
      $fixture,
    ];
    $data[] = [
      'readMultiple',
      [
        [
          'config.a',
          'config.b',
          'not',
        ],
      ],
      $fixture,
    ];
    $data[] = [
      'listAll',
      [
        '',
      ],
      $fixture,
    ];
    $data[] = [
      'listAll',
      [
        'config',
      ],
      $fixture,
    ];
    $data[] = [
      'listAll',
      [
        'none',
      ],
      $fixture,
    ];
    return $data;
  }
  
  /**
   * @covers ::write
   * @covers ::delete
   * @covers ::rename
   * @covers ::deleteAll
   *
   * @dataProvider writeMethodsProvider
   */
  public function testWriteOperations($method, $arguments, $fixture) : void {
    $this->setRandomFixtureConfig($fixture);
    // Create an independent memory storage as a backup.
    $backup = new MemoryStorage();
    static::replaceStorageContents($this->memory, $backup);
    try {
      call_user_func_array([
        $this->storage,
        $method,
      ], $arguments);
      $this->fail("exception not thrown");
    } catch (\BadMethodCallException $exception) {
      $this->assertEquals(ReadOnlyStorage::class . '::' . $method . ' is not allowed on a ReadOnlyStorage', $exception->getMessage());
    }
    // Assert that the memory storage has not been altered.
    $this->assertEquals($backup, $this->memory);
  }
  
  /**
   * Provide the methods that throw an exception.
   *
   * @return array
   *   The data
   */
  public static function writeMethodsProvider() {
    $fixture = [
      StorageInterface::DEFAULT_COLLECTION => [
        'config.a',
        'config.b',
      ],
    ];
    $data = [];
    $data[] = [
      'write',
      [
        'config.a',
        (array) Random::getGenerator()->object(),
      ],
      $fixture,
    ];
    $data[] = [
      'write',
      [
        Random::machineName(),
        (array) Random::getGenerator()->object(),
      ],
      $fixture,
    ];
    $data[] = [
      'delete',
      [
        'config.a',
      ],
      $fixture,
    ];
    $data[] = [
      'delete',
      [
        Random::machineName(),
      ],
      $fixture,
    ];
    $data[] = [
      'rename',
      [
        'config.a',
        'config.b',
      ],
      $fixture,
    ];
    $data[] = [
      'rename',
      [
        'config.a',
        Random::machineName(),
      ],
      $fixture,
    ];
    $data[] = [
      'rename',
      [
        Random::machineName(),
        Random::machineName(),
      ],
      $fixture,
    ];
    $data[] = [
      'deleteAll',
      [
        '',
      ],
      $fixture,
    ];
    $data[] = [
      'deleteAll',
      [
        'config',
      ],
      $fixture,
    ];
    $data[] = [
      'deleteAll',
      [
        'other',
      ],
      $fixture,
    ];
    return $data;
  }
  
  /**
   * @covers ::getAllCollectionNames
   * @covers ::getCollectionName
   * @covers ::createCollection
   */
  public function testCollections() : void {
    $fixture = [
      StorageInterface::DEFAULT_COLLECTION => [
        $this->randomMachineName(),
      ],
      'A' => [
        $this->randomMachineName(),
      ],
      'B' => [
        $this->randomMachineName(),
      ],
      'C' => [
        $this->randomMachineName(),
      ],
    ];
    $this->setRandomFixtureConfig($fixture);
    $this->assertEquals([
      'A',
      'B',
      'C',
    ], $this->storage
      ->getAllCollectionNames());
    foreach (array_keys($fixture) as $collection) {
      $storage = $this->storage
        ->createCollection($collection);
      // Assert that the collection storage is still a read-only storage.
      $this->assertInstanceOf(ReadOnlyStorage::class, $storage);
      $this->assertEquals($collection, $storage->getCollectionName());
    }
  }
  
  /**
   * @covers ::encode
   * @covers ::decode
   */
  public function testEncodeDecode() : void {
    $array = (array) $this->getRandomGenerator()
      ->object();
    $string = $this->getRandomGenerator()
      ->string();
    // Assert reversibility of encoding and decoding.
    $this->assertEquals($array, $this->storage
      ->decode($this->storage
      ->encode($array)));
    $this->assertEquals($string, $this->storage
      ->encode($this->storage
      ->decode($string)));
    // Assert same results as the decorated storage.
    $this->assertEquals($this->memory
      ->encode($array), $this->storage
      ->encode($array));
    $this->assertEquals($this->memory
      ->decode($string), $this->storage
      ->decode($string));
  }
  
  /**
   * Generate random config in the memory storage.
   *
   * @param array $config
   *   The config keys, keyed by the collection.
   */
  protected function setRandomFixtureConfig($config) : void {
    // Erase previous fixture.
    foreach (array_merge([
      StorageInterface::DEFAULT_COLLECTION,
    ], $this->memory
      ->getAllCollectionNames()) as $collection) {
      $this->memory
        ->createCollection($collection)
        ->deleteAll();
    }
    foreach ($config as $collection => $keys) {
      $storage = $this->memory
        ->createCollection($collection);
      foreach ($keys as $key) {
        // Create some random config.
        $storage->write($key, (array) $this->getRandomGenerator()
          ->object());
      }
    }
  }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
ExpectDeprecationTrait::expectDeprecation public function Adds an expected deprecation.
ExpectDeprecationTrait::setUpErrorHandler public function Sets up the test error handler.
ExpectDeprecationTrait::tearDownErrorHandler public function Tears down the test error handler.
RandomGeneratorTrait::getRandomGenerator protected function Gets the random generator for the utility methods.
RandomGeneratorTrait::randomMachineName protected function Generates a unique random string containing letters and numbers.
RandomGeneratorTrait::randomObject public function Generates a random PHP object.
RandomGeneratorTrait::randomString public function Generates a pseudo-random string of ASCII characters of codes 32 to 126.
ReadOnlyStorageTest::$memory protected property The memory storage containing the data.
ReadOnlyStorageTest::$storage protected property The read-only storage under test.
ReadOnlyStorageTest::readMethodsProvider public static function Provide the methods that work transparently.
ReadOnlyStorageTest::setRandomFixtureConfig protected function Generate random config in the memory storage.
ReadOnlyStorageTest::setUp protected function Overrides UnitTestCase::setUp
ReadOnlyStorageTest::testCollections public function @covers ::getAllCollectionNames[[api-linebreak]]
@covers ::getCollectionName[[api-linebreak]]
@covers ::createCollection[[api-linebreak]]
ReadOnlyStorageTest::testEncodeDecode public function @covers ::encode[[api-linebreak]]
@covers ::decode[[api-linebreak]]
ReadOnlyStorageTest::testReadOperations public function @covers ::exists[[api-linebreak]]
@covers ::read[[api-linebreak]]
@covers ::readMultiple[[api-linebreak]]
@covers ::listAll[[api-linebreak]]
ReadOnlyStorageTest::testWriteOperations public function @covers ::write[[api-linebreak]]
@covers ::delete[[api-linebreak]]
@covers ::rename[[api-linebreak]]
@covers ::deleteAll[[api-linebreak]]
ReadOnlyStorageTest::writeMethodsProvider public static function Provide the methods that throw an exception.
StorageCopyTrait::replaceStorageContents protected static function Copy the configuration from one storage to another and remove stale items.
UnitTestCase::$root protected property The app root.
UnitTestCase::getClassResolverStub protected function Returns a stub class resolver.
UnitTestCase::getConfigFactoryStub public function Returns a stub config factory that behaves according to the passed array.
UnitTestCase::getContainerWithCacheTagsInvalidator protected function Sets up a container with a cache tags invalidator.
UnitTestCase::getStringTranslationStub public function Returns a stub translation manager that just returns the passed string.
UnitTestCase::setDebugDumpHandler public static function Registers the dumper CLI handler when the DebugDump extension is enabled.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.