diff --git a/Neos.ContentRepository.BehavioralTests/Classes/TestSuite/Behavior/CRBehavioralTestsSubjectProvider.php b/Neos.ContentRepository.BehavioralTests/Classes/TestSuite/Behavior/CRBehavioralTestsSubjectProvider.php index 7653d709fe..47ad3ca055 100644 --- a/Neos.ContentRepository.BehavioralTests/Classes/TestSuite/Behavior/CRBehavioralTestsSubjectProvider.php +++ b/Neos.ContentRepository.BehavioralTests/Classes/TestSuite/Behavior/CRBehavioralTestsSubjectProvider.php @@ -23,6 +23,7 @@ use Neos\ContentRepository\TestSuite\Fakes\GherkinTableNodeBasedContentDimensionSource; use Neos\ContentRepository\TestSuite\Fakes\GherkinTableNodeBasedContentDimensionSourceFactory; use Neos\EventStore\EventStoreInterface; +use Symfony\Component\Yaml\Yaml; /** * Subject provider for behavioral tests @@ -59,7 +60,7 @@ protected function getContentRepository(ContentRepositoryId $contentRepositoryId */ public function usingNoContentDimensions(): void { - GherkinTableNodeBasedContentDimensionSourceFactory::$contentDimensionsToUse = GherkinTableNodeBasedContentDimensionSource::createEmpty(); + GherkinTableNodeBasedContentDimensionSourceFactory::setWithoutDimensions(); } /** @@ -67,7 +68,9 @@ public function usingNoContentDimensions(): void */ public function usingTheFollowingContentDimensions(TableNode $contentDimensions): void { - GherkinTableNodeBasedContentDimensionSourceFactory::initializeFromTableNode($contentDimensions); + GherkinTableNodeBasedContentDimensionSourceFactory::setContentDimensionSource( + GherkinTableNodeBasedContentDimensionSource::fromGherkinTableNode($contentDimensions) + ); } /** @@ -75,7 +78,7 @@ public function usingTheFollowingContentDimensions(TableNode $contentDimensions) */ public function usingTheFollowingNodeTypes(PyStringNode $serializedNodeTypesConfiguration): void { - GherkinPyStringNodeBasedNodeTypeManagerFactory::initializeWithPyStringNode($serializedNodeTypesConfiguration); + GherkinPyStringNodeBasedNodeTypeManagerFactory::setConfiguration(Yaml::parse($serializedNodeTypesConfiguration->getRaw()) ?? []); } /** @@ -99,8 +102,11 @@ public function iChangeTheContentDimensionsInContentRepositoryTo(string $content throw new \DomainException('undeclared content repository ' . $contentRepositoryId); } else { $contentRepository = $this->contentRepositories[$contentRepositoryId]; - GherkinPyStringNodeBasedNodeTypeManagerFactory::$nodeTypesToUse = $contentRepository->getNodeTypeManager(); - GherkinTableNodeBasedContentDimensionSourceFactory::initializeFromTableNode($contentDimensions); + // ensure that the current node types of exactly THE content repository are preserved + GherkinPyStringNodeBasedNodeTypeManagerFactory::setNodeTypeManager($contentRepository->getNodeTypeManager()); + GherkinTableNodeBasedContentDimensionSourceFactory::setContentDimensionSource( + GherkinTableNodeBasedContentDimensionSource::fromGherkinTableNode($contentDimensions) + ); $this->contentRepositories[$contentRepositoryId] = $this->createContentRepository(ContentRepositoryId::fromString($contentRepositoryId)); if ($this->currentContentRepository->id->value === $contentRepositoryId) { $this->currentContentRepository = $this->contentRepositories[$contentRepositoryId]; @@ -119,8 +125,9 @@ public function iChangeTheNodeTypesInContentRepositoryTo( throw new \DomainException('undeclared content repository ' . $contentRepositoryId); } else { $contentRepository = $this->contentRepositories[$contentRepositoryId]; - GherkinPyStringNodeBasedNodeTypeManagerFactory::initializeWithPyStringNode($serializedNodeTypesConfiguration); - GherkinTableNodeBasedContentDimensionSourceFactory::$contentDimensionsToUse = $contentRepository->getContentDimensionSource(); + // ensure that the current node types of exactly THE content repository are preserved + GherkinTableNodeBasedContentDimensionSourceFactory::setContentDimensionSource($contentRepository->getContentDimensionSource()); + GherkinPyStringNodeBasedNodeTypeManagerFactory::setConfiguration(Yaml::parse($serializedNodeTypesConfiguration->getRaw()) ?? []); $this->contentRepositories[$contentRepositoryId] = $this->createContentRepository(ContentRepositoryId::fromString($contentRepositoryId)); if ($this->currentContentRepository->id->value === $contentRepositoryId) { $this->currentContentRepository = $this->contentRepositories[$contentRepositoryId]; diff --git a/Neos.ContentRepository.TestSuite/Classes/Fakes/GherkinPyStringNodeBasedNodeTypeManagerFactory.php b/Neos.ContentRepository.TestSuite/Classes/Fakes/GherkinPyStringNodeBasedNodeTypeManagerFactory.php index bc1871eb9e..aa17332e15 100644 --- a/Neos.ContentRepository.TestSuite/Classes/Fakes/GherkinPyStringNodeBasedNodeTypeManagerFactory.php +++ b/Neos.ContentRepository.TestSuite/Classes/Fakes/GherkinPyStringNodeBasedNodeTypeManagerFactory.php @@ -14,39 +14,42 @@ namespace Neos\ContentRepository\TestSuite\Fakes; -use Behat\Gherkin\Node\PyStringNode; use Neos\ContentRepository\Core\NodeType\NodeTypeManager; use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; use Neos\ContentRepositoryRegistry\Factory\NodeTypeManager\NodeTypeManagerFactoryInterface; -use Symfony\Component\Yaml\Yaml; /** * Factory for node type managers from gherkin py strings */ final class GherkinPyStringNodeBasedNodeTypeManagerFactory implements NodeTypeManagerFactoryInterface { - public static ?NodeTypeManager $nodeTypesToUse = null; + private static ?NodeTypeManager $nodeTypeManager = null; /** * @param array $options */ public function build(ContentRepositoryId $contentRepositoryId, array $options): NodeTypeManager { - if (!self::$nodeTypesToUse) { - throw new \DomainException('NodeTypeManagerFactory uninitialized'); + if (!self::$nodeTypeManager) { + throw new \RuntimeException('NodeTypeManagerFactory uninitialized'); } - return self::$nodeTypesToUse; + return self::$nodeTypeManager; } - public static function initializeWithPyStringNode(PyStringNode $nodeTypesToUse): void + public static function setConfiguration(array $nodeTypesToUse): void { - self::$nodeTypesToUse = new NodeTypeManager( - fn (): array => Yaml::parse($nodeTypesToUse->getRaw()) ?? [] + self::$nodeTypeManager = new NodeTypeManager( + fn (): array => $nodeTypesToUse ); } + public static function setNodeTypeManager(NodeTypeManager $nodeTypeManager): void + { + self::$nodeTypeManager = $nodeTypeManager; + } + public static function reset(): void { - self::$nodeTypesToUse = null; + self::$nodeTypeManager = null; } } diff --git a/Neos.ContentRepository.TestSuite/Classes/Fakes/GherkinTableNodeBasedContentDimensionSource.php b/Neos.ContentRepository.TestSuite/Classes/Fakes/GherkinTableNodeBasedContentDimensionSource.php index 4329ebc509..7c949db0fa 100644 --- a/Neos.ContentRepository.TestSuite/Classes/Fakes/GherkinTableNodeBasedContentDimensionSource.php +++ b/Neos.ContentRepository.TestSuite/Classes/Fakes/GherkinTableNodeBasedContentDimensionSource.php @@ -28,12 +28,11 @@ /** * The node creation trait for behavioral tests - * todo colocate with GherkinTableNodeBasedContentDimensionSourceFactory */ final readonly class GherkinTableNodeBasedContentDimensionSource implements ContentDimensionSourceInterface { + /** @param array $contentDimensions */ private function __construct( - /** @var array */ private array $contentDimensions ) { } diff --git a/Neos.ContentRepository.TestSuite/Classes/Fakes/GherkinTableNodeBasedContentDimensionSourceFactory.php b/Neos.ContentRepository.TestSuite/Classes/Fakes/GherkinTableNodeBasedContentDimensionSourceFactory.php index 16c24140be..ea7cbc1a28 100644 --- a/Neos.ContentRepository.TestSuite/Classes/Fakes/GherkinTableNodeBasedContentDimensionSourceFactory.php +++ b/Neos.ContentRepository.TestSuite/Classes/Fakes/GherkinTableNodeBasedContentDimensionSourceFactory.php @@ -4,33 +4,52 @@ namespace Neos\ContentRepository\TestSuite\Fakes; -use Behat\Gherkin\Node\TableNode; +use Neos\ContentRepository\Core\Dimension\ContentDimension; +use Neos\ContentRepository\Core\Dimension\ContentDimensionId; use Neos\ContentRepository\Core\Dimension\ContentDimensionSourceInterface; use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; use Neos\ContentRepositoryRegistry\Factory\ContentDimensionSource\ContentDimensionSourceFactoryInterface; class GherkinTableNodeBasedContentDimensionSourceFactory implements ContentDimensionSourceFactoryInterface { - public static ?ContentDimensionSourceInterface $contentDimensionsToUse = null; + private static ?ContentDimensionSourceInterface $contentDimensionSource = null; /** * @param array $options */ public function build(ContentRepositoryId $contentRepositoryId, array $options): ContentDimensionSourceInterface { - if (!self::$contentDimensionsToUse) { - throw new \DomainException('Content dimension source not initialized.'); + if (!self::$contentDimensionSource) { + throw new \RuntimeException('Content dimension source not initialized.'); } - return self::$contentDimensionsToUse; + return self::$contentDimensionSource; } - public static function initializeFromTableNode(TableNode $contentDimensionsToUse): void + public static function setContentDimensionSource(ContentDimensionSourceInterface $contentDimensionSource): void { - self::$contentDimensionsToUse = GherkinTableNodeBasedContentDimensionSource::fromGherkinTableNode($contentDimensionsToUse); + self::$contentDimensionSource = $contentDimensionSource; + } + + /** + * Configures a zero-dimensional content repository + */ + public static function setWithoutDimensions(): void + { + self::$contentDimensionSource = new class implements ContentDimensionSourceInterface + { + public function getDimension(ContentDimensionId $dimensionId): ?ContentDimension + { + return null; + } + public function getContentDimensionsOrderedByPriority(): array + { + return []; + } + }; } public static function reset(): void { - self::$contentDimensionsToUse = null; + self::$contentDimensionSource = null; } }