344 lines
11 KiB
PHP
344 lines
11 KiB
PHP
<?php
|
|
/**
|
|
* @see https://github.com/zendframework/ZendService_Apple_Apns for the canonical source repository
|
|
* @copyright Copyright (c) 2014-2018 Zend Technologies USA Inc. (https://www.zend.com)
|
|
* @license https://github.com/zendframework/ZendService_Apple_Apns/blob/master/LICENSE.md New BSD License
|
|
*/
|
|
|
|
namespace ZendServiceTest\Apple\Apns;
|
|
|
|
use InvalidArgumentException;
|
|
use PHPUnit\Framework\TestCase;
|
|
use stdClass;
|
|
use Zend\Json\Encoder as JsonEncoder;
|
|
use ZendService\Apple\Apns\Message;
|
|
use ZendService\Apple\Apns\Message\Alert;
|
|
|
|
/**
|
|
* @category ZendService
|
|
* @package ZendService_Apple
|
|
* @subpackage UnitTests
|
|
* @group ZendService
|
|
* @group ZendService_Apple
|
|
* @group ZendService_Apple_Apns
|
|
*/
|
|
class MessageTest extends TestCase
|
|
{
|
|
public function setUp()
|
|
{
|
|
$this->alert = new Alert();
|
|
$this->message = new Message();
|
|
}
|
|
|
|
public function testSetAlertTextReturnsCorrectly()
|
|
{
|
|
$text = 'my alert';
|
|
$ret = $this->message->setAlert($text);
|
|
$this->assertInstanceOf('ZendService\Apple\Apns\Message', $ret);
|
|
$checkText = $this->message->getAlert();
|
|
$this->assertInstanceOf('ZendService\Apple\Apns\Message\Alert', $checkText);
|
|
$this->assertEquals($text, $checkText->getBody());
|
|
}
|
|
|
|
public function testSetAlertThrowsExceptionOnTextNonString()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->message->setAlert([]);
|
|
}
|
|
|
|
public function testSetAlertThrowsExceptionOnActionLocKeyNonString()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->alert->setActionLocKey([]);
|
|
}
|
|
|
|
public function testSetAlertThrowsExceptionOnLocKeyNonString()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->alert->setLocKey([]);
|
|
}
|
|
|
|
public function testSetAlertThrowsExceptionOnLaunchImageNonString()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->alert->setLaunchImage([]);
|
|
}
|
|
|
|
public function testSetAlertThrowsExceptionOnTitleNonString()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->alert->setTitle([]);
|
|
}
|
|
|
|
public function testSetAlertThrowsExceptionOnTitleLocKeyNonString()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->alert->setTitleLocKey([]);
|
|
}
|
|
|
|
public function testSetBadgeReturnsCorrectNumber()
|
|
{
|
|
$num = 5;
|
|
$this->message->setBadge($num);
|
|
$this->assertEquals($num, $this->message->getBadge());
|
|
}
|
|
|
|
public function testSetBadgeNonNumericThrowsException()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->message->setBadge('string!');
|
|
}
|
|
|
|
public function testSetBadgeAllowsNull()
|
|
{
|
|
$this->message->setBadge(null);
|
|
$this->assertNull($this->message->getBadge());
|
|
}
|
|
|
|
public function testSetExpireReturnsInteger()
|
|
{
|
|
$expire = 100;
|
|
$this->message->setExpire($expire);
|
|
$this->assertEquals($expire, $this->message->getExpire());
|
|
}
|
|
|
|
public function testSetExpireNonNumericThrowsException()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->message->setExpire('sting!');
|
|
}
|
|
|
|
public function testSetSoundReturnsString()
|
|
{
|
|
$sound = 'test';
|
|
$this->message->setSound($sound);
|
|
$this->assertEquals($sound, $this->message->getSound());
|
|
}
|
|
|
|
public function testSetSoundThrowsExceptionOnNonScalar()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->message->setSound([]);
|
|
}
|
|
|
|
public function testSetSoundThrowsExceptionOnNonString()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->message->setSound(12345);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideSetMutableContentThrowsExceptionOnNonIntegerOneOrNullData
|
|
*
|
|
* @param mixed $value
|
|
*/
|
|
public function testSetMutableContentThrowsExceptionOnNonIntegerOneAndNull($value)
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->message->setMutableContent($value);
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function provideSetMutableContentThrowsExceptionOnNonIntegerOneOrNullData()
|
|
{
|
|
return [
|
|
'unsupported positive integer' => ['value' => 2],
|
|
'zero integer' => ['value' => 0],
|
|
'negative integer' => ['value' => -1],
|
|
'boolean' => ['value' => true],
|
|
'string' => ['value' => 'any string'],
|
|
'float' => ['value' => 123.12],
|
|
'array' => ['value' => []],
|
|
'object' => ['value' => new stdClass()],
|
|
];
|
|
}
|
|
|
|
public function testSetMutableContentResultsInCorrectPayloadWithIntegerValue()
|
|
{
|
|
$value = 1;
|
|
$this->message->setMutableContent($value);
|
|
$payload = $this->message->getPayload();
|
|
$this->assertEquals($value, $payload['aps']['mutable-content']);
|
|
}
|
|
|
|
public function testSetMutableContentResultsInCorrectPayloadWithNullValue()
|
|
{
|
|
$this->message->setMutableContent(null);
|
|
$json = $this->message->getPayloadJson();
|
|
$payload = json_decode($json, true);
|
|
$this->assertFalse(isset($payload['aps']['mutable-content']));
|
|
}
|
|
|
|
public function testSetContentAvailableThrowsExceptionOnNonInteger()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->message->setContentAvailable("string");
|
|
}
|
|
|
|
public function testGetContentAvailableReturnsCorrectInteger()
|
|
{
|
|
$value = 1;
|
|
$this->message->setContentAvailable($value);
|
|
$this->assertEquals($value, $this->message->getContentAvailable());
|
|
}
|
|
|
|
public function testSetContentAvailableResultsInCorrectPayload()
|
|
{
|
|
$value = 1;
|
|
$this->message->setContentAvailable($value);
|
|
$payload = $this->message->getPayload();
|
|
$this->assertEquals($value, $payload['aps']['content-available']);
|
|
}
|
|
|
|
public function testSetCategoryReturnsString()
|
|
{
|
|
$category = 'test';
|
|
$this->message->setCategory($category);
|
|
$this->assertEquals($category, $this->message->getCategory());
|
|
}
|
|
|
|
public function testSetCategoryThrowsExceptionOnNonScalar()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->message->setCategory([]);
|
|
}
|
|
|
|
public function testSetCategoryThrowsExceptionOnNonString()
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$this->message->setCategory(12345);
|
|
}
|
|
|
|
public function testSetUrlArgsReturnsString()
|
|
{
|
|
$urlArgs = ['path/to/somewhere'];
|
|
$this->message->setUrlArgs($urlArgs);
|
|
$this->assertEquals($urlArgs, $this->message->getUrlArgs());
|
|
}
|
|
|
|
public function testSetCustomData()
|
|
{
|
|
$data = ['key' => 'val', 'key2' => [1, 2, 3, 4, 5]];
|
|
$this->message->setCustom($data);
|
|
$this->assertEquals($data, $this->message->getCustom());
|
|
}
|
|
|
|
public function testAlertConstructor()
|
|
{
|
|
$alert = new Alert(
|
|
'Foo wants to play Bar!',
|
|
'PLAY',
|
|
'GAME_PLAY_REQUEST_FORMAT',
|
|
['Foo', 'Baz'],
|
|
'Default.png',
|
|
'Alert',
|
|
'ALERT',
|
|
['Foo', 'Baz']
|
|
);
|
|
|
|
$this->assertEquals('Foo wants to play Bar!', $alert->getBody());
|
|
$this->assertEquals('PLAY', $alert->getActionLocKey());
|
|
$this->assertEquals('GAME_PLAY_REQUEST_FORMAT', $alert->getLocKey());
|
|
$this->assertEquals(['Foo', 'Baz'], $alert->getLocArgs());
|
|
$this->assertEquals('Default.png', $alert->getLaunchImage());
|
|
$this->assertEquals('Alert', $alert->getTitle());
|
|
$this->assertEquals('ALERT', $alert->getTitleLocKey());
|
|
$this->assertEquals(['Foo', 'Baz'], $alert->getTitleLocArgs());
|
|
}
|
|
|
|
public function testAlertJsonPayload()
|
|
{
|
|
$alert = new Alert(
|
|
'Foo wants to play Bar!',
|
|
'PLAY',
|
|
'GAME_PLAY_REQUEST_FORMAT',
|
|
['Foo', 'Baz'],
|
|
'Default.png',
|
|
'Alert',
|
|
'ALERT',
|
|
['Foo', 'Baz']
|
|
);
|
|
$payload = $alert->getPayload();
|
|
|
|
$this->assertArrayHasKey('body', $payload);
|
|
$this->assertArrayHasKey('action-loc-key', $payload);
|
|
$this->assertArrayHasKey('loc-key', $payload);
|
|
$this->assertArrayHasKey('loc-args', $payload);
|
|
$this->assertArrayHasKey('launch-image', $payload);
|
|
$this->assertArrayHasKey('title', $payload);
|
|
$this->assertArrayHasKey('title-loc-key', $payload);
|
|
$this->assertArrayHasKey('title-loc-args', $payload);
|
|
}
|
|
|
|
public function testAlertPayloadSendsOnlyBody()
|
|
{
|
|
$alert = new Alert('Foo wants Bar');
|
|
$payload = $alert->getPayload();
|
|
|
|
$this->assertEquals('Foo wants Bar', $payload);
|
|
}
|
|
|
|
public function testPayloadJsonFormedCorrectly()
|
|
{
|
|
$text = 'hi=привет';
|
|
$this->message->setAlert($text);
|
|
$this->message->setId(1);
|
|
$this->message->setExpire(100);
|
|
$this->message->setToken('0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef');
|
|
$payload = $this->message->getPayload();
|
|
$this->assertEquals($payload, ['aps' => ['alert' => 'hi=привет']]);
|
|
if (defined('JSON_UNESCAPED_UNICODE')) {
|
|
$payloadJson = json_encode($payload, JSON_UNESCAPED_UNICODE);
|
|
$this->assertEquals($payloadJson, '{"aps":{"alert":"hi=привет"}}');
|
|
$length = 35; // 23 + (2 * 6) because UTF-8 (Russian) "привет" contains 2 bytes per letter
|
|
$result =
|
|
pack(
|
|
'CNNnH*',
|
|
1,
|
|
$this->message->getId(),
|
|
$this->message->getExpire(),
|
|
32,
|
|
$this->message->getToken()
|
|
)
|
|
. pack('n', $length)
|
|
. $payloadJson;
|
|
$this->assertEquals($this->message->getPayloadJson(), $result);
|
|
} else {
|
|
$payloadJson = JsonEncoder::encode($payload);
|
|
$this->assertEquals($payloadJson, '{"aps":{"alert":"hi=\u043f\u0440\u0438\u0432\u0435\u0442"}}');
|
|
$length = 59; // (23 + (6 * 6) because UTF-8 (Russian) "привет" converts into 6 bytes/letter
|
|
$result =
|
|
pack(
|
|
'CNNnH*',
|
|
1,
|
|
$this->message->getId(),
|
|
$this->message->getExpire(),
|
|
32,
|
|
$this->message->getToken()
|
|
)
|
|
. pack('n', $length)
|
|
. $payloadJson;
|
|
$this->assertEquals($this->message->getPayloadJson(), $result);
|
|
}
|
|
}
|
|
|
|
public function testCustomDataPayloadIncludesEmptyApsObject()
|
|
{
|
|
$data = ['custom' => 'data'];
|
|
$expected = array_merge($data, ['aps' => (object) []]);
|
|
$this->message->setCustom($data);
|
|
|
|
$payload = $this->message->getPayload();
|
|
$this->assertEquals($expected, $payload);
|
|
}
|
|
|
|
public function testTokensAllowUpperCaseHex()
|
|
{
|
|
$token = str_repeat('abc1234defABCDEF', 4);
|
|
$this->message->setToken($token);
|
|
$this->assertSame($token, $this->message->getToken());
|
|
}
|
|
}
|