Skip to content

Commit 108a2dd

Browse files
authored
FEATURE: Improve subscription error message (#8)
Resolves: #7
1 parent 8e437e4 commit 108a2dd

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

src/Subscription/SubscriptionError.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,23 @@ public function __construct(
2020

2121
public static function fromPreviousStatusAndException(SubscriptionStatus $previousStatus, Throwable $error): self
2222
{
23-
return new self($error->getMessage(), $previousStatus, $error->getTraceAsString());
23+
$message = self::getExceptionOutput($error);
24+
$previous = $error->getPrevious();
25+
while ($previous !== null) {
26+
$message .= "\n\nCaused by\n" . self::getExceptionOutput($previous);
27+
$previous = $previous->getPrevious();
28+
}
29+
return new self($message, $previousStatus, $error->getTraceAsString());
30+
}
31+
32+
private static function getExceptionOutput(Throwable $exception): string
33+
{
34+
return sprintf(
35+
'%s: %s in file %s on line %d',
36+
get_class($exception),
37+
$exception->getMessage(),
38+
$exception->getFile(),
39+
$exception->getLine()
40+
);
2441
}
2542
}

tests/PHPUnit/Engine/SubscriptionEngineTest.php

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use PHPUnit\Framework\TestCase;
99
use Wwwision\SubscriptionEngine\Engine\EngineEvent\EngineEvent;
1010
use Wwwision\SubscriptionEngine\Engine\EngineEvent\NoSubscriptionsFound;
11+
use Wwwision\SubscriptionEngine\Engine\Exception\RecursiveCatchUpException;
1112
use Wwwision\SubscriptionEngine\Engine\SubscriptionEngineCriteria;
1213
use Wwwision\SubscriptionEngine\Store\SubscriptionCriteria;
1314
use Wwwision\SubscriptionEngine\Subscriber\Subscriber;
@@ -88,7 +89,7 @@ public function setup(): void
8889
$result = $this->subscriptionEngine($subscriber)->setup();
8990

9091
$this->assertSubscriptions(
91-
['id' => 's1', 'status' => 'ERROR', 'position' => 0, 'error' => 'Just testing'],
92+
['id' => 's1', 'status' => 'ERROR', 'position' => 0, 'error' => 'Error: Just testing in file ' . __FILE__ . ' on line ' . (__LINE__ - 7)],
9293
);
9394

9495
$this->assertEmittedEngineEvents(
@@ -288,9 +289,11 @@ public function test_catchUpActive_invokes_handlers_of_active_subscriptions(): v
288289
public function test_catchUpActive_with_failed_subscribers(): void
289290
{
290291
$handler1Invocations = 0;
291-
$subscriber1 = Subscriber::create(SubscriptionId::fromString('s1'), function () use (&$handler1Invocations) {
292+
$handler1ExceptionLineNumber = 0;
293+
$subscriber1 = Subscriber::create(SubscriptionId::fromString('s1'), function () use (&$handler1Invocations, &$handler1ExceptionLineNumber) {
292294
$handler1Invocations++;
293295
if ($handler1Invocations > 1) {
296+
$handler1ExceptionLineNumber = __LINE__ + 1;
294297
throw new \RuntimeException('Exception from s1');
295298
}
296299
});
@@ -317,7 +320,7 @@ public function test_catchUpActive_with_failed_subscribers(): void
317320
$result = $subscriptionEngine->catchUpActive();
318321

319322
$this->assertSubscriptions(
320-
['id' => 's1', 'status' => 'ERROR', 'position' => 1, 'error' => 'Exception from s1'],
323+
['id' => 's1', 'status' => 'ERROR', 'position' => 1, 'error' => 'RuntimeException: Exception from s1 in file ' . __FILE__ . ' on line ' . $handler1ExceptionLineNumber],
321324
['id' => 's2', 'status' => 'ACTIVE', 'position' => 2, 'error' => null],
322325
['id' => 's3', 'status' => 'BOOTING', 'position' => 0, 'error' => null],
323326
);
@@ -347,7 +350,7 @@ public function test_catchUpActive_fails_if_called_recursively_without_criteria(
347350
$this->eventStore->append('event at #1');
348351
$result = $subscriptionEngine->catchUpActive();
349352
$this->assertSubscriptions(
350-
['id' => 's1', 'status' => 'ERROR', 'position' => 0, 'error' => 'Failed to catch up all subscriptions while catch up of subscription "s1" is still running'],
353+
['id' => 's1', 'status' => 'ERROR', 'position' => 0, 'error' => RecursiveCatchUpException::class . ': Failed to catch up all subscriptions while catch up of subscription "s1" is still running in file ' . realpath(__DIR__ . '/../../../src/Engine/Exception/RecursiveCatchUpException.php') . ' on line 23'],
351354
);
352355
$this->assertEmittedEngineEvents(
353356
'CatchUpInitiated: Initiated catch-up of subscriptions in states ACTIVE',
@@ -379,7 +382,7 @@ public function test_catchUpActive_fails_if_called_recursively_with_overlapping_
379382
$this->eventStore->append('event at #1');
380383
$result = $subscriptionEngine->catchUpActive(SubscriptionEngineCriteria::create(ids: ['s3', 's1']));
381384
$this->assertSubscriptions(
382-
['id' => 's1', 'status' => 'ERROR', 'position' => 0, 'error' => 'Failed to catch up subscription "s3" while catch up of subscriptions "s1", "s3" is still running'],
385+
['id' => 's1', 'status' => 'ERROR', 'position' => 0, 'error' => RecursiveCatchUpException::class . ': Failed to catch up subscription "s3" while catch up of subscriptions "s1", "s3" is still running in file ' . realpath(__DIR__ . '/../../../src/Engine/Exception/RecursiveCatchUpException.php') . ' on line 23'],
383386
['id' => 's2', 'status' => 'ACTIVE', 'position' => 0, 'error' => null],
384387
['id' => 's3', 'status' => 'ACTIVE', 'position' => 1, 'error' => null],
385388
);
@@ -397,8 +400,8 @@ public function test_catchUpActive_fails_if_called_recursively_with_overlapping_
397400
$this->eventStore->append('event at #2');
398401
$result = $subscriptionEngine->catchUpActive(SubscriptionEngineCriteria::create(ids: ['s3', 's2']));
399402
$this->assertSubscriptions(
400-
['id' => 's1', 'status' => 'ERROR', 'position' => 0, 'error' => 'Failed to catch up subscription "s3" while catch up of subscriptions "s1", "s3" is still running'],
401-
['id' => 's2', 'status' => 'ERROR', 'position' => 0, 'error' => 'Failed to catch up subscription "s3" while catch up of subscriptions "s2", "s3" is still running'],
403+
['id' => 's1', 'status' => 'ERROR', 'position' => 0, 'error' => RecursiveCatchUpException::class . ': Failed to catch up subscription "s3" while catch up of subscriptions "s1", "s3" is still running in file ' . realpath(__DIR__ . '/../../../src/Engine/Exception/RecursiveCatchUpException.php') . ' on line 23'],
404+
['id' => 's2', 'status' => 'ERROR', 'position' => 0, 'error' => RecursiveCatchUpException::class . ': Failed to catch up subscription "s3" while catch up of subscriptions "s2", "s3" is still running in file ' . realpath(__DIR__ . '/../../../src/Engine/Exception/RecursiveCatchUpException.php') . ' on line 23'],
402405
['id' => 's3', 'status' => 'ACTIVE', 'position' => 2, 'error' => null],
403406
);
404407
$this->assertEmittedEngineEvents(

0 commit comments

Comments
 (0)