diff --git a/.github/workflows/php-tests.yml b/.github/workflows/php-tests.yml index cbc048e2..be315f2a 100644 --- a/.github/workflows/php-tests.yml +++ b/.github/workflows/php-tests.yml @@ -25,8 +25,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-versions }} - extensions: uopz - tools: phpunit:9.5.x + extensions: uopz,mbstring - name: Setup problem matchers for PHP run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" @@ -45,7 +44,7 @@ jobs: chmod 000 server_certificates_bundle_unreadable.pem - name: Run PHPUnit - run: phpunit -c phpunit.xml + run: ./vendor/bin/phpunit -c phpunit.xml sample_push: runs-on: ubuntu-latest diff --git a/ApnsPHP/Message/Tests/CustomMessageGetPayloadDictionaryTest.php b/ApnsPHP/Message/Tests/CustomMessageGetPayloadDictionaryTest.php index c20f13a3..332ca93c 100644 --- a/ApnsPHP/Message/Tests/CustomMessageGetPayloadDictionaryTest.php +++ b/ApnsPHP/Message/Tests/CustomMessageGetPayloadDictionaryTest.php @@ -15,7 +15,7 @@ * * @covers \ApnsPHP\Message\CustomMessage */ -class CustomMessageGetPayloadDictionaryTest extends CustomMessageTest +class CustomMessageGetPayloadDictionaryTest extends CustomMessageTestBase { /** * Test that getPayloadDictionary returns complete payload with body if locKey isn't set @@ -60,7 +60,7 @@ public function testGetPayloadDictionaryReturnsCompletePayloadWithoutLocKey(): v 'name' => 'value' ]; - $result = $this->get_accessible_reflection_method('getPayloadDictionary')->invoke($this->class); + $result = $this->get_reflection_method('getPayloadDictionary')->invoke($this->class); $this->assertEquals($payload, $result); } @@ -109,7 +109,7 @@ public function testGetPayloadDictionaryReturnsCompletePayloadWithoutBody(): voi 'name' => 'value' ]; - $result = $this->get_accessible_reflection_method('getPayloadDictionary')->invoke($this->class); + $result = $this->get_reflection_method('getPayloadDictionary')->invoke($this->class); $this->assertEquals($payload, $result); } @@ -123,7 +123,7 @@ public function testGetPayloadDictionaryReturnsEmptyPayload(): void { $payload = [ 'aps' => [ 'alert' => [] ] ]; - $result = $this->get_accessible_reflection_method('getPayloadDictionary')->invoke($this->class); + $result = $this->get_reflection_method('getPayloadDictionary')->invoke($this->class); $this->assertEquals($payload, $result); } diff --git a/ApnsPHP/Message/Tests/CustomMessageGetTest.php b/ApnsPHP/Message/Tests/CustomMessageGetTest.php index 1dc17809..d7b11146 100644 --- a/ApnsPHP/Message/Tests/CustomMessageGetTest.php +++ b/ApnsPHP/Message/Tests/CustomMessageGetTest.php @@ -14,7 +14,7 @@ * * @covers \ApnsPHP\Message\CustomMessage */ -class CustomMessageGetTest extends CustomMessageTest +class CustomMessageGetTest extends CustomMessageTestBase { /** * Test that getActionLocKey() gets the view button title. diff --git a/ApnsPHP/Message/Tests/CustomMessageTest.php b/ApnsPHP/Message/Tests/CustomMessageTestBase.php similarity index 74% rename from ApnsPHP/Message/Tests/CustomMessageTest.php rename to ApnsPHP/Message/Tests/CustomMessageTestBase.php index bcbe8485..55528bce 100644 --- a/ApnsPHP/Message/Tests/CustomMessageTest.php +++ b/ApnsPHP/Message/Tests/CustomMessageTestBase.php @@ -20,15 +20,22 @@ * * @covers \ApnsPHP\Message\CustomMessage */ -abstract class CustomMessageTest extends LunrBaseTest +abstract class CustomMessageTestBase extends LunrBaseTest { + + /** + * Class to test + * @var CustomMessage + */ + protected CustomMessage $class; + /** * TestCase constructor */ public function setUp(): void { - $this->reflection = new ReflectionClass('ApnsPHP\Message\CustomMessage'); - $this->class = new CustomMessage(); + $this->class = new CustomMessage(); + $this->baseSetUp($this->class); } /** @@ -36,7 +43,7 @@ public function setUp(): void */ public function tearDown(): void { + parent::tearDown(); unset($this->class); - unset($this->reflection); } } diff --git a/ApnsPHP/Message/Tests/SafariMessageGetPayloadDictionaryTest.php b/ApnsPHP/Message/Tests/SafariMessageGetPayloadDictionaryTest.php index 424deb0b..69abae83 100644 --- a/ApnsPHP/Message/Tests/SafariMessageGetPayloadDictionaryTest.php +++ b/ApnsPHP/Message/Tests/SafariMessageGetPayloadDictionaryTest.php @@ -15,7 +15,7 @@ * * @covers \ApnsPHP\Message\SafariMessage */ -class SafariMessageGetPayloadDictionaryTest extends SafariMessageTest +class SafariMessageGetPayloadDictionaryTest extends SafariMessageTestBase { /** * Test that getPayloadDictionary returns complete payload @@ -40,7 +40,7 @@ public function testGetPayloadDictionaryReturnsCompletePayload(): void ] ]; - $result = $this->get_accessible_reflection_method('getPayloadDictionary')->invoke($this->class); + $result = $this->get_reflection_method('getPayloadDictionary')->invoke($this->class); $this->assertEquals($payload, $result); } @@ -54,7 +54,7 @@ public function testGetPayloadDictionaryReturnsEmptyPayload(): void { $payload = [ 'aps' => [ 'alert' => [] ] ]; - $result = $this->get_accessible_reflection_method('getPayloadDictionary')->invoke($this->class); + $result = $this->get_reflection_method('getPayloadDictionary')->invoke($this->class); $this->assertEquals($payload, $result); } diff --git a/ApnsPHP/Message/Tests/SafariMessageGetTest.php b/ApnsPHP/Message/Tests/SafariMessageGetTest.php index 4c00d132..0d8ef30b 100644 --- a/ApnsPHP/Message/Tests/SafariMessageGetTest.php +++ b/ApnsPHP/Message/Tests/SafariMessageGetTest.php @@ -14,7 +14,7 @@ * * @covers \ApnsPHP\Message\SafariMessage */ -class SafariMessageGetTest extends SafariMessageTest +class SafariMessageGetTest extends SafariMessageTestBase { /** * Test that getAction() gets the label of the action button. diff --git a/ApnsPHP/Message/Tests/SafariMessageTest.php b/ApnsPHP/Message/Tests/SafariMessageTestBase.php similarity index 78% rename from ApnsPHP/Message/Tests/SafariMessageTest.php rename to ApnsPHP/Message/Tests/SafariMessageTestBase.php index 7c5f7e8c..6531d6aa 100644 --- a/ApnsPHP/Message/Tests/SafariMessageTest.php +++ b/ApnsPHP/Message/Tests/SafariMessageTestBase.php @@ -20,15 +20,22 @@ * * @covers \ApnsPHP\Message\SafariMessage */ -abstract class SafariMessageTest extends LunrBaseTest +abstract class SafariMessageTestBase extends LunrBaseTest { + + /** + * Class to test + * @var SafariMessage + */ + protected SafariMessage $class; + /** * TestCase constructor */ public function setUp(): void { - $this->reflection = new ReflectionClass('ApnsPHP\Message\SafariMessage'); $this->class = new SafariMessage(); + $this->baseSetUp($this->class); } /** @@ -36,7 +43,7 @@ public function setUp(): void */ public function tearDown(): void { + parent::tearDown(); unset($this->class); - unset($this->reflection); } } diff --git a/ApnsPHP/Tests/MessageAddRecipientTest.php b/ApnsPHP/Tests/MessageAddRecipientTest.php index 922502a4..646d3457 100644 --- a/ApnsPHP/Tests/MessageAddRecipientTest.php +++ b/ApnsPHP/Tests/MessageAddRecipientTest.php @@ -15,7 +15,7 @@ * * @covers \ApnsPHP\Message */ -class MessageAddRecipientTest extends MessageTest +class MessageAddRecipientTest extends MessageTestBase { /** * Test that addRecipient throws exception on invalid token diff --git a/ApnsPHP/Tests/MessageGetPayloadDictionaryTest.php b/ApnsPHP/Tests/MessageGetPayloadDictionaryTest.php index c73f8cf4..1a651f90 100644 --- a/ApnsPHP/Tests/MessageGetPayloadDictionaryTest.php +++ b/ApnsPHP/Tests/MessageGetPayloadDictionaryTest.php @@ -15,7 +15,7 @@ * * @covers \ApnsPHP\Message */ -class MessageGetPayloadDictionaryTest extends MessageTest +class MessageGetPayloadDictionaryTest extends MessageTestBase { /** * Test that getPayloadDictionary returns complete payload @@ -52,7 +52,7 @@ public function testGetPayloadDictionaryReturnsCompletePayload(): void 'name' => 'value' ]; - $result = $this->get_accessible_reflection_method('getPayloadDictionary')->invoke($this->class); + $result = $this->get_reflection_method('getPayloadDictionary')->invoke($this->class); $this->assertEquals($payload, $result); } @@ -88,7 +88,7 @@ public function testGetPayloadDictionaryWithoutTitle(): void 'name' => 'value' ]; - $result = $this->get_accessible_reflection_method('getPayloadDictionary')->invoke($this->class); + $result = $this->get_reflection_method('getPayloadDictionary')->invoke($this->class); $this->assertEquals($payload, $result); } @@ -102,7 +102,7 @@ public function testGetPayloadDictionaryReturnsEmptyPayload(): void { $payload = [ 'aps' => [] ]; - $result = $this->get_accessible_reflection_method('getPayloadDictionary')->invoke($this->class); + $result = $this->get_reflection_method('getPayloadDictionary')->invoke($this->class); $this->assertEquals($payload, $result); } diff --git a/ApnsPHP/Tests/MessageGetPayloadTest.php b/ApnsPHP/Tests/MessageGetPayloadTest.php index 1252ec4e..76e453d2 100644 --- a/ApnsPHP/Tests/MessageGetPayloadTest.php +++ b/ApnsPHP/Tests/MessageGetPayloadTest.php @@ -15,7 +15,7 @@ * * @covers \ApnsPHP\Message */ -class MessageGetPayloadTest extends MessageTest +class MessageGetPayloadTest extends MessageTestBase { /** * Test that getPayload() returns complete JSON encoded payload @@ -161,7 +161,7 @@ public function testCastToStringReturnsEmptyStringOnTooLongPayloadWithoutAutoAdj * * @return string String of certain size in bytes */ - private function getLargeString($size): string + private function getLargeString(int $size): string { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $length = strlen($characters); diff --git a/ApnsPHP/Tests/MessageGetTest.php b/ApnsPHP/Tests/MessageGetTest.php index 5a3f0fd6..202b5ade 100644 --- a/ApnsPHP/Tests/MessageGetTest.php +++ b/ApnsPHP/Tests/MessageGetTest.php @@ -17,7 +17,7 @@ * * @covers \ApnsPHP\Message */ -class MessageGetTest extends MessageTest +class MessageGetTest extends MessageTestBase { /** * Test that getText() gets the message text. diff --git a/ApnsPHP/Tests/MessageSelfForRecipientTest.php b/ApnsPHP/Tests/MessageSelfForRecipientTest.php index 8c971d47..5ef15865 100644 --- a/ApnsPHP/Tests/MessageSelfForRecipientTest.php +++ b/ApnsPHP/Tests/MessageSelfForRecipientTest.php @@ -17,14 +17,14 @@ * * @covers \ApnsPHP\Message */ -class MessageSelfForRecipientTest extends MessageTest +class MessageSelfForRecipientTest extends MessageTestBase { /** * Test that selfForRecipient throws exception on invalid index * * @covers \ApnsPHP\Message::selfForRecipient */ - public function testselfForRecipientThrowsExceptionOnInvalidIndex(): void + public function testSelfForRecipientThrowsExceptionOnInvalidIndex(): void { $this->expectException('ApnsPHP\Exception'); $this->expectExceptionMessage('No recipient at index \'1\''); @@ -37,7 +37,7 @@ public function testselfForRecipientThrowsExceptionOnInvalidIndex(): void * * @covers \ApnsPHP\Message::selfForRecipient */ - public function testselfForRecipientGetsMessage(): void + public function testSelfForRecipientGetsMessage(): void { $token = '1e82db91c7ceddd72bf33d74ae052ac9c84a065b35148ac401388843106a7485'; $message = new Message($token); diff --git a/ApnsPHP/Tests/MessageSetTest.php b/ApnsPHP/Tests/MessageSetTest.php index 61f7b193..daad3b0d 100644 --- a/ApnsPHP/Tests/MessageSetTest.php +++ b/ApnsPHP/Tests/MessageSetTest.php @@ -17,14 +17,14 @@ * * @covers \ApnsPHP\Message */ -class MessageSetTest extends MessageTest +class MessageSetTest extends MessageTestBase { /** * Unit test data provider for reserved apple namespace keys. * * @return array Variations of the reserved apple namespace key */ - public function reservedAppleNamespaceKeyProvider(): array + public static function reservedAppleNamespaceKeyProvider(): array { $data = []; $data[] = [ 'aps' ]; @@ -40,7 +40,7 @@ public function reservedAppleNamespaceKeyProvider(): array * * @return array Variations of valid custom identifiers */ - public function validCustomIdentifierProvider(): array + public static function validCustomIdentifierProvider(): array { $data = []; $data[] = [ '3491ac4b-0681-4c92-8308-d8d8441f4e64' ]; @@ -54,7 +54,7 @@ public function validCustomIdentifierProvider(): array * * @return array Variations of a valid message priority */ - public function validPriorityProvider(): array + public static function validPriorityProvider(): array { $data = []; $data[] = [ Priority::PrioritizePowerUsage ]; @@ -69,7 +69,7 @@ public function validPriorityProvider(): array * * @return array Variations of a valid push type */ - public function validPushTypeProvider(): array + public static function validPushTypeProvider(): array { $data = []; $data[] = [ PushType::Alert ]; diff --git a/ApnsPHP/Tests/MessageTest.php b/ApnsPHP/Tests/MessageTestBase.php similarity index 75% rename from ApnsPHP/Tests/MessageTest.php rename to ApnsPHP/Tests/MessageTestBase.php index 6798b011..44b9f757 100644 --- a/ApnsPHP/Tests/MessageTest.php +++ b/ApnsPHP/Tests/MessageTestBase.php @@ -21,15 +21,22 @@ * * @covers \ApnsPHP\Message */ -abstract class MessageTest extends LunrBaseTest +abstract class MessageTestBase extends LunrBaseTest { + + /** + * Class to test + * @var Message + */ + protected Message $class; + /** * TestCase constructor */ public function setUp(): void { - $this->reflection = new ReflectionClass('ApnsPHP\Message'); - $this->class = new Message(); + $this->class = new Message(); + $this->baseSetUp($this->class); } /** @@ -37,7 +44,7 @@ public function setUp(): void */ public function tearDown(): void { + parent::tearDown(); unset($this->class); - unset($this->reflection); } } diff --git a/ApnsPHP/Tests/PushAddTest.php b/ApnsPHP/Tests/PushAddTest.php index 0c3cb6f9..1a0d434f 100644 --- a/ApnsPHP/Tests/PushAddTest.php +++ b/ApnsPHP/Tests/PushAddTest.php @@ -15,7 +15,7 @@ * * @covers \ApnsPHP\Push */ -class PushAddTest extends PushTest +class PushAddTest extends PushTestBase { /** * Test that add() successfully adds one message @@ -26,20 +26,20 @@ public function testAddOneMessage(): void { $this->message->expects($this->once()) ->method('getPayLoad') - ->will($this->returnValue('payload')); + ->willReturn('payload'); $this->message->expects($this->once()) ->method('getRecipientsNumber') - ->will($this->returnValue(1)); + ->willReturn(1); $this->message->expects($this->once()) ->method('selfForRecipient') ->with(0) - ->will($this->returnValue($this->message)); + ->willReturn($this->message); $this->class->add($this->message); - $queue = $this->get_accessible_reflection_property('messageQueue')->getValue($this->class); + $queue = $this->get_reflection_property('messageQueue')->getValue($this->class); $this->assertEquals($this->message, $queue[1]['MESSAGE']); } @@ -60,20 +60,20 @@ public function testAddMultipleMessages(): void $this->message->expects($this->once()) ->method('getPayLoad') - ->will($this->returnValue('payload')); + ->willReturn('payload'); $this->message->expects($this->once()) ->method('getRecipientsNumber') - ->will($this->returnValue(4)); + ->willReturn(4); $this->message->expects($this->exactly(4)) ->method('selfForRecipient') - ->withConsecutive([0], [1], [2], [3]) - ->will($this->returnValue($this->message)); + ->willReturnMap([[0], [1], [2], [3]]) + ->willReturn($this->message); $this->class->add($this->message); - $queue = $this->get_accessible_reflection_property('messageQueue')->getValue($this->class); + $queue = $this->get_reflection_property('messageQueue')->getValue($this->class); $this->assertEquals($messages, $queue); } @@ -87,15 +87,15 @@ public function testAddDoesNothing(): void { $this->message->expects($this->once()) ->method('getPayLoad') - ->will($this->returnValue('payload')); + ->willReturn('payload'); $this->message->expects($this->once()) ->method('getRecipientsNumber') - ->will($this->returnValue(0)); + ->willReturn(0); $this->class->add($this->message); - $queue = $this->get_accessible_reflection_property('messageQueue')->getValue($this->class); + $queue = $this->get_reflection_property('messageQueue')->getValue($this->class); $this->assertArrayEmpty($queue); } diff --git a/ApnsPHP/Tests/PushConnectTest.php b/ApnsPHP/Tests/PushConnectTest.php index 0645e974..1b8a6da9 100644 --- a/ApnsPHP/Tests/PushConnectTest.php +++ b/ApnsPHP/Tests/PushConnectTest.php @@ -19,7 +19,7 @@ * * @covers \ApnsPHP\Push */ -class PushConnectTest extends PushTest +class PushConnectTest extends PushTestBase { /** * Test that connect() connects successfully @@ -30,17 +30,15 @@ public function testConnectSuccess(): void { $this->set_reflection_property_value('logger', $this->logger); - $this->mock_function('curl_setopt_array', function () { - return true; - }); + $this->mock_function('curl_setopt_array', fn() => true); $this->logger->expects($this->exactly(3)) ->method('info') - ->withConsecutive( + ->willReturnMap([ [ 'Trying to initialize HTTP/2 backend...' ], [ 'Initializing HTTP/2 backend with certificate.' ], [ 'Initialized HTTP/2 backend.' ], - ); + ]); $this->class->connect(); @@ -57,12 +55,7 @@ public function testConnectThrowsExceptionOnHttpInitFail(): void $this->set_reflection_property_value('connectRetryInterval', 0); $this->set_reflection_property_value('logger', $this->logger); - $this->mock_function('curl_setopt_array', function () { - return false; - }); - - $message = [ - ]; + $this->mock_function('curl_setopt_array', fn() => false); $this->logger->expects($this->exactly(4)) ->method('error') @@ -70,7 +63,7 @@ public function testConnectThrowsExceptionOnHttpInitFail(): void $this->logger->expects($this->exactly(11)) ->method('info') - ->withConsecutive( + ->willReturnMap([ [ 'Trying to initialize HTTP/2 backend...' ], [ 'Initializing HTTP/2 backend with certificate.' ], [ 'Retry to connect (1/3)...' ], @@ -82,7 +75,7 @@ public function testConnectThrowsExceptionOnHttpInitFail(): void [ 'Retry to connect (3/3)...' ], [ 'Trying to initialize HTTP/2 backend...' ], [ 'Initializing HTTP/2 backend with certificate.' ], - ); + ]); $this->expectException('ApnsPHP\Exception'); $this->expectExceptionMessage('Unable to initialize HTTP/2 backend.'); diff --git a/ApnsPHP/Tests/PushDisconnectTest.php b/ApnsPHP/Tests/PushDisconnectTest.php index b9c6b119..3e6bb1c9 100644 --- a/ApnsPHP/Tests/PushDisconnectTest.php +++ b/ApnsPHP/Tests/PushDisconnectTest.php @@ -15,7 +15,7 @@ * * @covers \ApnsPHP\Push */ -class PushDisconnectTest extends PushTest +class PushDisconnectTest extends PushTestBase { /** * Test that disconnect() disconnects successfully diff --git a/ApnsPHP/Tests/PushGetTest.php b/ApnsPHP/Tests/PushGetTest.php index 06964dcb..643b47bf 100644 --- a/ApnsPHP/Tests/PushGetTest.php +++ b/ApnsPHP/Tests/PushGetTest.php @@ -14,7 +14,7 @@ * * @covers \ApnsPHP\Push */ -class PushGetTest extends PushTest +class PushGetTest extends PushTestBase { /** * Test that getSendRetryTimes() returns how often sends should be retried. diff --git a/ApnsPHP/Tests/PushHttpInitTest.php b/ApnsPHP/Tests/PushHttpInitTest.php index 9f87043c..c904a511 100644 --- a/ApnsPHP/Tests/PushHttpInitTest.php +++ b/ApnsPHP/Tests/PushHttpInitTest.php @@ -20,7 +20,7 @@ * * @covers \ApnsPHP\Push */ -class PushHttpInitTest extends PushTest +class PushHttpInitTest extends PushTestBase { /** * Test that httpInit() succeeds with certificate @@ -40,9 +40,9 @@ public function testHttpInitSucceedsWithCertificate(): void $this->logger->expects($this->exactly(3)) ->method('info') - ->withConsecutive(...$message); + ->willReturnMap($message); - $method = $this->get_accessible_reflection_method('httpInit'); + $method = $this->get_reflection_method('httpInit'); $result = $method->invoke($this->class); $this->assertTrue($result); @@ -75,16 +75,12 @@ public function testHttpInitSucceedsWithKey(): void $this->mock_method( [ 'Lcobucci\JWT\Signer\Key\InMemory', 'file' ], - function () use ($key) { - return $key; - } + fn() => $key ); $this->mock_method( [ 'Lcobucci\JWT\Configuration', 'builder' ], - function () use ($builder) { - return $builder; - } + fn() => $builder ); $builder->expects($this->once()) @@ -109,13 +105,13 @@ function () use ($builder) { $this->logger->expects($this->exactly(3)) ->method('info') - ->withConsecutive( + ->willReturnMap([ [ 'Trying to initialize HTTP/2 backend...' ], [ 'Initializing HTTP/2 backend with key.' ], [ 'Initialized HTTP/2 backend.' ] - ); + ]); - $method = $this->get_accessible_reflection_method('httpInit'); + $method = $this->get_reflection_method('httpInit'); $result = $method->invoke($this->class); $this->assertTrue($result); @@ -136,9 +132,7 @@ public function testHttpInitThrowsExceptionOnCurlSetoptFail(): void $this->set_reflection_property_value('providerKeyId', 'TheKey'); $this->set_reflection_property_value('logger', $this->logger); - $this->mock_function('curl_setopt_array', function () { - return false; - }); + $this->mock_function('curl_setopt_array', fn() => false); $key = $this->getMockBuilder('Lcobucci\JWT\Signer\Key') ->disableOriginalConstructor() @@ -155,16 +149,12 @@ public function testHttpInitThrowsExceptionOnCurlSetoptFail(): void $this->mock_method( [ 'Lcobucci\JWT\Signer\Key\InMemory', 'file' ], - function () use ($key) { - return $key; - } + fn() => $key ); $this->mock_method( [ 'Lcobucci\JWT\Configuration', 'builder' ], - function () use ($builder) { - return $builder; - } + fn() => $builder ); $builder->expects($this->once()) @@ -189,15 +179,15 @@ function () use ($builder) { $this->logger->expects($this->exactly(2)) ->method('info') - ->withConsecutive( + ->willReturnMap([ [ 'Trying to initialize HTTP/2 backend...' ], [ 'Initializing HTTP/2 backend with key.' ], - ); + ]); $this->expectException('ApnsPHP\Exception'); $this->expectExceptionMessage('Unable to initialize HTTP/2 backend.'); - $method = $this->get_accessible_reflection_method('httpInit'); + $method = $this->get_reflection_method('httpInit'); # phpstan doesn't detect the potential throw through ReflectionMethod. # Verified that by making the method public and calling it directly diff --git a/ApnsPHP/Tests/PushHttpSendTest.php b/ApnsPHP/Tests/PushHttpSendTest.php index e46f84fc..618d76bf 100644 --- a/ApnsPHP/Tests/PushHttpSendTest.php +++ b/ApnsPHP/Tests/PushHttpSendTest.php @@ -19,7 +19,7 @@ * * @covers \ApnsPHP\Push */ -class PushHttpSendTest extends PushTest +class PushHttpSendTest extends PushTestBase { /** * Helper function to set the http headers and verify calls to message getters @@ -29,11 +29,11 @@ private function setHttpHeaders(): void { $this->message->expects($this->exactly(2)) ->method('getTopic') - ->will($this->returnValue('topic')); + ->willReturn('topic'); $this->message->expects($this->exactly(2)) ->method('getExpiry') - ->will($this->returnValue(10)); + ->willReturn(10); $this->message->expects($this->exactly(2)) ->method('getPriority') @@ -41,15 +41,15 @@ private function setHttpHeaders(): void $this->message->expects($this->exactly(2)) ->method('getCollapseId') - ->will($this->returnValue('1')); + ->willReturn('1'); $this->message->expects($this->exactly(2)) ->method('getCustomIdentifier') - ->will($this->returnValue('7530A828-E58E-433E-A38F-D8042208CF96')); + ->willReturn('7530A828-E58E-433E-A38F-D8042208CF96'); $this->message->expects($this->exactly(2)) ->method('getPushType') - ->will($this->returnValue(PushType::Alert)); + ->willReturn(PushType::Alert); $this->set_reflection_property_value('providerToken', 'jwt'); } @@ -61,9 +61,7 @@ private function setHttpHeaders(): void */ public function testHttpSendReturnsFalseOnCurlSessionFail(): void { - $this->mock_function('curl_exec', function () { - return false; - }); + $this->mock_function('curl_exec', fn() => false); $this->set_reflection_property_value('environment', Environment::Sandbox); $this->set_reflection_property_value('hSocket', curl_init()); @@ -72,15 +70,15 @@ public function testHttpSendReturnsFalseOnCurlSessionFail(): void $this->message->expects($this->once()) ->method('getRecipient') - ->will($this->returnValue('recipient')); + ->willReturn('recipient'); $this->message->expects($this->once()) ->method('getPayload') - ->will($this->returnValue('payload')); + ->willReturn('payload'); $reply = 'reply'; - $method = $this->get_accessible_reflection_method('httpSend'); + $method = $this->get_reflection_method('httpSend'); $result = $method->invokeArgs($this->class, [ $this->message, &$reply ]); $this->assertFalse($result); @@ -95,21 +93,14 @@ public function testHttpSendReturnsFalseOnCurlSessionFail(): void */ public function testHttpSendReturnsFalseOnCurlOptsCannotBeSet(): void { - $this->mock_function('curl_setopt_array', function () { - return false; - }); + $this->mock_function('curl_setopt_array', fn() => false); - $this->mock_function('curl_exec', function () { - return true; - }); + $this->mock_function('curl_exec', fn() => true); - $this->mock_function('curl_errno', function () { - return 56; - }); + $this->mock_function('curl_errno', fn() => 56); - $this->mock_function('curl_error', function () { - return 'OpenSSL SSL_read: error:14094415:SSL routines:ssl3_read_bytes:sslv3 alert certificate expired'; - }); + $message = 'OpenSSL SSL_read: error:14094415:SSL routines:ssl3_read_bytes:sslv3 alert certificate expired'; + $this->mock_function('curl_error', fn() => $message); $this->set_reflection_property_value('environment', Environment::Sandbox); @@ -117,15 +108,15 @@ public function testHttpSendReturnsFalseOnCurlOptsCannotBeSet(): void $this->message->expects($this->once()) ->method('getRecipient') - ->will($this->returnValue('recipient')); + ->willReturn('recipient'); $this->message->expects($this->once()) ->method('getPayload') - ->will($this->returnValue('payload')); + ->willReturn('payload'); $reply = 'reply'; - $method = $this->get_accessible_reflection_method('httpSend'); + $method = $this->get_reflection_method('httpSend'); $result = $method->invokeArgs($this->class, [ $this->message, &$reply ]); $this->assertFalse($result); @@ -141,17 +132,11 @@ public function testHttpSendReturnsFalseOnCurlOptsCannotBeSet(): void */ public function testHttpSendReturnsFalseOnRequestFail(): void { - $this->mock_function('curl_setopt_array', function () { - return true; - }); + $this->mock_function('curl_setopt_array', fn() => true); - $this->mock_function('curl_exec', function () { - return true; - }); + $this->mock_function('curl_exec', fn() => true); - $this->mock_function('curl_getinfo', function () { - return 500; - }); + $this->mock_function('curl_getinfo', fn() => 500); $this->set_reflection_property_value('environment', Environment::Sandbox); @@ -159,15 +144,15 @@ public function testHttpSendReturnsFalseOnRequestFail(): void $this->message->expects($this->once()) ->method('getRecipient') - ->will($this->returnValue('recipient')); + ->willReturn('recipient'); $this->message->expects($this->once()) ->method('getPayload') - ->will($this->returnValue('payload')); + ->willReturn('payload'); $reply = 'reply'; - $method = $this->get_accessible_reflection_method('httpSend'); + $method = $this->get_reflection_method('httpSend'); $result = $method->invokeArgs($this->class, [ $this->message, &$reply ]); $this->assertFalse($result); @@ -184,17 +169,11 @@ public function testHttpSendReturnsFalseOnRequestFail(): void */ public function testHttpSendReturnsTrueOnSuccess(): void { - $this->mock_function('curl_setopt_array', function () { - return true; - }); + $this->mock_function('curl_setopt_array', fn() => true); - $this->mock_function('curl_exec', function () { - return true; - }); + $this->mock_function('curl_exec', fn() => true); - $this->mock_function('curl_getinfo', function () { - return 200; - }); + $this->mock_function('curl_getinfo', fn() => 200); $this->set_reflection_property_value('environment', Environment::Sandbox); @@ -202,15 +181,15 @@ public function testHttpSendReturnsTrueOnSuccess(): void $this->message->expects($this->once()) ->method('getRecipient') - ->will($this->returnValue('recipient')); + ->willReturn('recipient'); $this->message->expects($this->once()) ->method('getPayload') - ->will($this->returnValue('payload')); + ->willReturn('payload'); $reply = 'reply'; - $method = $this->get_accessible_reflection_method('httpSend'); + $method = $this->get_reflection_method('httpSend'); $result = $method->invokeArgs($this->class, [ $this->message, &$reply ]); $this->assertTrue($result); diff --git a/ApnsPHP/Tests/PushInvalidTest.php b/ApnsPHP/Tests/PushInvalidTest.php index 140bc870..2d66fd3f 100644 --- a/ApnsPHP/Tests/PushInvalidTest.php +++ b/ApnsPHP/Tests/PushInvalidTest.php @@ -17,7 +17,7 @@ * * @covers \ApnsPHP\Push */ -class PushInvalidTest extends PushTest +class PushInvalidTest extends PushTestBase { /** * TestCase constructor diff --git a/ApnsPHP/Tests/PushRemoveMessageFromQueueTest.php b/ApnsPHP/Tests/PushRemoveMessageFromQueueTest.php index e91e7a62..d6f75aea 100644 --- a/ApnsPHP/Tests/PushRemoveMessageFromQueueTest.php +++ b/ApnsPHP/Tests/PushRemoveMessageFromQueueTest.php @@ -15,7 +15,7 @@ * * @covers \ApnsPHP\Push */ -class PushRemoveMessageFromQueueTest extends PushTest +class PushRemoveMessageFromQueueTest extends PushTestBase { /** * Test that removeMessageFromQueue() throws an exception if the message id is not valid @@ -27,7 +27,7 @@ public function testRemoveMessageFromQueueThrowsExceptionOnInvalidMessageID(): v $this->expectException('ApnsPHP\Push\Exception'); $this->expectExceptionMessage('Message ID format is not valid.'); - $method = $this->get_accessible_reflection_method('removeMessageFromQueue'); + $method = $this->get_reflection_method('removeMessageFromQueue'); $method->invokeArgs($this->class, [ 0 ]); } @@ -41,7 +41,7 @@ public function testRemoveMessageFromQueueThrowsExceptionOnMissingMessageID(): v $this->expectException('ApnsPHP\Push\Exception'); $this->expectExceptionMessage('The Message ID 1 does not exists.'); - $method = $this->get_accessible_reflection_method('removeMessageFromQueue'); + $method = $this->get_reflection_method('removeMessageFromQueue'); $method->invokeArgs($this->class, [ 1 ]); } @@ -59,11 +59,11 @@ public function testRemoveMessageFromQueueRemovesMessageFromQueue(): void $this->set_reflection_property_value('messageQueue', $queue); - $method = $this->get_accessible_reflection_method('removeMessageFromQueue'); + $method = $this->get_reflection_method('removeMessageFromQueue'); $method->invokeArgs($this->class, [ 1 ]); - $errors = $this->get_accessible_reflection_property('errors')->getValue($this->class); - $messageQueue = $this->get_accessible_reflection_property('messageQueue')->getValue($this->class); + $errors = $this->get_reflection_property('errors')->getValue($this->class); + $messageQueue = $this->get_reflection_property('messageQueue')->getValue($this->class); $this->assertArrayEmpty($errors); $this->assertEquals([ 2 => $queue[2] ], $messageQueue); @@ -83,11 +83,11 @@ public function testRemoveMessageFromQueueRemovesMessageFromQueueAndAddsError(): $this->set_reflection_property_value('messageQueue', $queue); - $method = $this->get_accessible_reflection_method('removeMessageFromQueue'); + $method = $this->get_reflection_method('removeMessageFromQueue'); $method->invokeArgs($this->class, [ 1, true ]); - $errors = $this->get_accessible_reflection_property('errors')->getValue($this->class); - $messageQueue = $this->get_accessible_reflection_property('messageQueue')->getValue($this->class); + $errors = $this->get_reflection_property('errors')->getValue($this->class); + $messageQueue = $this->get_reflection_property('messageQueue')->getValue($this->class); $this->assertEquals([ 1 => $queue[1] ], $errors); $this->assertEquals([ 2 => $queue[2] ], $messageQueue); diff --git a/ApnsPHP/Tests/PushSendTest.php b/ApnsPHP/Tests/PushSendTest.php index 261a4ea6..db9d9163 100644 --- a/ApnsPHP/Tests/PushSendTest.php +++ b/ApnsPHP/Tests/PushSendTest.php @@ -18,7 +18,7 @@ * * @covers \ApnsPHP\Push */ -class PushSendTest extends PushTest +class PushSendTest extends PushTestBase { /** * Test that send() throws an exception if there is no connection to the push notification service @@ -55,24 +55,12 @@ public function testSendThrowsExceptionOnEmptyQueue(): void */ public function testSendFailsWithoutRetrying(): void { - $this->mock_function('curl_exec', function () { - return false; - }); - $this->mock_function('curl_setopt_array', function () { - return true; - }); - $this->mock_function('curl_getinfo', function () { - return 404; - }); - $this->mock_function('curl_close', function () { - return null; - }); - $this->mock_function('curl_errno', function () { - return 0; - }); - $this->mock_function('curl_error', function () { - return ''; - }); + $this->mock_function('curl_exec', fn() => false); + $this->mock_function('curl_setopt_array', fn() => true); + $this->mock_function('curl_getinfo', fn() => 404); + $this->mock_function('curl_close', fn() => null); + $this->mock_function('curl_errno', fn() => 0); + $this->mock_function('curl_error', fn() => ''); $error = [ 'command' => 8, @@ -91,14 +79,14 @@ public function testSendFailsWithoutRetrying(): void $this->logger->expects($this->exactly(6)) ->method('info') - ->withConsecutive( + ->willReturnMap([ [ 'Sending messages queue, run #1: 1 message(s) left in queue.' ], [ 'Disconnected.' ], [ 'Trying to initialize HTTP/2 backend...' ], [ 'Initializing HTTP/2 backend with certificate.' ], [ 'Initialized HTTP/2 backend.' ], [ 'Sending messages queue, run #2: 1 message(s) left in queue.' ], - ); + ]); $this->logger->expects($this->once()) ->method('debug') @@ -124,18 +112,10 @@ public function testSendFailsWithoutRetrying(): void */ public function testSendFailsWithRetrying(): void { - $this->mock_function('curl_exec', function () { - return false; - }); - $this->mock_function('curl_setopt_array', function () { - return true; - }); - $this->mock_function('curl_getinfo', function () { - return 429; - }); - $this->mock_function('curl_close', function () { - return null; - }); + $this->mock_function('curl_exec', fn() => false); + $this->mock_function('curl_setopt_array', fn() => true); + $this->mock_function('curl_getinfo', fn() => 429); + $this->mock_function('curl_close', fn() => null); $message = [ 1 => [ 'MESSAGE' => $this->message, 'ERRORS' => [] ] ]; @@ -147,7 +127,7 @@ public function testSendFailsWithRetrying(): void $this->logger->expects($this->exactly(16)) ->method('info') - ->withConsecutive( + ->willReturnMap([ [ 'Sending messages queue, run #1: 1 message(s) left in queue.' ], [ 'Disconnected.' ], [ 'Trying to initialize HTTP/2 backend...' ], @@ -164,15 +144,15 @@ public function testSendFailsWithRetrying(): void [ 'Initializing HTTP/2 backend with certificate.' ], [ 'Initialized HTTP/2 backend.' ], [ 'Sending messages queue, run #4: 1 message(s) left in queue.' ], - ); + ]); $this->logger->expects($this->exactly(3)) ->method('debug') - ->withConsecutive( + ->willReturnMap([ [ 'Sending message ID 1 [custom identifier: unset] (1/3): 0 bytes.' ], [ 'Sending message ID 1 [custom identifier: unset] (2/3): 0 bytes.' ], [ 'Sending message ID 1 [custom identifier: unset] (3/3): 0 bytes.' ], - ); + ]); $this->logger->expects($this->once()) ->method('warning') @@ -193,24 +173,12 @@ public function testSendFailsWithRetrying(): void */ public function testSendRemovesWhenNoError(): void { - $this->mock_function('curl_exec', function () { - return false; - }); - $this->mock_function('curl_setopt_array', function () { - return true; - }); - $this->mock_function('curl_getinfo', function () { - return 200; - }); - $this->mock_function('curl_close', function () { - return null; - }); - $this->mock_function('curl_errno', function () { - return 0; - }); - $this->mock_function('curl_error', function () { - return ''; - }); + $this->mock_function('curl_exec', fn() => false); + $this->mock_function('curl_setopt_array', fn() => true); + $this->mock_function('curl_getinfo', fn() => 200); + $this->mock_function('curl_close', fn() => null); + $this->mock_function('curl_errno', fn() => 0); + $this->mock_function('curl_error', fn() => ''); $message = [ 1 => [ 'MESSAGE' => $this->message, 'ERRORS' => [] ] ]; @@ -222,7 +190,7 @@ public function testSendRemovesWhenNoError(): void $this->logger->expects($this->exactly(7)) ->method('info') - ->withConsecutive( + ->willReturnMap([ [ 'Sending messages queue, run #1: 1 message(s) left in queue.' ], [ 'Disconnected.' ], [ 'Trying to initialize HTTP/2 backend...' ], @@ -231,7 +199,7 @@ public function testSendRemovesWhenNoError(): void [ 'Sending messages queue, run #2: 1 message(s) left in queue.' ], [ 'Message ID 1 [custom identifier: unset] has no error (200), removing from queue...'], - ); + ]); $this->logger->expects($this->once()) ->method('debug') @@ -255,18 +223,10 @@ public function testSendRemovesWhenNoError(): void */ public function testSendSuccessfullySends(): void { - $this->mock_function('curl_exec', function () { - return true; - }); - $this->mock_function('curl_setopt_array', function () { - return true; - }); - $this->mock_function('curl_getinfo', function () { - return 200; - }); - $this->mock_function('curl_close', function () { - return null; - }); + $this->mock_function('curl_exec', fn() => true); + $this->mock_function('curl_setopt_array', fn() => true); + $this->mock_function('curl_getinfo', fn() => 200); + $this->mock_function('curl_close', fn() => null); $message = [ 1 => [ 'MESSAGE' => $this->message, 'ERRORS' => [] ] ]; diff --git a/ApnsPHP/Tests/PushSetTest.php b/ApnsPHP/Tests/PushSetTest.php index 1946f3e6..f6660102 100644 --- a/ApnsPHP/Tests/PushSetTest.php +++ b/ApnsPHP/Tests/PushSetTest.php @@ -14,7 +14,7 @@ * * @covers \ApnsPHP\Push */ -class PushSetTest extends PushTest +class PushSetTest extends PushTestBase { /** * Test that setSendRetryTimes() sets how often sends should be retried. diff --git a/ApnsPHP/Tests/PushTest.php b/ApnsPHP/Tests/PushTestBase.php similarity index 90% rename from ApnsPHP/Tests/PushTest.php rename to ApnsPHP/Tests/PushTestBase.php index a371cce3..c79f363b 100644 --- a/ApnsPHP/Tests/PushTest.php +++ b/ApnsPHP/Tests/PushTestBase.php @@ -1,7 +1,7 @@ logger, ); - $this->reflection = new ReflectionClass('ApnsPHP\Push'); + $this->baseSetUp($this->class); } /** diff --git a/ApnsPHP/Tests/PushUpdateQueueTest.php b/ApnsPHP/Tests/PushUpdateQueueTest.php index a4b8d6e2..c2b31fdd 100644 --- a/ApnsPHP/Tests/PushUpdateQueueTest.php +++ b/ApnsPHP/Tests/PushUpdateQueueTest.php @@ -15,7 +15,7 @@ * * @covers \ApnsPHP\Push */ -class PushUpdateQueueTest extends PushTest +class PushUpdateQueueTest extends PushTestBase { /** * Test that updateQueue() returns false if there is no errorMessage @@ -24,7 +24,7 @@ class PushUpdateQueueTest extends PushTest */ public function testUpdateQueueReturnsFalse(): void { - $method = $this->get_accessible_reflection_method('updateQueue'); + $method = $this->get_reflection_method('updateQueue'); $result = $method->invoke($this->class); $this->assertFalse($result); @@ -57,11 +57,11 @@ public function testUpdateQueueSucceedsWithErrorMessageParameter(): void $this->logger->expects($this->exactly(3)) ->method('info') - ->withConsecutive( + ->willReturnMap([ [ 'Trying to initialize HTTP/2 backend...' ], [ 'Initializing HTTP/2 backend with certificate.' ], [ 'Initialized HTTP/2 backend.' ], - ); + ]); $this->logger->expects($this->never()) ->method('warning'); @@ -70,7 +70,7 @@ public function testUpdateQueueSucceedsWithErrorMessageParameter(): void ->method('error') ->with('Unable to send message ID 3: Missing payload (4).'); - $method = $this->get_accessible_reflection_method('updateQueue'); + $method = $this->get_reflection_method('updateQueue'); $result = $method->invokeArgs($this->class, [ $errorMessage ]); $messageQueue = $this->get_reflection_property_value('messageQueue'); @@ -104,11 +104,11 @@ public function testUpdateQueueDoesNotDeleteUnsentMessages(): void $this->logger->expects($this->exactly(3)) ->method('info') - ->withConsecutive( + ->willReturnMap([ [ 'Trying to initialize HTTP/2 backend...' ], [ 'Initializing HTTP/2 backend with certificate.' ], [ 'Initialized HTTP/2 backend.' ], - ); + ]); $this->logger->expects($this->never()) ->method('warning'); @@ -117,10 +117,10 @@ public function testUpdateQueueDoesNotDeleteUnsentMessages(): void ->method('error') ->with('Unable to send message ID 2: Missing payload (4).'); - $method = $this->get_accessible_reflection_method('updateQueue'); + $method = $this->get_reflection_method('updateQueue'); $result = $method->invoke($this->class, $errorMessage); - $messageQueue = $this->get_accessible_reflection_property('messageQueue')->getValue($this->class); + $messageQueue = $this->get_reflection_property('messageQueue')->getValue($this->class); $this->assertTrue($result); $this->assertEquals([ 3 => $queue[3], 4 => $queue[4] ], $messageQueue); diff --git a/composer.json b/composer.json index c341caf6..33a83e14 100644 --- a/composer.json +++ b/composer.json @@ -16,8 +16,8 @@ "lcobucci/jwt": "~4.1 || ~5.0" }, "require-dev": { - "phpunit/phpunit": ">=9.0 <9.6", - "lunr/halo": "~0.8.0" + "phpunit/phpunit": "~10.0", + "lunr/halo": "~0.10.0" }, "config": { "optimize-autoloader": true