Skip to content

Commit

Permalink
TASK: Handle TableNotFoundException gracefully in `subscriptionStat…
Browse files Browse the repository at this point in the history
…uses`
  • Loading branch information
mhsdesign committed Nov 23, 2024
1 parent 794eaf2 commit 7852f61
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -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')
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ private function __construct(
$this->statuses = $statuses;
}

public static function createEmpty(): self
{
return new self();
}

/**
* @param array<SubscriptionAndProjectionStatus> $statuses
*/
Expand Down

0 comments on commit 7852f61

Please sign in to comment.