From 53f836e685b4ee92da0e02a02e31bb7286267749 Mon Sep 17 00:00:00 2001 From: Fabien Villepinte Date: Tue, 12 Oct 2021 10:34:47 +0000 Subject: [PATCH] [Notifier] Fix 'Undefined array key' error in FirebaseTransport --- .../Bridge/Firebase/FirebaseTransport.php | 12 ++++--- .../Firebase/Tests/FirebaseTransportTest.php | 35 +++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Component/Notifier/Bridge/Firebase/FirebaseTransport.php b/src/Symfony/Component/Notifier/Bridge/Firebase/FirebaseTransport.php index 526ad5eb6ac85..70cce2b680c3c 100644 --- a/src/Symfony/Component/Notifier/Bridge/Firebase/FirebaseTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Firebase/FirebaseTransport.php @@ -83,15 +83,17 @@ protected function doSend(MessageInterface $message): SentMessage $contentType = $response->getHeaders(false)['content-type'][0] ?? ''; $jsonContents = 0 === strpos($contentType, 'application/json') ? $response->toArray(false) : null; + $errorMessage = null; - if (200 !== $statusCode) { - $errorMessage = $jsonContents ? $jsonContents['results']['error'] : $response->getContent(false); + if ($jsonContents && isset($jsonContents['results'][0]['error'])) { + $errorMessage = $jsonContents['results'][0]['error']; + } elseif (200 !== $statusCode) { + $errorMessage = $response->getContent(false); + } + if (null !== $errorMessage) { throw new TransportException('Unable to post the Firebase message: '.$errorMessage, $response); } - if ($jsonContents && isset($jsonContents['results'][0]['error'])) { - throw new TransportException('Unable to post the Firebase message: '.$jsonContents['results'][0]['error'], $response); - } $success = $response->toArray(false); diff --git a/src/Symfony/Component/Notifier/Bridge/Firebase/Tests/FirebaseTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Firebase/Tests/FirebaseTransportTest.php index 7a28b4f32f5df..5f8d52aa6440a 100644 --- a/src/Symfony/Component/Notifier/Bridge/Firebase/Tests/FirebaseTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Firebase/Tests/FirebaseTransportTest.php @@ -11,13 +11,18 @@ namespace Symfony\Component\Notifier\Bridge\Firebase\Tests; +use Symfony\Component\HttpClient\MockHttpClient; +use Symfony\Component\HttpClient\Response\MockResponse; +use Symfony\Component\Notifier\Bridge\Firebase\FirebaseOptions; use Symfony\Component\Notifier\Bridge\Firebase\FirebaseTransport; +use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Test\TransportTestCase; use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; +use Symfony\Contracts\HttpClient\ResponseInterface; /** * @author Oskar Stark @@ -47,4 +52,34 @@ public function unsupportedMessagesProvider(): iterable yield [new SmsMessage('0611223344', 'Hello!')]; yield [$this->createMock(MessageInterface::class)]; } + + /** + * @dataProvider sendWithErrorThrowsExceptionProvider + */ + public function testSendWithErrorThrowsTransportException(ResponseInterface $response) + { + $this->expectException(TransportException::class); + + $client = new MockHttpClient(static function () use ($response): ResponseInterface { + return $response; + }); + $options = new class('recipient-id', []) extends FirebaseOptions {}; + + $transport = $this->createTransport($client); + + $transport->send(new ChatMessage('Hello!', $options)); + } + + public function sendWithErrorThrowsExceptionProvider(): iterable + { + yield [new MockResponse( + json_encode(['results' => [['error' => 'testErrorCode']]]), + ['response_headers' => ['content-type' => ['application/json']], 'http_code' => 200] + )]; + + yield [new MockResponse( + json_encode(['results' => [['error' => 'testErrorCode']]]), + ['response_headers' => ['content-type' => ['application/json']], 'http_code' => 400] + )]; + } }