diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php index ff6753384431e..0be091c22cf34 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php @@ -39,7 +39,7 @@ public function convert(array $payload): AbstractMailerEvent 'unsubscribe' => MailerEngagementEvent::UNSUBSCRIBE, 'open' => MailerEngagementEvent::OPEN, 'spamreport' => MailerEngagementEvent::SPAM, - default => throw new ParseException(sprintf('Unsupported event "%s".', $payload['unsubscribe'])), + default => throw new ParseException(sprintf('Unsupported event "%s".', $payload['event'])), }; $event = new MailerEngagementEvent($name, $payload['sg_message_id'], $payload); } diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/RemoteEvent/SendgridPayloadConverterTest.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/RemoteEvent/SendgridPayloadConverterTest.php new file mode 100644 index 0000000000000..1d02b5c8a42bc --- /dev/null +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/RemoteEvent/SendgridPayloadConverterTest.php @@ -0,0 +1,100 @@ +convert([ + 'event' => $event, + 'sg_message_id' => '123456', + 'reason' => 'reason', + 'timestamp' => '123456789', + 'email' => 'test@example.com', + ]); + + $this->assertInstanceOf(MailerDeliveryEvent::class, $event); + $this->assertSame($expectedEventName, $event->getName()); + $this->assertSame('123456', $event->getId()); + $this->assertSame('reason', $event->getReason()); + $this->assertSame('test@example.com', $event->getRecipientEmail()); + } + + public static function provideDeliveryEvents(): iterable + { + yield ['processed', MailerDeliveryEvent::DELIVERED]; + yield ['delivered', MailerDeliveryEvent::DELIVERED]; + yield ['bounce', MailerDeliveryEvent::BOUNCE]; + yield ['dropped', MailerDeliveryEvent::DROPPED]; + yield ['deferred', MailerDeliveryEvent::DEFERRED]; + } + + /** + * @dataProvider provideEngagementEvents + */ + public function testMailEngagementEvent(string $event, string $expectedEventName) + { + $converter = new SendgridPayloadConverter(); + + $event = $converter->convert([ + 'event' => $event, + 'sg_message_id' => '123456', + 'timestamp' => '123456789', + 'email' => 'test@example.com', + ]); + + $this->assertInstanceOf(MailerEngagementEvent::class, $event); + $this->assertSame($expectedEventName, $event->getName()); + $this->assertSame('123456', $event->getId()); + } + + public static function provideEngagementEvents(): iterable + { + yield ['click', MailerEngagementEvent::CLICK]; + yield ['unsubscribe', MailerEngagementEvent::UNSUBSCRIBE]; + yield ['open', MailerEngagementEvent::OPEN]; + yield ['spamreport', MailerEngagementEvent::SPAM]; + } + + public function testUnsupportedEvent() + { + $converter = new SendgridPayloadConverter(); + + $this->expectException(ParseException::class); + $this->expectExceptionMessage('Unsupported event "unsupported".'); + + $converter->convert([ + 'event' => 'unsupported', + 'sg_message_id' => '123456', + 'timestamp' => '123456789', + 'email' => 'test@example.com', + ]); + } + + public function testInvalidDate() + { + $converter = new SendgridPayloadConverter(); + + $this->expectException(ParseException::class); + $this->expectExceptionMessage('Invalid date "invalid".'); + + $converter->convert([ + 'event' => 'processed', + 'sg_message_id' => '123456', + 'timestamp' => 'invalid', + 'email' => 'test@example.com', + ]); + } +}