Refactor notification event payloads and listener naming
This commit is contained in:
@@ -3,9 +3,9 @@
|
||||
namespace Tests\Feature\Notifications;
|
||||
|
||||
use App\Actions\Notifications\DeliverNotificationAction;
|
||||
use App\Actions\Notifications\TicketStatusChanged;
|
||||
use App\Actions\Notifications\TicketStatusChangedPayload;
|
||||
use App\Enums\NotificationDeliveryStatus;
|
||||
use App\Enums\NotificationEventType;
|
||||
use App\Models\NotificationAction;
|
||||
use App\Models\NotificationDeliveryLog;
|
||||
use Carbon\CarbonImmutable;
|
||||
@@ -35,7 +35,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
|
||||
(new DeliverNotificationAction(
|
||||
notificationActionId: $notificationAction->id,
|
||||
payload: $this->payload(),
|
||||
event: $this->event(),
|
||||
notificationDeliveryLogId: $deliveryLog->id,
|
||||
))->handle();
|
||||
|
||||
@@ -77,7 +77,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
|
||||
(new DeliverNotificationAction(
|
||||
notificationActionId: $notificationAction->id,
|
||||
payload: $this->payload(),
|
||||
event: $this->event(),
|
||||
notificationDeliveryLogId: $deliveryLog->id,
|
||||
))->handle();
|
||||
|
||||
@@ -162,7 +162,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
$deliveryLog = $this->createPendingDeliveryLog($notificationAction);
|
||||
$job = (new DeliverNotificationAction(
|
||||
notificationActionId: $notificationAction->id,
|
||||
payload: $this->payload(),
|
||||
event: $this->event(),
|
||||
notificationDeliveryLogId: $deliveryLog->id,
|
||||
))->withFakeQueueInteractions();
|
||||
|
||||
@@ -200,7 +200,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
$deliveryLog = $this->createPendingDeliveryLog($notificationAction);
|
||||
$job = (new DeliverNotificationAction(
|
||||
notificationActionId: $notificationAction->id,
|
||||
payload: $this->payload(),
|
||||
event: $this->event(),
|
||||
notificationDeliveryLogId: $deliveryLog->id,
|
||||
))->withFakeQueueInteractions();
|
||||
|
||||
@@ -237,7 +237,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
$deliveryLog = $this->createPendingDeliveryLog($notificationAction);
|
||||
$job = (new DeliverNotificationAction(
|
||||
notificationActionId: $notificationAction->id,
|
||||
payload: $this->payload(),
|
||||
event: $this->event(),
|
||||
notificationDeliveryLogId: $deliveryLog->id,
|
||||
))->withFakeQueueInteractions();
|
||||
|
||||
@@ -274,7 +274,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
$deliveryLog = $this->createPendingDeliveryLog($notificationAction);
|
||||
$job = (new DeliverNotificationAction(
|
||||
notificationActionId: $notificationAction->id,
|
||||
payload: $this->payload(),
|
||||
event: $this->event(),
|
||||
notificationDeliveryLogId: $deliveryLog->id,
|
||||
))->withFakeQueueInteractions();
|
||||
|
||||
@@ -310,7 +310,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
$deliveryLog = $this->createPendingDeliveryLog($notificationAction);
|
||||
$job = (new DeliverNotificationAction(
|
||||
notificationActionId: $notificationAction->id,
|
||||
payload: $this->payload(),
|
||||
event: $this->event(),
|
||||
notificationDeliveryLogId: $deliveryLog->id,
|
||||
))->withFakeQueueInteractions();
|
||||
|
||||
@@ -349,7 +349,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
$deliveryLog = $this->createPendingDeliveryLog($notificationAction);
|
||||
$job = (new DeliverNotificationAction(
|
||||
notificationActionId: $notificationAction->id,
|
||||
payload: $this->payload(),
|
||||
event: $this->event(),
|
||||
notificationDeliveryLogId: $deliveryLog->id,
|
||||
))->withFakeQueueInteractions();
|
||||
|
||||
@@ -385,7 +385,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
$deliveryLog = $this->createPendingDeliveryLog($notificationAction);
|
||||
$job = (new DeliverNotificationAction(
|
||||
notificationActionId: $notificationAction->id,
|
||||
payload: $this->payload(),
|
||||
event: $this->event(),
|
||||
notificationDeliveryLogId: $deliveryLog->id,
|
||||
))->withFakeQueueInteractions();
|
||||
|
||||
@@ -413,7 +413,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
$deliveryLog = $this->createPendingDeliveryLog($notificationAction);
|
||||
$job = (new DeliverNotificationAction(
|
||||
notificationActionId: $notificationAction->id,
|
||||
payload: $this->payload(actorName: null),
|
||||
event: $this->event(actorName: null),
|
||||
notificationDeliveryLogId: $deliveryLog->id,
|
||||
))->withFakeQueueInteractions();
|
||||
|
||||
@@ -445,7 +445,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
$deliveryLog = $this->createPendingDeliveryLog($notificationAction);
|
||||
$job = (new DeliverNotificationAction(
|
||||
notificationActionId: $notificationAction->id,
|
||||
payload: $this->payload(ticketTitle: str_repeat('A', 2001)),
|
||||
event: $this->event(ticketTitle: str_repeat('A', 2001)),
|
||||
notificationDeliveryLogId: $deliveryLog->id,
|
||||
))->withFakeQueueInteractions();
|
||||
|
||||
@@ -482,7 +482,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
$deliveryLog = $this->createPendingDeliveryLog($notificationAction);
|
||||
$job = (new DeliverNotificationAction(
|
||||
notificationActionId: $notificationAction->id,
|
||||
payload: $this->payload(),
|
||||
event: $this->event(),
|
||||
notificationDeliveryLogId: $deliveryLog->id,
|
||||
))->withFakeQueueInteractions();
|
||||
|
||||
@@ -508,7 +508,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
{
|
||||
$job = new DeliverNotificationAction(
|
||||
notificationActionId: 1,
|
||||
payload: $this->payload(),
|
||||
event: $this->event(),
|
||||
notificationDeliveryLogId: 1,
|
||||
);
|
||||
|
||||
@@ -530,12 +530,11 @@ class DeliverNotificationActionTest extends TestCase
|
||||
]);
|
||||
}
|
||||
|
||||
private function payload(
|
||||
private function event(
|
||||
?string $actorName = 'Erica Example',
|
||||
string $ticketTitle = 'Fix webhook delivery',
|
||||
): TicketStatusChangedPayload {
|
||||
return new TicketStatusChangedPayload(
|
||||
eventType: NotificationEventType::TicketStatusChanged,
|
||||
): TicketStatusChanged {
|
||||
return new TicketStatusChanged(new TicketStatusChangedPayload(
|
||||
projectId: 10,
|
||||
projectKey: 'CORE',
|
||||
projectName: 'Core Platform',
|
||||
@@ -550,7 +549,7 @@ class DeliverNotificationActionTest extends TestCase
|
||||
toStatusId: 2,
|
||||
toStatusLabel: 'Doing',
|
||||
occurredAt: CarbonImmutable::parse('2026-04-24T09:15:30+00:00'),
|
||||
);
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
namespace Tests\Feature\Notifications;
|
||||
|
||||
use App\Actions\Notifications\RenderDiscordMessageTemplate;
|
||||
use App\Actions\Notifications\TicketStatusChanged;
|
||||
use App\Actions\Notifications\TicketStatusChangedPayload;
|
||||
use App\Enums\NotificationEventType;
|
||||
use Carbon\CarbonImmutable;
|
||||
use PHPUnit\Framework\Attributes\DataProvider;
|
||||
use Tests\TestCase;
|
||||
@@ -54,7 +54,7 @@ class RenderDiscordMessageTemplateTest extends TestCase
|
||||
#[DataProvider('supportedVariableProvider')]
|
||||
public function test_it_replaces_supported_template_variables(string $template, string $expected): void
|
||||
{
|
||||
$renderedMessage = app(RenderDiscordMessageTemplate::class)->handle($template, $this->payload());
|
||||
$renderedMessage = app(RenderDiscordMessageTemplate::class)->handle($template, $this->event());
|
||||
|
||||
$this->assertSame($expected, $renderedMessage);
|
||||
}
|
||||
@@ -66,16 +66,15 @@ class RenderDiscordMessageTemplateTest extends TestCase
|
||||
{
|
||||
$renderedMessage = app(RenderDiscordMessageTemplate::class)->handle(
|
||||
'[$ticket_key] $unknown moved to $status_to',
|
||||
$this->payload(),
|
||||
$this->event(),
|
||||
);
|
||||
|
||||
$this->assertSame('[CORE-42] $unknown moved to Doing', $renderedMessage);
|
||||
}
|
||||
|
||||
private function payload(): TicketStatusChangedPayload
|
||||
private function event(): TicketStatusChanged
|
||||
{
|
||||
return new TicketStatusChangedPayload(
|
||||
eventType: NotificationEventType::TicketStatusChanged,
|
||||
return new TicketStatusChanged(new TicketStatusChangedPayload(
|
||||
projectId: 10,
|
||||
projectKey: 'CORE',
|
||||
projectName: 'Core Platform',
|
||||
@@ -90,6 +89,6 @@ class RenderDiscordMessageTemplateTest extends TestCase
|
||||
toStatusId: 2,
|
||||
toStatusLabel: 'Doing',
|
||||
occurredAt: CarbonImmutable::parse('2026-04-24T09:15:30+00:00'),
|
||||
);
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,24 +103,24 @@ class TicketCreatedNotificationDispatchTest extends TestCase
|
||||
Queue::assertPushed(DeliverNotificationAction::class, 2);
|
||||
Queue::assertPushed(DeliverNotificationAction::class, function (DeliverNotificationAction $job) use ($webhookAction, $project, $ticket, $user, $backlogStatus): bool {
|
||||
return $job->notificationActionId === $webhookAction->id
|
||||
&& $job->payload->projectId === $project->id
|
||||
&& $job->payload->projectKey === 'CORE'
|
||||
&& $job->payload->projectName === 'Core Platform'
|
||||
&& $job->payload->ticketId === $ticket->id
|
||||
&& $job->payload->ticketKey === $ticket->ticket_key
|
||||
&& $job->payload->ticketTitle === 'Trigger ticket created notification'
|
||||
&& $job->payload->ticketUrl === route('projects.tickets.show', [$project, $ticket])
|
||||
&& $job->payload->actorId === $user->id
|
||||
&& $job->payload->actorName === 'Erica Example'
|
||||
&& $job->payload->fromStatusId === null
|
||||
&& $job->payload->fromStatusLabel === null
|
||||
&& $job->payload->toStatusId === $backlogStatus->id
|
||||
&& $job->payload->toStatusLabel === 'Backlog'
|
||||
&& $job->payload->eventType === NotificationEventType::TicketCreate
|
||||
&& $job->event->payload()->projectId === $project->id
|
||||
&& $job->event->payload()->projectKey === 'CORE'
|
||||
&& $job->event->payload()->projectName === 'Core Platform'
|
||||
&& $job->event->payload()->ticketId === $ticket->id
|
||||
&& $job->event->payload()->ticketKey === $ticket->ticket_key
|
||||
&& $job->event->payload()->ticketTitle === 'Trigger ticket created notification'
|
||||
&& $job->event->payload()->ticketUrl === route('projects.tickets.show', [$project, $ticket])
|
||||
&& $job->event->payload()->actorId === $user->id
|
||||
&& $job->event->payload()->actorName === 'Erica Example'
|
||||
&& $job->event->payload()->fromStatusId === null
|
||||
&& $job->event->payload()->fromStatusLabel === null
|
||||
&& $job->event->payload()->toStatusId === $backlogStatus->id
|
||||
&& $job->event->payload()->toStatusLabel === 'Backlog'
|
||||
&& $job->event->payload()->eventType() === NotificationEventType::TicketCreate
|
||||
&& $job->notificationDeliveryLogId !== null;
|
||||
});
|
||||
Queue::assertPushed(DeliverNotificationAction::class, fn (DeliverNotificationAction $job): bool => $job->notificationActionId === $discordAction->id
|
||||
&& $job->payload->eventType === NotificationEventType::TicketCreate
|
||||
&& $job->event->payload()->eventType() === NotificationEventType::TicketCreate
|
||||
&& $job->notificationDeliveryLogId !== null);
|
||||
Queue::assertNotPushed(DeliverNotificationAction::class, fn (DeliverNotificationAction $job): bool => $job->notificationActionId === $disabledAction->id);
|
||||
Queue::assertNotPushed(DeliverNotificationAction::class, fn (DeliverNotificationAction $job): bool => $job->notificationActionId === $statusChangedAction->id);
|
||||
|
||||
@@ -104,20 +104,20 @@ class TicketStatusChangedNotificationDispatchTest extends TestCase
|
||||
Queue::assertPushed(DeliverNotificationAction::class, 2);
|
||||
Queue::assertPushed(DeliverNotificationAction::class, function (DeliverNotificationAction $job) use ($webhookAction, $project, $ticket, $user, $backlogStatus, $doingStatus): bool {
|
||||
return $job->notificationActionId === $webhookAction->id
|
||||
&& $job->payload->projectId === $project->id
|
||||
&& $job->payload->projectKey === 'CORE'
|
||||
&& $job->payload->projectName === 'Core Platform'
|
||||
&& $job->payload->ticketId === $ticket->id
|
||||
&& $job->payload->ticketKey === 'CORE-1'
|
||||
&& $job->payload->ticketTitle === 'Fix webhook dispatch'
|
||||
&& $job->payload->ticketUrl === route('projects.tickets.show', [$project, $ticket])
|
||||
&& $job->payload->actorId === $user->id
|
||||
&& $job->payload->actorName === 'Erica Example'
|
||||
&& $job->payload->fromStatusId === $backlogStatus->id
|
||||
&& $job->payload->fromStatusLabel === 'Backlog'
|
||||
&& $job->payload->toStatusId === $doingStatus->id
|
||||
&& $job->payload->toStatusLabel === 'Doing'
|
||||
&& $job->payload->eventType === NotificationEventType::TicketStatusChanged
|
||||
&& $job->event->payload()->projectId === $project->id
|
||||
&& $job->event->payload()->projectKey === 'CORE'
|
||||
&& $job->event->payload()->projectName === 'Core Platform'
|
||||
&& $job->event->payload()->ticketId === $ticket->id
|
||||
&& $job->event->payload()->ticketKey === 'CORE-1'
|
||||
&& $job->event->payload()->ticketTitle === 'Fix webhook dispatch'
|
||||
&& $job->event->payload()->ticketUrl === route('projects.tickets.show', [$project, $ticket])
|
||||
&& $job->event->payload()->actorId === $user->id
|
||||
&& $job->event->payload()->actorName === 'Erica Example'
|
||||
&& $job->event->payload()->fromStatusId === $backlogStatus->id
|
||||
&& $job->event->payload()->fromStatusLabel === 'Backlog'
|
||||
&& $job->event->payload()->toStatusId === $doingStatus->id
|
||||
&& $job->event->payload()->toStatusLabel === 'Doing'
|
||||
&& $job->event->payload()->eventType() === NotificationEventType::TicketStatusChanged
|
||||
&& $job->notificationDeliveryLogId !== null;
|
||||
});
|
||||
Queue::assertPushed(DeliverNotificationAction::class, fn (DeliverNotificationAction $job): bool => $job->notificationActionId === $discordAction->id
|
||||
|
||||
Reference in New Issue
Block a user