Skip to content
Snippets Groups Projects
Verified Commit c48da9e7 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3224239 by bircher, rpayanm, smustgrave: StorageComparer does not work...

Issue #3224239 by bircher, rpayanm, smustgrave: StorageComparer does not work when storages are not in the default collection
parent 4df74826
Branches
Tags
27 merge requests!12227Issue #3181946 by jonmcl, mglaman,!54479.5.x SF update,!5014Issue #3071143: Table Render Array Example Is Incorrect,!4868Issue #1428520: Improve menu parent link selection,!4289Issue #1344552 by marcingy, Niklas Fiekas, Ravi.J, aleevas, Eduardo Morales...,!4114Issue #2707291: Disable body-level scrolling when a dialog is open as a modal,!4100Issue #3249600: Add support for PHP 8.1 Enums as allowed values for list_* data types,!3630Issue #2815301 by Chi, DanielVeza, kostyashupenko, smustgrave: Allow to create...,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2062Issue #3246454: Add weekly granularity to views date sort,!1591Issue #3199697: Add JSON:API Translation experimental module,!1484Exposed filters get values from URL when Ajax is on,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1162Issue #3100350: Unable to save '/' root path alias,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!925Issue #2339235: Remove taxonomy hard dependency on node module,!877Issue #2708101: Default value for link text is not saved,!872Draft: Issue #3221319: Race condition when creating menu links and editing content deletes menu links,!844Resolve #3036010 "Updaters",!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493,!485Sets the autocomplete attribute for username/password input field on login form.,!30Issue #3182188: Updates composer usage to point at ./vendor/bin/composer
......@@ -90,6 +90,13 @@ class StorageComparer implements StorageComparerInterface {
* Storage object used to write configuration.
*/
public function __construct(StorageInterface $source_storage, StorageInterface $target_storage) {
if ($source_storage->getCollectionName() !== StorageInterface::DEFAULT_COLLECTION) {
$source_storage = $source_storage->createCollection(StorageInterface::DEFAULT_COLLECTION);
}
if ($target_storage->getCollectionName() !== StorageInterface::DEFAULT_COLLECTION) {
$target_storage = $target_storage->createCollection(StorageInterface::DEFAULT_COLLECTION);
}
// Wrap the storages in a static cache so that multiple reads of the same
// raw configuration object are not costly.
$this->sourceCacheStorage = new MemoryBackend();
......
......@@ -3,7 +3,9 @@
namespace Drupal\Tests\Core\Config;
use Drupal\Component\Uuid\Php;
use Drupal\Core\Config\MemoryStorage;
use Drupal\Core\Config\StorageComparer;
use Drupal\Core\Config\StorageInterface;
use Drupal\Tests\UnitTestCase;
/**
......@@ -42,6 +44,14 @@ class StorageComparerTest extends UnitTestCase {
protected function setUp(): void {
$this->sourceStorage = $this->createMock('Drupal\Core\Config\StorageInterface');
$this->targetStorage = $this->createMock('Drupal\Core\Config\StorageInterface');
$this->sourceStorage->expects($this->atLeastOnce())
->method('getCollectionName')
->will($this->returnValue(StorageInterface::DEFAULT_COLLECTION));
$this->targetStorage->expects($this->atLeastOnce())
->method('getCollectionName')
->will($this->returnValue(StorageInterface::DEFAULT_COLLECTION));
$this->storageComparer = new StorageComparer($this->sourceStorage, $this->targetStorage);
}
......@@ -241,4 +251,56 @@ public function testCreateChangelistUpdate() {
$this->assertEmpty($this->storageComparer->getChangelist('delete'));
}
/**
* @covers ::createChangelist
*/
public function testDifferentCollections() {
$source = new MemoryStorage();
$target = new MemoryStorage();
$this->generateRandomData($source, 's');
$this->generateRandomData($target, 't');
// Use random collections for source and target.
$collections = $source->getAllCollectionNames();
$source = $source->createCollection($collections[array_rand($collections)]);
$collections = $target->getAllCollectionNames();
$target = $target->createCollection($collections[array_rand($collections)]);
$comparer = new StorageComparer($source, $target);
$comparer->createChangelist();
foreach (array_merge([StorageInterface::DEFAULT_COLLECTION], $source->getAllCollectionNames(), $target->getAllCollectionNames()) as $collection) {
$expected = [
'create' => $source->createCollection($collection)->listAll(),
'update' => [],
'delete' => $target->createCollection($collection)->listAll(),
'rename' => [],
];
$this->assertEqualsCanonicalizing($expected, $comparer->getChangelist(NULL, $collection));
}
}
/**
* Generate random data in a config storage.
*
* @param \Drupal\Core\Config\StorageInterface $storage
* The storage to populate with random data.
* @param string $prefix
* The prefix for random names to make sure they are unique.
*/
protected function generateRandomData(StorageInterface $storage, string $prefix = '') {
$generator = $this->getRandomGenerator();
for ($i = 0; $i < rand(2, 10); $i++) {
$storage->write($prefix . $this->randomMachineName(), (array) $generator->object());
}
for ($i = 0; $i < rand(1, 5); $i++) {
$collection = $storage->createCollection($prefix . $this->randomMachineName());
for ($i = 0; $i < rand(2, 10); $i++) {
$collection->write($prefix . $this->randomMachineName(), (array) $generator->object());
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment