461 lines
17 KiB
PHP
461 lines
17 KiB
PHP
<?php
|
|
|
|
use GuzzleHttp\Psr7\Response;
|
|
use LaravelFCM\Response\DownstreamResponse;
|
|
|
|
class DownstreamResponseTest extends FCMTestCase
|
|
{
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_construct_a_response_with_a_success()
|
|
{
|
|
$token = 'new_token';
|
|
|
|
$response = new Response(200, [], '{
|
|
"multicast_id": 108,
|
|
"success": 1,
|
|
"failure": 0,
|
|
"canonical_ids": 0,
|
|
"results": [
|
|
{ "message_id": "1:08" }
|
|
]
|
|
}');
|
|
|
|
$downstreamResponse = new DownstreamResponse($response, $token);
|
|
|
|
$this->assertEquals(1, $downstreamResponse->numberSuccess());
|
|
$this->assertEquals(0, $downstreamResponse->numberFailure());
|
|
$this->assertEquals(0, $downstreamResponse->numberModification());
|
|
|
|
$this->assertCount(0, $downstreamResponse->tokensToDelete());
|
|
$this->assertCount(0, $downstreamResponse->tokensToModify());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_construct_a_response_with_multiple_successes()
|
|
{
|
|
$tokens = [
|
|
'first_token',
|
|
'second_token',
|
|
'third_token',
|
|
];
|
|
|
|
$response = new Response(200, [], '{
|
|
"multicast_id": 108,
|
|
"success": 3,
|
|
"failure": 0,
|
|
"canonical_ids": 0,
|
|
"results": [
|
|
{ "message_id": "1:01" },
|
|
{ "message_id": "1:02" },
|
|
{ "message_id": "1:03" }
|
|
]
|
|
}');
|
|
|
|
$downstreamResponse = new DownstreamResponse($response, $tokens);
|
|
|
|
$this->assertEquals(3, $downstreamResponse->numberSuccess());
|
|
$this->assertEquals(0, $downstreamResponse->numberFailure());
|
|
$this->assertEquals(0, $downstreamResponse->numberModification());
|
|
|
|
$this->assertCount(0, $downstreamResponse->tokensToDelete());
|
|
$this->assertCount(0, $downstreamResponse->tokensToModify());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_construct_a_response_with_a_failure()
|
|
{
|
|
$token = 'new_token';
|
|
|
|
$response = new Response(200, [], '{
|
|
"multicast_id": 108,
|
|
"success": 0,
|
|
"failure": 1,
|
|
"canonical_ids": 0,
|
|
"results": [
|
|
{ "error": "NotRegistered" }
|
|
]
|
|
}');
|
|
|
|
$downstreamResponse = new DownstreamResponse($response, $token);
|
|
|
|
$this->assertEquals(0, $downstreamResponse->numberSuccess());
|
|
$this->assertEquals(1, $downstreamResponse->numberFailure());
|
|
$this->assertEquals(0, $downstreamResponse->numberModification());
|
|
$this->assertFalse($downstreamResponse->hasMissingToken());
|
|
|
|
$this->assertCount(1, $downstreamResponse->tokensToDelete());
|
|
$this->assertEquals($token, $downstreamResponse->tokensToDelete()[ 0 ]);
|
|
$this->assertCount(0, $downstreamResponse->tokensToModify());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_construct_a_response_with_multiple_failures()
|
|
{
|
|
$tokens = [
|
|
'first_token',
|
|
'second_token',
|
|
'third_token',
|
|
'fourth_token',
|
|
];
|
|
|
|
$response = new Response(200, [], '{
|
|
"multicast_id": 108,
|
|
"success": 0,
|
|
"failure": 3,
|
|
"canonical_ids": 0,
|
|
"results": [
|
|
{ "error": "NotRegistered" },
|
|
{ "error": "InvalidRegistration" },
|
|
{ "error": "NotRegistered" },
|
|
{ "error": "MissingRegistration"}
|
|
]
|
|
}');
|
|
|
|
$downstreamResponse = new DownstreamResponse($response, $tokens);
|
|
|
|
$this->assertEquals(0, $downstreamResponse->numberSuccess());
|
|
$this->assertEquals(3, $downstreamResponse->numberFailure());
|
|
$this->assertEquals(0, $downstreamResponse->numberModification());
|
|
$this->assertTrue($downstreamResponse->hasMissingToken());
|
|
|
|
$this->assertCount(3, $downstreamResponse->tokensToDelete());
|
|
$this->assertEquals($tokens[ 0 ], $downstreamResponse->tokensToDelete()[ 0 ]);
|
|
$this->assertEquals($tokens[ 1 ], $downstreamResponse->tokensToDelete()[ 1 ]);
|
|
$this->assertEquals($tokens[ 2 ], $downstreamResponse->tokensToDelete()[ 2 ]);
|
|
$this->assertCount(0, $downstreamResponse->tokensToModify());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_construct_a_response_with_a_token_to_change()
|
|
{
|
|
$token = 'new_token';
|
|
|
|
$response = new Response(200, [], '{
|
|
"multicast_id": 108,
|
|
"success": 0,
|
|
"failure": 0,
|
|
"canonical_ids": 1,
|
|
"results": [
|
|
{ "message_id": "1:2342", "registration_id": "32" }
|
|
]
|
|
}');
|
|
|
|
$downstreamResponse = new DownstreamResponse($response, $token);
|
|
|
|
$this->assertEquals(0, $downstreamResponse->numberSuccess());
|
|
$this->assertEquals(0, $downstreamResponse->numberFailure());
|
|
$this->assertEquals(1, $downstreamResponse->numberModification());
|
|
|
|
$this->assertCount(0, $downstreamResponse->tokensToDelete());
|
|
$this->assertCount(1, $downstreamResponse->tokensToModify());
|
|
|
|
$this->assertTrue(array_key_exists($token, $downstreamResponse->tokensToModify()));
|
|
$this->assertEquals('32', $downstreamResponse->tokensToModify()[ $token ]);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_construct_a_response_with_multiple_tokens_to_change()
|
|
{
|
|
$tokens = [
|
|
'first_token',
|
|
'second_token',
|
|
'third_token',
|
|
];
|
|
|
|
$response = new Response(200, [], '{
|
|
"multicast_id": 108,
|
|
"success": 0,
|
|
"failure": 0,
|
|
"canonical_ids": 3,
|
|
"results": [
|
|
{ "message_id": "1:2342", "registration_id": "32" },
|
|
{ "message_id": "1:2342", "registration_id": "33" },
|
|
{ "message_id": "1:2342", "registration_id": "34" }
|
|
]
|
|
}');
|
|
|
|
$downstreamResponse = new DownstreamResponse($response, $tokens);
|
|
|
|
$this->assertEquals(0, $downstreamResponse->numberSuccess());
|
|
$this->assertEquals(0, $downstreamResponse->numberFailure());
|
|
$this->assertEquals(3, $downstreamResponse->numberModification());
|
|
|
|
$this->assertCount(0, $downstreamResponse->tokensToDelete());
|
|
$this->assertCount(3, $downstreamResponse->tokensToModify());
|
|
|
|
$this->assertTrue(array_key_exists($tokens[ 0 ], $downstreamResponse->tokensToModify()));
|
|
$this->assertEquals('32', $downstreamResponse->tokensToModify()[ $tokens[ 0 ] ]);
|
|
|
|
$this->assertTrue(array_key_exists($tokens[ 1 ], $downstreamResponse->tokensToModify()));
|
|
$this->assertEquals('33', $downstreamResponse->tokensToModify()[ $tokens[ 1 ] ]);
|
|
|
|
$this->assertTrue(array_key_exists($tokens[ 2 ], $downstreamResponse->tokensToModify()));
|
|
$this->assertEquals('34', $downstreamResponse->tokensToModify()[ $tokens[ 2 ] ]);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_construct_a_response_with_a_token_unavailable()
|
|
{
|
|
$token = 'first_token';
|
|
|
|
$response = new Response(200, [], '{
|
|
"multicast_id": 216,
|
|
"success": 0,
|
|
"failure": 1,
|
|
"canonical_ids": 0,
|
|
"results": [
|
|
{ "error": "Unavailable" }
|
|
]
|
|
}');
|
|
|
|
$downstreamResponse = new DownstreamResponse($response, $token);
|
|
|
|
$this->assertEquals(0, $downstreamResponse->numberSuccess());
|
|
$this->assertEquals(1, $downstreamResponse->numberFailure());
|
|
$this->assertEquals(0, $downstreamResponse->numberModification());
|
|
|
|
// Unavailable is not an error caused by the token validity. it don't need to be deleted$
|
|
$this->assertCount(0, $downstreamResponse->tokensToModify());
|
|
$this->assertCount(0, $downstreamResponse->tokensToDelete());
|
|
$this->assertCount(1, $downstreamResponse->tokensToRetry());
|
|
|
|
$this->assertEquals($token, $downstreamResponse->tokensToRetry()[0]);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_construct_a_response_with_a_token_server_error()
|
|
{
|
|
$token = 'first_token';
|
|
|
|
$response = new Response(200, [], '{
|
|
"multicast_id": 216,
|
|
"success": 0,
|
|
"failure": 1,
|
|
"canonical_ids": 0,
|
|
"results": [
|
|
{ "error": "InternalServerError" }
|
|
]
|
|
}');
|
|
|
|
$downstreamResponse = new DownstreamResponse($response, $token);
|
|
|
|
$this->assertEquals(0, $downstreamResponse->numberSuccess());
|
|
$this->assertEquals(1, $downstreamResponse->numberFailure());
|
|
$this->assertEquals(0, $downstreamResponse->numberModification());
|
|
|
|
// Unavailable is not an error caused by the token validity. it don't need to be deleted$
|
|
$this->assertCount(0, $downstreamResponse->tokensToModify());
|
|
$this->assertCount(0, $downstreamResponse->tokensToDelete());
|
|
$this->assertCount(1, $downstreamResponse->tokensToRetry());
|
|
|
|
$this->assertEquals($token, $downstreamResponse->tokensToRetry()[0]);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_construct_a_response_with_a_token_exceeded()
|
|
{
|
|
$token = 'first_token';
|
|
|
|
$response = new Response(200, [], '{
|
|
"multicast_id": 216,
|
|
"success": 0,
|
|
"failure": 1,
|
|
"canonical_ids": 0,
|
|
"results": [
|
|
{ "error": "DeviceMessageRateExceeded" }
|
|
]
|
|
}');
|
|
|
|
$downstreamResponse = new DownstreamResponse($response, $token);
|
|
|
|
$this->assertEquals(0, $downstreamResponse->numberSuccess());
|
|
$this->assertEquals(1, $downstreamResponse->numberFailure());
|
|
$this->assertEquals(0, $downstreamResponse->numberModification());
|
|
|
|
// Unavailable is not an error caused by the token validity. it don't need to be deleted$
|
|
$this->assertCount(0, $downstreamResponse->tokensToModify());
|
|
$this->assertCount(0, $downstreamResponse->tokensToDelete());
|
|
$this->assertCount(1, $downstreamResponse->tokensToRetry());
|
|
|
|
$this->assertEquals($token, $downstreamResponse->tokensToRetry()[0]);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_construct_a_response_with_a_mixed_token_to_retry()
|
|
{
|
|
$tokens = [
|
|
'first_token',
|
|
'second_token',
|
|
'third_token',
|
|
'fourth_token',
|
|
'fifth_token',
|
|
'sixth_token',
|
|
];
|
|
|
|
$response = new Response(200, [], '{
|
|
"multicast_id": 216,
|
|
"success": 0,
|
|
"failure": 6,
|
|
"canonical_ids": 0,
|
|
"results": [
|
|
{ "error": "DeviceMessageRateExceeded" },
|
|
{ "error": "InternalServerError" },
|
|
{ "error": "Unavailable" },
|
|
{ "error": "DeviceMessageRateExceeded" },
|
|
{ "error": "InternalServerError" },
|
|
{ "error": "Unavailable" }
|
|
]
|
|
}');
|
|
|
|
$downstreamResponse = new DownstreamResponse($response, $tokens);
|
|
|
|
$this->assertEquals(0, $downstreamResponse->numberSuccess());
|
|
$this->assertEquals(6, $downstreamResponse->numberFailure());
|
|
$this->assertEquals(0, $downstreamResponse->numberModification());
|
|
|
|
// Unavailable is not an error caused by the token validity. it don't need to be deleted$
|
|
$this->assertCount(0, $downstreamResponse->tokensToModify());
|
|
$this->assertCount(0, $downstreamResponse->tokensToDelete());
|
|
$this->assertCount(6, $downstreamResponse->tokensToRetry());
|
|
|
|
$this->assertEquals($tokens[ 0 ], $downstreamResponse->tokensToRetry()[ 0 ]);
|
|
$this->assertEquals($tokens[ 1 ], $downstreamResponse->tokensToRetry()[ 1 ]);
|
|
$this->assertEquals($tokens[ 2 ], $downstreamResponse->tokensToRetry()[ 2 ]);
|
|
$this->assertEquals($tokens[ 3 ], $downstreamResponse->tokensToRetry()[ 3 ]);
|
|
$this->assertEquals($tokens[ 4 ], $downstreamResponse->tokensToRetry()[ 4 ]);
|
|
$this->assertEquals($tokens[ 5 ], $downstreamResponse->tokensToRetry()[ 5 ]);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_construct_a_response_with_mixed_response()
|
|
{
|
|
$tokens = [
|
|
'first_token',
|
|
'second_token',
|
|
'third_token',
|
|
'fourth_token',
|
|
'fifth_token',
|
|
'sixth_token',
|
|
];
|
|
|
|
$response = new Response(200, [], '{
|
|
"multicast_id": 216,
|
|
"success": 3,
|
|
"failure": 3,
|
|
"canonical_ids": 1,
|
|
"results": [
|
|
{ "message_id": "1:0408" },
|
|
{ "error": "Unavailable" },
|
|
{ "error": "InvalidRegistration" },
|
|
{ "message_id": "1:1516" },
|
|
{ "message_id": "1:2342", "registration_id": "32" },
|
|
{ "error": "NotRegistered"}
|
|
]
|
|
}');
|
|
|
|
$downstreamResponse = new DownstreamResponse($response, $tokens);
|
|
|
|
$this->assertEquals(3, $downstreamResponse->numberSuccess());
|
|
$this->assertEquals(3, $downstreamResponse->numberFailure());
|
|
$this->assertEquals(1, $downstreamResponse->numberModification());
|
|
|
|
// Unavailable is not an error caused by the token validity. it don't need to be deleted
|
|
$this->assertCount(2, $downstreamResponse->tokensToDelete());
|
|
$this->assertCount(1, $downstreamResponse->tokensToModify());
|
|
|
|
$this->assertEquals($tokens[ 2 ], $downstreamResponse->tokensToDelete()[ 0 ]);
|
|
$this->assertEquals($tokens[ 5 ], $downstreamResponse->tokensToDelete()[ 1 ]);
|
|
|
|
$this->assertTrue(array_key_exists($tokens[ 4 ], $downstreamResponse->tokensToModify()));
|
|
$this->assertEquals('32', $downstreamResponse->tokensToModify()[ $tokens[ 4 ] ]);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function it_construct_a_response_with_multiples_response()
|
|
{
|
|
$tokens = [
|
|
'first_token',
|
|
'second_token',
|
|
'third_token',
|
|
'fourth_token',
|
|
'fifth_token',
|
|
'sixth_token',
|
|
'seventh_token',
|
|
];
|
|
|
|
$tokens1 = [
|
|
'first_1_token',
|
|
'second_1_token',
|
|
'third_1_token',
|
|
'fourth_1_token',
|
|
'fifth_1_token',
|
|
'sixth_1_token',
|
|
'seventh_1_token',
|
|
];
|
|
|
|
$response = new Response(200, [], '{
|
|
"multicast_id": 216,
|
|
"success": 3,
|
|
"failure": 3,
|
|
"canonical_ids": 1,
|
|
"results": [
|
|
{ "message_id": "1:0408" },
|
|
{ "error": "Unavailable" },
|
|
{ "error": "InvalidRegistration" },
|
|
{ "message_id": "1:1516" },
|
|
{ "message_id": "1:2342", "registration_id": "32" },
|
|
{ "error": "NotRegistered"},
|
|
{ "error": "MessageTooBig"}
|
|
]
|
|
}');
|
|
|
|
$downstreamResponse = new DownstreamResponse($response, $tokens);
|
|
$downstreamResponse1 = new DownstreamResponse($response, $tokens1);
|
|
|
|
$downstreamResponse->merge($downstreamResponse1);
|
|
|
|
$this->assertEquals(6, $downstreamResponse->numberSuccess());
|
|
$this->assertEquals(6, $downstreamResponse->numberFailure());
|
|
$this->assertEquals(2, $downstreamResponse->numberModification());
|
|
|
|
// Unavailable is not an error caused by the token validity. it don't need to be deleted
|
|
$this->assertCount(4, $downstreamResponse->tokensToDelete());
|
|
$this->assertCount(2, $downstreamResponse->tokensToModify());
|
|
$this->assertCount(2, $downstreamResponse->tokensWithError());
|
|
|
|
$this->assertEquals($tokens[ 2 ], $downstreamResponse->tokensToDelete()[ 0 ]);
|
|
$this->assertEquals($tokens1[ 2 ], $downstreamResponse->tokensToDelete()[ 2 ]);
|
|
$this->assertEquals($tokens[ 5 ], $downstreamResponse->tokensToDelete()[ 1 ]);
|
|
$this->assertEquals($tokens1[ 5 ], $downstreamResponse->tokensToDelete()[ 3 ]);
|
|
|
|
$this->assertCount(2, $downstreamResponse->tokensToRetry());
|
|
|
|
$this->assertEquals('MessageTooBig', $downstreamResponse->tokensWithError()[$tokens[6]]);
|
|
$this->assertEquals('MessageTooBig', $downstreamResponse->tokensWithError()[$tokens1[6]]);
|
|
}
|
|
}
|