diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Functional/Subscription/SubscriptionGetStatusTest.php b/Neos.ContentRepository.BehavioralTests/Tests/Functional/Subscription/SubscriptionGetStatusTest.php index 72e355d622..84cc079a45 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Functional/Subscription/SubscriptionGetStatusTest.php +++ b/Neos.ContentRepository.BehavioralTests/Tests/Functional/Subscription/SubscriptionGetStatusTest.php @@ -5,12 +5,6 @@ namespace Neos\ContentRepository\BehavioralTests\Tests\Functional\Subscription; use Doctrine\DBAL\Connection; -use Neos\ContentRepository\Core\Projection\ProjectionStatus; -use Neos\ContentRepository\Core\Subscription\SubscriptionAndProjectionStatus; -use Neos\ContentRepository\Core\Subscription\SubscriptionAndProjectionStatuses; -use Neos\ContentRepository\Core\Subscription\SubscriptionId; -use Neos\ContentRepository\Core\Subscription\SubscriptionStatus; -use Neos\EventStore\Model\Event\SequenceNumber; final class SubscriptionGetStatusTest extends AbstractSubscriptionEngineTestCase { @@ -24,34 +18,19 @@ public function statusOnEmptyDatabase() keepSchema: false ); - $this->fakeProjection->expects(self::once())->method('status')->willReturn(ProjectionStatus::setupRequired('fake needs setup.')); + $this->fakeProjection->expects(self::never())->method('status'); $actualStatuses = $this->subscriptionService->subscriptionEngine->subscriptionStatuses(); + self::assertTrue($actualStatuses->isEmpty()); - $expected = SubscriptionAndProjectionStatuses::fromArray([ - SubscriptionAndProjectionStatus::create( - subscriptionId: SubscriptionId::fromString('contentGraph'), - subscriptionStatus: SubscriptionStatus::NEW, - subscriptionPosition: SequenceNumber::none(), - subscriptionError: null, - projectionStatus: ProjectionStatus::setupRequired(''), - ), - SubscriptionAndProjectionStatus::create( - subscriptionId: SubscriptionId::fromString('Vendor.Package:FakeProjection'), - subscriptionStatus: SubscriptionStatus::NEW, - subscriptionPosition: SequenceNumber::none(), - subscriptionError: null, - projectionStatus: ProjectionStatus::setupRequired('fake needs setup.'), - ), - SubscriptionAndProjectionStatus::create( - subscriptionId: SubscriptionId::fromString('Vendor.Package:SecondFakeProjection'), - subscriptionStatus: SubscriptionStatus::NEW, - subscriptionPosition: SequenceNumber::none(), - subscriptionError: null, - projectionStatus: ProjectionStatus::ok(), - ), - ]); - - self::assertEquals($expected, $actualStatuses); + self::assertNull( + $this->subscriptionStatus('contentGraph') + ); + self::assertNull( + $this->subscriptionStatus('Vendor.Package:FakeProjection') + ); + self::assertNull( + $this->subscriptionStatus('Vendor.Package:SecondFakeProjection') + ); } } diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Functional/Subscription/SubscriptionNewStatusTest.php b/Neos.ContentRepository.BehavioralTests/Tests/Functional/Subscription/SubscriptionNewStatusTest.php index f428d76405..db27649e83 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Functional/Subscription/SubscriptionNewStatusTest.php +++ b/Neos.ContentRepository.BehavioralTests/Tests/Functional/Subscription/SubscriptionNewStatusTest.php @@ -8,7 +8,9 @@ use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; use Neos\ContentRepository\Core\Projection\ProjectionStatus; use Neos\ContentRepository\Core\Subscription\Engine\ProcessedResult; +use Neos\ContentRepository\Core\Subscription\Engine\SubscriptionEngineCriteria; use Neos\ContentRepository\Core\Subscription\SubscriptionAndProjectionStatus; +use Neos\ContentRepository\Core\Subscription\SubscriptionAndProjectionStatuses; use Neos\ContentRepository\Core\Subscription\SubscriptionId; use Neos\ContentRepository\Core\Subscription\SubscriptionStatus; use Neos\ContentRepository\TestSuite\Fakes\FakeProjectionFactory; @@ -93,4 +95,41 @@ public function newProjectionIsFoundConfigurationIsAdded() self::assertNull($result->errors); $this->expectOkayStatus('Vendor.Package:NewFakeProjection', SubscriptionStatus::ACTIVE, SequenceNumber::none()); } + + /** @test */ + public function newProjectionsAreFoundViaStatus() + { + // only setup content graph so that the other projections are NEW, but still found + $this->subscriptionEngine->setup(SubscriptionEngineCriteria::create([SubscriptionId::fromString('contentGraph')])); + + $this->fakeProjection->expects(self::once())->method('status')->willReturn(ProjectionStatus::setupRequired('fake needs setup.')); + + $actualStatuses = $this->subscriptionService->subscriptionEngine->subscriptionStatuses(); + + $expected = SubscriptionAndProjectionStatuses::fromArray([ + SubscriptionAndProjectionStatus::create( + subscriptionId: SubscriptionId::fromString('contentGraph'), + subscriptionStatus: SubscriptionStatus::BOOTING, + subscriptionPosition: SequenceNumber::none(), + subscriptionError: null, + projectionStatus: ProjectionStatus::ok(), + ), + SubscriptionAndProjectionStatus::create( + subscriptionId: SubscriptionId::fromString('Vendor.Package:FakeProjection'), + subscriptionStatus: SubscriptionStatus::NEW, + subscriptionPosition: SequenceNumber::none(), + subscriptionError: null, + projectionStatus: ProjectionStatus::setupRequired('fake needs setup.'), + ), + SubscriptionAndProjectionStatus::create( + subscriptionId: SubscriptionId::fromString('Vendor.Package:SecondFakeProjection'), + subscriptionStatus: SubscriptionStatus::NEW, + subscriptionPosition: SequenceNumber::none(), + subscriptionError: null, + projectionStatus: ProjectionStatus::setupRequired('Requires 1 SQL statements'), + ), + ]); + + self::assertEquals($expected, $actualStatuses); + } } diff --git a/Neos.ContentRepository.Core/Classes/Subscription/Engine/SubscriptionEngine.php b/Neos.ContentRepository.Core/Classes/Subscription/Engine/SubscriptionEngine.php index 5582056ab9..4614244f94 100644 --- a/Neos.ContentRepository.Core/Classes/Subscription/Engine/SubscriptionEngine.php +++ b/Neos.ContentRepository.Core/Classes/Subscription/Engine/SubscriptionEngine.php @@ -4,6 +4,7 @@ namespace Neos\ContentRepository\Core\Subscription\Engine; +use Doctrine\DBAL\Exception\TableNotFoundException; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\EventStore\EventNormalizer; use Neos\ContentRepository\Core\Subscription\Exception\CatchUpFailed; @@ -99,7 +100,13 @@ public function reset(SubscriptionEngineCriteria|null $criteria = null): Result public function subscriptionStatuses(SubscriptionCriteria|null $criteria = null): SubscriptionAndProjectionStatuses { $statuses = []; - foreach ($this->subscriptionStore->findByCriteria($criteria ?? SubscriptionCriteria::noConstraints()) as $subscription) { + try { + $subscriptions = $this->subscriptionStore->findByCriteria($criteria ?? SubscriptionCriteria::noConstraints()); + } catch (TableNotFoundException) { + // the schema is not setup - thus there are no subscribers + return SubscriptionAndProjectionStatuses::createEmpty(); + } + foreach ($subscriptions as $subscription) { $subscriber = $this->subscribers->contain($subscription->id) ? $this->subscribers->get($subscription->id) : null; $statuses[] = SubscriptionAndProjectionStatus::create( subscriptionId: $subscription->id, diff --git a/Neos.ContentRepository.Core/Classes/Subscription/SubscriptionAndProjectionStatuses.php b/Neos.ContentRepository.Core/Classes/Subscription/SubscriptionAndProjectionStatuses.php index 4fe2fb5e3b..47c237813b 100644 --- a/Neos.ContentRepository.Core/Classes/Subscription/SubscriptionAndProjectionStatuses.php +++ b/Neos.ContentRepository.Core/Classes/Subscription/SubscriptionAndProjectionStatuses.php @@ -21,6 +21,11 @@ private function __construct( $this->statuses = $statuses; } + public static function createEmpty(): self + { + return new self(); + } + /** * @param array $statuses */