362 lines
10 KiB
PHP
362 lines
10 KiB
PHP
<?php
|
|
|
|
namespace Codebird;
|
|
require_once ('test/codebirdm.php');
|
|
|
|
/**
|
|
* A Twitter library in PHP.
|
|
*
|
|
* @package codebird-test
|
|
* @author Jublo Limited <support@jublo.net>
|
|
* @copyright 2010-2018 Jublo Limited <support@jublo.net>
|
|
* @license https://opensource.org/licenses/GPL-3.0 GNU General Public License 3.0
|
|
* @link https://github.com/jublonet/codebird-php
|
|
*/
|
|
|
|
/**
|
|
* Reply parsing tests
|
|
*
|
|
* @package codebird-test
|
|
*/
|
|
class Replyparse_Test extends \PHPUnit\Framework\TestCase
|
|
{
|
|
/**
|
|
* Initialise Codebird class
|
|
*
|
|
* @return \Codebird\Codebird The Codebird class
|
|
*/
|
|
protected function getCB()
|
|
{
|
|
Codebird::setConsumerKey('123', '456');
|
|
$cb = new CodebirdM();
|
|
|
|
return $cb;
|
|
}
|
|
|
|
/**
|
|
* Tests _getHttpStatusFromHeaders
|
|
*/
|
|
public function testGetHttpStatusFromHeaders()
|
|
{
|
|
$cb = $this->getCB();
|
|
$this->assertEquals(
|
|
'500',
|
|
$cb->call('_getHttpStatusFromHeaders', [['']])
|
|
);
|
|
$this->assertEquals(
|
|
'200',
|
|
$cb->call('_getHttpStatusFromHeaders', [
|
|
['HTTP/1.1 200 OK'],
|
|
['X-Some-Data: test']
|
|
])
|
|
);
|
|
$this->assertEquals(
|
|
'404',
|
|
$cb->call('_getHttpStatusFromHeaders', [
|
|
['HTTP/1.1 404 Not Found'],
|
|
['X-Some-Data: test']
|
|
])
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Tests _parseBearerReply
|
|
*/
|
|
public function testParseBearerReply()
|
|
{
|
|
$cb = $this->getCB();
|
|
$cb->setBearerToken(null);
|
|
// get raw reply from mock collection
|
|
$reply = $cb->getStatic('_mock_replies')['POST https://api.twitter.com/oauth2/token'];
|
|
// check that bearer token is not yet set
|
|
$this->assertNull($cb->getStatic('_bearer_token'));
|
|
// parse it as object
|
|
$result = $cb->call(
|
|
'_parseBearerReply',
|
|
[
|
|
$reply['reply'],
|
|
$reply['httpstatus']
|
|
]
|
|
);
|
|
$expected = new \stdClass;
|
|
$expected->token_type = 'bearer';
|
|
$expected->access_token = 'VqiO0n2HrKE';
|
|
$expected->httpstatus = 200;
|
|
$expected->rate = null;
|
|
$this->assertEquals($expected, $result);
|
|
// check that bearer token was actually set
|
|
$this->assertNotNull($cb->getStatic('_bearer_token'));
|
|
|
|
// array
|
|
$cb->setReturnFormat(CODEBIRD_RETURNFORMAT_ARRAY);
|
|
$cb->setBearerToken(null);
|
|
$result = $cb->call(
|
|
'_parseBearerReply',
|
|
[
|
|
$reply['reply'],
|
|
$reply['httpstatus']
|
|
]
|
|
);
|
|
$expected = [
|
|
'token_type' => 'bearer',
|
|
'access_token' => 'VqiO0n2HrKE',
|
|
'httpstatus' => 200,
|
|
'rate' => null
|
|
];
|
|
$this->assertEquals($expected, $result);
|
|
// check that bearer token was actually set
|
|
$this->assertNotNull($cb->getStatic('_bearer_token'));
|
|
|
|
// JSON
|
|
$cb->setReturnFormat(CODEBIRD_RETURNFORMAT_JSON);
|
|
$cb->setBearerToken(null);
|
|
$result = $cb->call(
|
|
'_parseBearerReply',
|
|
[
|
|
$reply['reply'],
|
|
$reply['httpstatus']
|
|
]
|
|
);
|
|
$expected = '{"token_type":"bearer","access_token":"VqiO0n2HrKE"}';
|
|
$this->assertEquals($expected, $result);
|
|
// check that bearer token was actually set
|
|
$this->assertNotNull($cb->getStatic('_bearer_token'));
|
|
}
|
|
|
|
/**
|
|
* Tests _getRateLimitInfo
|
|
*/
|
|
public function testGetRateLimitInfo()
|
|
{
|
|
$cb = $this->getCB();
|
|
$headers = [
|
|
'content-length' => 68,
|
|
'content-type' => 'application/json;charset=utf-8',
|
|
'date' => 'Sun, 06 Dec 2015 14:43:28 GMT'
|
|
];
|
|
$this->assertNull($cb->call('_getRateLimitInfo', [$headers]));
|
|
|
|
// set rate-limit headers
|
|
$headers['x-rate-limit-limit'] = 180;
|
|
$headers['x-rate-limit-remaining'] = 123;
|
|
$headers['x-rate-limit-reset'] = time() + 234;
|
|
$rate = $cb->call('_getRateLimitInfo', [$headers]);
|
|
$expected = new \stdClass;
|
|
$expected->limit = $headers['x-rate-limit-limit'];
|
|
$expected->remaining = $headers['x-rate-limit-remaining'];
|
|
$expected->reset = $headers['x-rate-limit-reset'];
|
|
$this->assertEquals($expected, $rate);
|
|
|
|
// array
|
|
$cb->setReturnFormat(CODEBIRD_RETURNFORMAT_ARRAY);
|
|
$rate = $cb->call('_getRateLimitInfo', [$headers]);
|
|
$expected = [
|
|
'limit' => $headers['x-rate-limit-limit'],
|
|
'remaining' => $headers['x-rate-limit-remaining'],
|
|
'reset' => $headers['x-rate-limit-reset']
|
|
];
|
|
$this->assertEquals($expected, $rate);
|
|
}
|
|
|
|
/**
|
|
* Tests _validateSslCertificate
|
|
*/
|
|
public function testValidateSslCertificate1()
|
|
{
|
|
$cb = $this->getCB();
|
|
$cb->call('_validateSslCertificate', [0]);
|
|
}
|
|
|
|
/**
|
|
* Tests _validateSslCertificate
|
|
* @expectedException \Exception
|
|
* @expectedExceptionMessage Error 58 while validating the Twitter API certificate.
|
|
*/
|
|
public function testValidateSslCertificate2()
|
|
{
|
|
$cb = $this->getCB();
|
|
$cb->call('_validateSslCertificate', [CURLE_SSL_CERTPROBLEM]);
|
|
}
|
|
|
|
/**
|
|
* Tests _appendHttpStatusAndRate
|
|
*/
|
|
public function testAppendHttpStatusAndRate()
|
|
{
|
|
$cb = $this->getCB();
|
|
|
|
// object
|
|
$reply = new \stdClass;
|
|
$reply->somedata = 123;
|
|
$reply->moredata = '456';
|
|
$rate = new \stdClass;
|
|
$rate->field1 = 180;
|
|
$rate->field2 = 177;
|
|
$expected = new \stdClass;
|
|
$expected->somedata = 123;
|
|
$expected->moredata = '456';
|
|
$expected->httpstatus = 409;
|
|
$expected->rate = new \stdClass;
|
|
$expected->rate->field1 = 180;
|
|
$expected->rate->field2 = 177;
|
|
$this->assertEquals(
|
|
$expected,
|
|
$cb->call('_appendHttpStatusAndRate', [$reply, 409, $rate])
|
|
);
|
|
|
|
// array
|
|
$reply = (array) $reply;
|
|
$rate = (array) $rate;
|
|
$expected = (array) $expected;
|
|
$expected['rate'] = (array) $expected['rate'];
|
|
$cb->setReturnFormat(CODEBIRD_RETURNFORMAT_ARRAY);
|
|
$this->assertEquals(
|
|
$expected,
|
|
$cb->call('_appendHttpStatusAndRate', [$reply, 409, $rate])
|
|
);
|
|
|
|
// JSON
|
|
$reply = '{"somedata":123,"moredata":"456"}';
|
|
$expected = '{"somedata":123,"moredata":"456","httpstatus":409,'
|
|
. '"rate":{"field1":180,"field2":177}}';
|
|
$cb->setReturnFormat(CODEBIRD_RETURNFORMAT_JSON);
|
|
$this->assertEquals(
|
|
$expected,
|
|
$cb->call('_appendHttpStatusAndRate', [$reply, 409, $rate])
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Tests _parseApiHeaders
|
|
*/
|
|
public function testParseApiHeaders()
|
|
{
|
|
$cb = $this->getCB();
|
|
$data = $cb->getStatic('_mock_replies')['default']['reply'];
|
|
list($headers, $reply) = $cb->call('_parseApiHeaders', [$data]);
|
|
$expected_headers = [
|
|
'HTTP/1.1 404 Not Found' => '',
|
|
'content-length' => '68',
|
|
'content-type' => 'application/json;charset=utf-8',
|
|
'date' => 'Sun, 06 Dec 2015 14:43:28 GMT',
|
|
'server' => 'tsa_b',
|
|
'set-cookie' => 'guest_id=v1%3A144941300885288055; Domain=.twitter.com'
|
|
. '; Path=/; Expires=Tue, 05-Dec-2017 14:43:28 UTC',
|
|
'strict-transport-security' => 'max-age=631138519',
|
|
'x-connection-hash' => '12218aef9e9757609afb08e661fa3b9b',
|
|
'x-response-time' => '2'
|
|
];
|
|
$expected_reply = '{"errors":[{"message":"Sorry, that page does not exist","code":34}]}';
|
|
$this->assertEquals($expected_headers, $headers);
|
|
$this->assertEquals($expected_reply, $reply);
|
|
|
|
// proxy
|
|
$data = $cb->getStatic('_mock_replies')['proxy1']['reply'];
|
|
list($headers, $reply) = $cb->call('_parseApiHeaders', [$data]);
|
|
$this->assertEquals($expected_headers, $headers);
|
|
$this->assertEquals($expected_reply, $reply);
|
|
}
|
|
|
|
/**
|
|
* Tests _parseApiReplyPrefillHeaders
|
|
*/
|
|
public function testParseApiReplyPrefillHeaders()
|
|
{
|
|
$cb = $this->getCB();
|
|
$headers = [
|
|
'X-TON-Min-Chunk-Size' => '12345',
|
|
'X-TON-Max-Chunk-Size' => '23456',
|
|
'Range' => 'bytes 0-1234567/2345678'
|
|
];
|
|
|
|
// non-empty reply: no touching
|
|
$this->assertEquals(
|
|
'123',
|
|
$cb->call('_parseApiReplyPrefillHeaders', [$headers, '123'])
|
|
);
|
|
|
|
// no location header: no touching
|
|
$this->assertEquals(
|
|
'',
|
|
$cb->call('_parseApiReplyPrefillHeaders', [$headers, ''])
|
|
);
|
|
|
|
$headers['Location'] = 'https://twitter.com';
|
|
$this->assertEquals(
|
|
'{"Location":"https:\/\/twitter.com","X-TON-Min-Chunk-Size":"12345",'
|
|
. '"X-TON-Max-Chunk-Size":"23456","Range":"bytes 0-1234567\/2345678"}',
|
|
$cb->call('_parseApiReplyPrefillHeaders', [$headers, ''])
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Tests _parseApiReply
|
|
*/
|
|
public function testParseApiReply1()
|
|
{
|
|
$cb = $this->getCB();
|
|
|
|
// object
|
|
$this->assertEquals(new \stdClass, $cb->call('_parseApiReply', ['[]']));
|
|
|
|
// array
|
|
$cb->setReturnFormat(CODEBIRD_RETURNFORMAT_ARRAY);
|
|
$this->assertEquals([], $cb->call('_parseApiReply', ['[]']));
|
|
|
|
// JSON
|
|
$cb->setReturnFormat(CODEBIRD_RETURNFORMAT_JSON);
|
|
$this->assertEquals('{}', $cb->call('_parseApiReply', ['[]']));
|
|
}
|
|
|
|
/**
|
|
* Tests _parseApiReply
|
|
*/
|
|
public function testParseApiReply2()
|
|
{
|
|
$cb = $this->getCB();
|
|
$reply = '{"id_str":"6253282","profile_location":null,'
|
|
. '"status":{"created_at":"Tue Nov 24 08:56:07 +0000 2015","id":669077021138493440}}';
|
|
|
|
// object
|
|
$expected = new \stdClass;
|
|
$expected->id_str = '6253282';
|
|
$expected->profile_location = null;
|
|
$expected->status = new \stdClass;
|
|
$expected->status->created_at = 'Tue Nov 24 08:56:07 +0000 2015';
|
|
$expected->status->id = 669077021138493440;
|
|
$result = $cb->call('_parseApiReply', [$reply]);
|
|
$this->assertEquals($expected, $result);
|
|
$this->assertSame($expected->status->id, $result->status->id);
|
|
|
|
// array
|
|
$cb->setReturnFormat(CODEBIRD_RETURNFORMAT_ARRAY);
|
|
$expected = (array) $expected;
|
|
$expected['status'] = (array) $expected['status'];
|
|
$this->assertEquals($expected, $cb->call('_parseApiReply', [$reply]));
|
|
|
|
// JSON
|
|
$cb->setReturnFormat(CODEBIRD_RETURNFORMAT_JSON);
|
|
$this->assertEquals($reply, $cb->call('_parseApiReply', [$reply]));
|
|
|
|
// query-string format
|
|
$cb->setReturnFormat(CODEBIRD_RETURNFORMAT_ARRAY);
|
|
$this->assertEquals(
|
|
[
|
|
'oauth_token' => 'ABC',
|
|
'oauth_token_secret' => 'def',
|
|
'oauth_callback_confirmed' => 'true'
|
|
],
|
|
$cb->call(
|
|
'_parseApiReply',
|
|
['oauth_token=ABC&oauth_token_secret=def&oauth_callback_confirmed=true']
|
|
)
|
|
);
|
|
|
|
// message
|
|
$this->assertEquals(
|
|
['message' => 'This is just a message.'],
|
|
$cb->call('_parseApiReply', ['This is just a message.'])
|
|
);
|
|
}
|
|
}
|