diff --git a/src/Module/Api/Twitter/Favorites.php b/src/Module/Api/Twitter/Favorites.php index f806b23eec..8f4643f820 100644 --- a/src/Module/Api/Twitter/Favorites.php +++ b/src/Module/Api/Twitter/Favorites.php @@ -45,10 +45,10 @@ class Favorites extends BaseApi Logger::info(BaseApi::LOG_PREFIX . 'for {self}', ['module' => 'api', 'action' => 'favorites']); // params - $since_id = $_REQUEST['since_id'] ?? 0; - $max_id = $_REQUEST['max_id'] ?? 0; - $count = $_GET['count'] ?? 20; - $page = $_REQUEST['page'] ?? 1; + $since_id = $request['since_id'] ?? 0; + $max_id = $request['max_id'] ?? 0; + $count = $request['count'] ?? 20; + $page = $request['page'] ?? 1; $start = max(0, ($page - 1) * $count); @@ -64,7 +64,7 @@ class Favorites extends BaseApi $statuses = Post::selectForUser($uid, [], $condition, $params); - $include_entities = strtolower(($_REQUEST['include_entities'] ?? 'false') == 'true'); + $include_entities = strtolower(($request['include_entities'] ?? 'false') == 'true'); $ret = []; while ($status = DBA::fetch($statuses)) { diff --git a/src/Module/Api/Twitter/Statuses/Destroy.php b/src/Module/Api/Twitter/Statuses/Destroy.php index a8c4be6f4e..4fd95eaaef 100644 --- a/src/Module/Api/Twitter/Statuses/Destroy.php +++ b/src/Module/Api/Twitter/Statuses/Destroy.php @@ -26,6 +26,7 @@ use Friendica\Module\BaseApi; use Friendica\DI; use Friendica\Model\Contact; use Friendica\Model\Item; +use Friendica\Network\HTTPException\BadRequestException; /** * Destroys a specific status. @@ -39,10 +40,12 @@ class Destroy extends BaseApi BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); $uid = BaseApi::getCurrentUserID(); - if (empty($this->parameters['id'])) { - $id = intval($request['id'] ?? 0); - } else { + if (!empty($this->parameters['id'])) { $id = (int)$this->parameters['id']; + } elseif (!empty($request['id'])) { + $id = (int)$request['id']; + } else { + throw new BadRequestException('An id is missing.'); } $this->logger->notice('API: api_statuses_destroy: ' . $id); diff --git a/src/Module/Api/Twitter/Statuses/Retweet.php b/src/Module/Api/Twitter/Statuses/Retweet.php index 15fc26925f..8319b097d2 100644 --- a/src/Module/Api/Twitter/Statuses/Retweet.php +++ b/src/Module/Api/Twitter/Statuses/Retweet.php @@ -70,6 +70,6 @@ class Retweet extends BaseApi $status_info = DI::twitterStatus()->createFromItemId($item_id, $uid)->toArray(); - DI::apiResponse()->exit('status', ['status' => $status_info], $this->parameters['extension'] ?? null); + DI::apiResponse()->exit('statuses', ['status' => $status_info], $this->parameters['extension'] ?? null); } } diff --git a/src/Module/Api/Twitter/Statuses/Show.php b/src/Module/Api/Twitter/Statuses/Show.php index 66939bf7ac..905c220f6d 100644 --- a/src/Module/Api/Twitter/Statuses/Show.php +++ b/src/Module/Api/Twitter/Statuses/Show.php @@ -42,14 +42,14 @@ class Show extends BaseApi $uid = BaseApi::getCurrentUserID(); if (empty($this->parameters['id'])) { - $id = intval($_REQUEST['id'] ?? 0); + $id = intval($request['id'] ?? 0); } else { $id = (int)$this->parameters['id']; } Logger::notice('API: api_statuses_show: ' . $id); - $conversation = !empty($_REQUEST['conversation']); + $conversation = !empty($request['conversation']); // try to fetch the item for the local user - or the public item, if there is no local one $uri_item = Post::selectFirst(['uri-id'], ['id' => $id]); @@ -79,7 +79,7 @@ class Show extends BaseApi throw new BadRequestException(sprintf("There is no status or conversation with the id %d.", $id)); } - $include_entities = strtolower(($_REQUEST['include_entities'] ?? 'false') == 'true'); + $include_entities = strtolower(($request['include_entities'] ?? 'false') == 'true'); $ret = []; while ($status = DBA::fetch($statuses)) { @@ -92,7 +92,7 @@ class Show extends BaseApi $this->response->exit('statuses', $data, $this->parameters['extension'] ?? null, Contact::getPublicIdByUserId($uid)); } else { $data = ['status' => $ret[0]]; - $this->response->exit('status', ['status' => $data], $this->parameters['extension'] ?? null, Contact::getPublicIdByUserId($uid)); + $this->response->exit('status', $data, $this->parameters['extension'] ?? null, Contact::getPublicIdByUserId($uid)); } } } diff --git a/src/Module/Api/Twitter/Statuses/Update.php b/src/Module/Api/Twitter/Statuses/Update.php index 18cb932f80..381af155f0 100644 --- a/src/Module/Api/Twitter/Statuses/Update.php +++ b/src/Module/Api/Twitter/Statuses/Update.php @@ -44,7 +44,7 @@ use HTMLPurifier_Config; */ class Update extends BaseApi { - public function post(array $request = [], array $post = []) + public function post(array $request = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); @@ -101,10 +101,10 @@ class Update extends BaseApi $item['coord'] = sprintf("%s %s", $request['lat'], $request['long']); } - $item['allow_cid'] = $owner['allow_cid']; - $item['allow_gid'] = $owner['allow_gid']; - $item['deny_cid'] = $owner['deny_cid']; - $item['deny_gid'] = $owner['deny_gid']; + $item['allow_cid'] = $owner['allow_cid'] ?? ''; + $item['allow_gid'] = $owner['allow_gid'] ?? ''; + $item['deny_cid'] = $owner['deny_cid'] ?? ''; + $item['deny_gid'] = $owner['deny_gid'] ?? ''; if (!empty($item['allow_cid'] . $item['allow_gid'] . $item['deny_cid'] . $item['deny_gid'])) { $item['private'] = Item::PRIVATE; @@ -127,8 +127,8 @@ class Update extends BaseApi $item['object-type'] = Activity\ObjectType::NOTE; } - if (!empty($_REQUEST['media_ids'])) { - $ids = explode(',', $_REQUEST['media_ids']); + if (!empty($request['media_ids'])) { + $ids = explode(',', $request['media_ids']); } elseif (!empty($_FILES['media'])) { // upload the image if we have one $picture = Photo::upload($uid, $_FILES['media']); diff --git a/src/Module/Api/Twitter/Statuses/UserTimeline.php b/src/Module/Api/Twitter/Statuses/UserTimeline.php index ba713c7651..65f5c35146 100644 --- a/src/Module/Api/Twitter/Statuses/UserTimeline.php +++ b/src/Module/Api/Twitter/Statuses/UserTimeline.php @@ -40,17 +40,17 @@ class UserTimeline extends BaseApi BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); $uid = BaseApi::getCurrentUserID(); - Logger::info('api_statuses_user_timeline', ['api_user' => $uid, '_REQUEST' => $_REQUEST]); + Logger::info('api_statuses_user_timeline', ['api_user' => $uid, '_REQUEST' => $request]); - $cid = BaseApi::getContactIDForSearchterm($_REQUEST['screen_name'] ?? '', $_REQUEST['profileurl'] ?? '', $_REQUEST['user_id'] ?? 0, $uid); - $since_id = $_REQUEST['since_id'] ?? 0; - $max_id = $_REQUEST['max_id'] ?? 0; - $exclude_replies = !empty($_REQUEST['exclude_replies']); - $conversation_id = $_REQUEST['conversation_id'] ?? 0; + $cid = BaseApi::getContactIDForSearchterm($request['screen_name'] ?? '', $request['profileurl'] ?? '', $request['user_id'] ?? 0, $uid); + $since_id = $request['since_id'] ?? 0; + $max_id = $request['max_id'] ?? 0; + $exclude_replies = !empty($request['exclude_replies']); + $conversation_id = $request['conversation_id'] ?? 0; // pagination - $count = $_REQUEST['count'] ?? 20; - $page = $_REQUEST['page'] ?? 1; + $count = $request['count'] ?? 20; + $page = $request['page'] ?? 1; $start = max(0, ($page - 1) * $count); @@ -74,7 +74,7 @@ class UserTimeline extends BaseApi $params = ['order' => ['id' => true], 'limit' => [$start, $count]]; $statuses = Post::selectForUser($uid, [], $condition, $params); - $include_entities = strtolower(($_REQUEST['include_entities'] ?? 'false') == 'true'); + $include_entities = strtolower(($request['include_entities'] ?? 'false') == 'true'); $ret = []; while ($status = DBA::fetch($statuses)) { @@ -82,6 +82,6 @@ class UserTimeline extends BaseApi } DBA::close($statuses); - $this->response->exit('user', ['status' => $ret], $this->parameters['extension'] ?? null, Contact::getPublicIdByUserId($uid)); + $this->response->exit('statuses', ['status' => $ret], $this->parameters['extension'] ?? null, Contact::getPublicIdByUserId($uid)); } } diff --git a/src/Module/Api/Twitter/Users/Lookup.php b/src/Module/Api/Twitter/Users/Lookup.php index 9d4c460c6e..2633020e84 100644 --- a/src/Module/Api/Twitter/Users/Lookup.php +++ b/src/Module/Api/Twitter/Users/Lookup.php @@ -39,8 +39,8 @@ class Lookup extends BaseApi $users = []; - if (!empty($_REQUEST['user_id'])) { - foreach (explode(',', $_REQUEST['user_id']) as $cid) { + if (!empty($request['user_id'])) { + foreach (explode(',', $request['user_id']) as $cid) { if (!empty($cid) && is_numeric($cid)) { $users[] = DI::twitterUser()->createFromContactId((int)$cid, $uid, false)->toArray(); } diff --git a/src/Module/Api/Twitter/Users/Search.php b/src/Module/Api/Twitter/Users/Search.php index 9c7be2f515..d53ba1e9b6 100644 --- a/src/Module/Api/Twitter/Users/Search.php +++ b/src/Module/Api/Twitter/Users/Search.php @@ -42,15 +42,15 @@ class Search extends BaseApi $userlist = []; - if (!empty($_GET['q'])) { + if (!empty($request['q'])) { $contacts = Contact::selectToArray( ['id'], [ '`uid` = 0 AND (`name` = ? OR `nick` = ? OR `url` = ? OR `addr` = ?)', - $_GET['q'], - $_GET['q'], - $_GET['q'], - $_GET['q'], + $request['q'], + $request['q'], + $request['q'], + $request['q'], ] ); @@ -63,12 +63,12 @@ class Search extends BaseApi } $userlist = ['users' => $userlist]; } else { - throw new NotFoundException('User ' . $_GET['q'] . ' not found.'); + throw new NotFoundException('User ' . $request['q'] . ' not found.'); } } else { throw new BadRequestException('No search term specified.'); } - $this->response->exit('users', ['user' => $userlist], $this->parameters['extension'] ?? null); + $this->response->exit('users', $userlist, $this->parameters['extension'] ?? null); } } diff --git a/src/Module/Api/Twitter/Users/Show.php b/src/Module/Api/Twitter/Users/Show.php index ce662eb352..77f79166de 100644 --- a/src/Module/Api/Twitter/Users/Show.php +++ b/src/Module/Api/Twitter/Users/Show.php @@ -38,7 +38,7 @@ class Show extends BaseApi $uid = BaseApi::getCurrentUserID(); if (empty($this->parameters['id'])) { - $cid = BaseApi::getContactIDForSearchterm($_REQUEST['screen_name'] ?? '', $_REQUEST['profileurl'] ?? '', $_REQUEST['user_id'] ?? 0, $uid); + $cid = BaseApi::getContactIDForSearchterm($request['screen_name'] ?? '', $request['profileurl'] ?? '', $request['user_id'] ?? 0, $uid); } else { $cid = (int)$this->parameters['id']; } diff --git a/tests/datasets/api.fixture.php b/tests/datasets/api.fixture.php index a8705696f2..5f87159c49 100644 --- a/tests/datasets/api.fixture.php +++ b/tests/datasets/api.fixture.php @@ -69,7 +69,8 @@ return [ 'username' => 'Test user', 'nickname' => 'selfcontact', 'verified' => 1, - 'password' => '$2y$10$DLRNTRmJgKe1cSrFJ5Jb0edCqvXlA9sh/RHdSnfxjbR.04yZRm4Qm', + 'prvkey' => "-----BEGIN RSA PRIVATE KEY-----\nMIICXgIBAAKBgQDVqxF9kIgtgRL0+q+jTi578FA1r1+crEmlYc0pdxcbmmrhjuRc\nrK1gX3r0mnP25fkHzG+6CAjgbDBRFM1/RXBCyp/KHVks7eQ4yr4MxTRlsxo5qf2o\nnbyNzM7Q+LZhFhe/yIoGN/fuEjlqBE98IfPOrUjsQPX240vGNXIkfLiAWwIDAQAB\nAoGBAIwuiPIdggqAtWQ+mD8HCx5LQwSFw6/xpPu5F7ZNqL52aAsGCbL3o2QoIG4c\na1qf9Ot16BNgNBqxQF3hzRTkBMrKYlmNTUkwJXun/zjQJq2JvOlcrSuXlIucUjs4\nXekVN25aYPHrX9m2FEIUwZTb4UYXbR80KbIDI53BkQ6EwSbpAkEA7aO49CR2Hf1Y\n1d2GaUI/Z0wvbj//+t0Kg0bPt16ca8KVjEQQA5ylsDaiw510jDz9NBQxSOk6If23\nUeRixc1RDQJBAOYtN4YnPM1Zfp6IxXlqMCc+xUWRTPEPFt+WpG+v79koNamAeA6o\nZzTl92hl58IqSdbgojeE2zXWQRvlimFMLQcCQQCV6jND0byyLqFcSeQBg0l8YROK\n+dUC7W80YfeoNod3c8nkMwvnO2tLPyxvO2XLEq6prBNra7bAus5rWyj0oBIBAkEA\n1EvUMFm0TLpEfLgtWuTD8Q6GKLnxO0ztjd+FXrXpBGN/ywyArxRHzJRmctW6wmz6\nmcOqGobhIHCysKYv0bnOtQJAc2M5RwlASHH4jGJzXgt3nboyiJfufM0RV9iry3ho\nCXQRWAONKoLqnsfC6qNP8OzY8FMJcwmPWj7Q/6z6yLBFTA==\n-----END RSA PRIVATE KEY-----", + 'pubkey' => "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVqxF9kIgtgRL0+q+jTi578FA1\nr1+crEmlYc0pdxcbmmrhjuRcrK1gX3r0mnP25fkHzG+6CAjgbDBRFM1/RXBCyp/K\nHVks7eQ4yr4MxTRlsxo5qf2onbyNzM7Q+LZhFhe/yIoGN/fuEjlqBE98IfPOrUjs\nQPX240vGNXIkfLiAWwIDAQAB\n-----END PUBLIC KEY-----", 'password' => '$2y$10$DLRNTRmJgKe1cSrFJ5Jb0edCqvXlA9sh/RHdSnfxjbR.04yZRm4Qm', 'theme' => 'frio', ], ], @@ -137,6 +138,8 @@ return [ 'nurl' => 'http://localhost/profile/selfcontact', 'url' => 'http://localhost/profile/selfcontact', 'about' => 'User used in tests', + 'prvkey' => "-----BEGIN RSA PRIVATE KEY-----\nMIICXgIBAAKBgQDVqxF9kIgtgRL0+q+jTi578FA1r1+crEmlYc0pdxcbmmrhjuRc\nrK1gX3r0mnP25fkHzG+6CAjgbDBRFM1/RXBCyp/KHVks7eQ4yr4MxTRlsxo5qf2o\nnbyNzM7Q+LZhFhe/yIoGN/fuEjlqBE98IfPOrUjsQPX240vGNXIkfLiAWwIDAQAB\nAoGBAIwuiPIdggqAtWQ+mD8HCx5LQwSFw6/xpPu5F7ZNqL52aAsGCbL3o2QoIG4c\na1qf9Ot16BNgNBqxQF3hzRTkBMrKYlmNTUkwJXun/zjQJq2JvOlcrSuXlIucUjs4\nXekVN25aYPHrX9m2FEIUwZTb4UYXbR80KbIDI53BkQ6EwSbpAkEA7aO49CR2Hf1Y\n1d2GaUI/Z0wvbj//+t0Kg0bPt16ca8KVjEQQA5ylsDaiw510jDz9NBQxSOk6If23\nUeRixc1RDQJBAOYtN4YnPM1Zfp6IxXlqMCc+xUWRTPEPFt+WpG+v79koNamAeA6o\nZzTl92hl58IqSdbgojeE2zXWQRvlimFMLQcCQQCV6jND0byyLqFcSeQBg0l8YROK\n+dUC7W80YfeoNod3c8nkMwvnO2tLPyxvO2XLEq6prBNra7bAus5rWyj0oBIBAkEA\n1EvUMFm0TLpEfLgtWuTD8Q6GKLnxO0ztjd+FXrXpBGN/ywyArxRHzJRmctW6wmz6\nmcOqGobhIHCysKYv0bnOtQJAc2M5RwlASHH4jGJzXgt3nboyiJfufM0RV9iry3ho\nCXQRWAONKoLqnsfC6qNP8OzY8FMJcwmPWj7Q/6z6yLBFTA==\n-----END RSA PRIVATE KEY-----", + 'pubkey' => "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVqxF9kIgtgRL0+q+jTi578FA1\nr1+crEmlYc0pdxcbmmrhjuRcrK1gX3r0mnP25fkHzG+6CAjgbDBRFM1/RXBCyp/K\nHVks7eQ4yr4MxTRlsxo5qf2onbyNzM7Q+LZhFhe/yIoGN/fuEjlqBE98IfPOrUjs\nQPX240vGNXIkfLiAWwIDAQAB\n-----END PUBLIC KEY-----", 'pending' => 0, 'blocked' => 0, 'rel' => Contact::FOLLOWER, @@ -259,7 +262,7 @@ return [ "header" => null, "addr" => "selfcontact@localhost", "alias" => null, - "pubkey" => "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzLquDFnFxNYZZFQNbA9f\nkgtUJpC+MPrhxhEsjxme1ivvE4itdPnCueBHifknUkwfmqormyeqr4TdoVbNuKRg\nj2QRBdtaGbUJLQVdbiTKFOmJIYMtV05WIIHEhUW84fwIXmF+6u3kbOw+sIjWY3OW\nwC/2+54HiYS2n8cddfwoZBim6Na8yyQI8pQSKqJ+I4gDfkGuoVex0svNPEv9liLE\nykpQ3PuoeLJV2Wex0Cy6FYPgcfH6xvvUVxh6e8w0w22jC3DJInfDrmbw5H7aUbf+\nMMwV3TVI6/CqTO0cLEOZUjsUwdm6lIV0O0fTsrkjU9G0bc0sLJl7n9i9ICDOKOMf\nCLaK2Pj2sVbpkzXJoufLUDf0oSftdVvN9jR9WYxRdnwsyF8N/xVTw8AsyHhkXawR\n3YDgi6i2uZj5kvG7GPBf7EPZ/MpbGhEZB+/GQuZuyhLdgFDSi/uX8STBmn1jI/zY\nTLZ8JCwMzFKAXAtYaBPklZBbcRyz9O1893MsAXO8d6ODTOkD324gAjRUtuOMscYc\nWV98NZIUSbqQrznmMoJn1fiMNVgx+UXOPkiZuDxnrr1T3vynKnl5LXmadx2YeoAf\nxPeCoDb0eJtCDLcsTZ9qlztaEaohPV+H3HBSpdItea7LgAbccILHPssk9tUgmHVl\na5yV8uFenhKKQ9g93Pt63LsCAwEAAQ==\n-----END PUBLIC KEY-----", + "pubkey" => "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVqxF9kIgtgRL0+q+jTi578FA1\nr1+crEmlYc0pdxcbmmrhjuRcrK1gX3r0mnP25fkHzG+6CAjgbDBRFM1/RXBCyp/K\nHVks7eQ4yr4MxTRlsxo5qf2onbyNzM7Q+LZhFhe/yIoGN/fuEjlqBE98IfPOrUjs\nQPX240vGNXIkfLiAWwIDAQAB\n-----END PUBLIC KEY-----", "subscribe" => "/follow?url={uri}", "baseurl" => null, "gsid" => null, @@ -833,6 +836,16 @@ return [ 'gid' => 1, 'contact-id' => 42, ], + [ + 'id' => 2, + 'gid' => 1, + 'contact-id' => 42, + ], + [ + 'id' => 3, + 'gid' => 2, + 'contact-id' => 43, + ], ], 'search' => [ [ diff --git a/tests/legacy/ApiTest.php b/tests/legacy/ApiTest.php index 2067a35362..f469217de4 100644 --- a/tests/legacy/ApiTest.php +++ b/tests/legacy/ApiTest.php @@ -112,55 +112,6 @@ class ApiTest extends FixtureTest BasicAuth::setCurrentUserID($this->selfUser['id']); } - /** - * Assert that an user array contains expected keys. - * - * @param array $user User array - * - * @return void - */ - private function assertSelfUser(array $user) - { - self::assertEquals($this->selfUser['id'], $user['uid']); - self::assertEquals($this->selfUser['id'], $user['cid']); - self::assertEquals(1, $user['self']); - self::assertEquals('DFRN', $user['location']); - self::assertEquals($this->selfUser['name'], $user['name']); - self::assertEquals($this->selfUser['nick'], $user['screen_name']); - self::assertEquals('dfrn', $user['network']); - self::assertTrue($user['verified']); - } - - /** - * Assert that an user array contains expected keys. - * - * @param array $user User array - * - * @return void - */ - private function assertOtherUser(array $user = []) - { - self::assertEquals($this->otherUser['id'], $user['id']); - self::assertEquals($this->otherUser['id'], $user['id_str']); - self::assertEquals($this->otherUser['name'], $user['name']); - self::assertEquals($this->otherUser['nick'], $user['screen_name']); - self::assertFalse($user['verified']); - } - - /** - * Assert that a status array contains expected keys. - * - * @param array $status Status array - * - * @return void - */ - private function assertStatus(array $status = []) - { - self::assertIsString($status['text'] ?? ''); - self::assertIsInt($status['id'] ?? ''); - // We could probably do more checks here. - } - /** * Assert that a list array contains expected keys. * @@ -884,232 +835,6 @@ class ApiTest extends FixtureTest // api_statuses_mediap('json'); } - /** - * Test the api_statuses_update() function. - * - * @return void - */ - public function testApiStatusesUpdate() - { - /* - $_REQUEST['status'] = 'Status content #friendica'; - $_REQUEST['in_reply_to_status_id'] = -1; - $_REQUEST['lat'] = 48; - $_REQUEST['long'] = 7; - $_FILES = [ - 'media' => [ - 'id' => 666, - 'size' => 666, - 'width' => 666, - 'height' => 666, - 'tmp_name' => $this->getTempImage(), - 'name' => 'spacer.png', - 'type' => 'image/png' - ] - ]; - - $result = api_statuses_update('json'); - self::assertStatus($result['status']); - */ - } - - /** - * Test the api_statuses_update() function with an HTML status. - * - * @return void - */ - public function testApiStatusesUpdateWithHtml() - { - /* - $_REQUEST['htmlstatus'] = 'Status content'; - - $result = api_statuses_update('json'); - self::assertStatus($result['status']); - */ - } - - /** - * Test the api_statuses_update() function without an authenticated user. - * - * @return void - */ - public function testApiStatusesUpdateWithoutAuthenticatedUser() - { - /* - $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); - BasicAuth::setCurrentUserID(); - $_SESSION['authenticated'] = false; - api_statuses_update('json'); - */ - } - - /** - * Test the api_statuses_update() function with a parent status. - * - * @return void - */ - public function testApiStatusesUpdateWithParent() - { - $this->markTestIncomplete('This triggers an exit() somewhere and kills PHPUnit.'); - } - - /** - * Test the api_statuses_update() function with a media_ids parameter. - * - * @return void - */ - public function testApiStatusesUpdateWithMediaIds() - { - $this->markTestIncomplete(); - } - - /** - * Test the api_statuses_update() function with the throttle limit reached. - * - * @return void - */ - public function testApiStatusesUpdateWithDayThrottleReached() - { - $this->markTestIncomplete(); - } - - - - /** - * Test the api_statuses_repeat() function. - * - * @return void - */ - public function testApiStatusesRepeat() - { - // $this->expectException(\Friendica\Network\HTTPException\ForbiddenException::class); - // api_statuses_repeat('json'); - } - - /** - * Test the api_statuses_repeat() function without an authenticated user. - * - * @return void - */ - public function testApiStatusesRepeatWithoutAuthenticatedUser() - { - // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); - // BasicAuth::setCurrentUserID(); - // $_SESSION['authenticated'] = false; - // api_statuses_repeat('json'); - } - - /** - * Test the api_statuses_repeat() function with an ID. - * - * @return void - */ - public function testApiStatusesRepeatWithId() - { - // DI::args()->setArgv(['', '', '', 1]); - // $result = api_statuses_repeat('json'); - // self::assertStatus($result['status']); - - // Also test with a shared status - // DI::args()->setArgv(['', '', '', 5]); - // $result = api_statuses_repeat('json'); - // self::assertStatus($result['status']); - } - - /** - * Test the api_favorites_create_destroy() function. - * - * @return void - */ - public function testApiFavoritesCreateDestroy() - { - // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); - // DI::args()->setArgv(['api', '1.1', 'favorites', 'create']); - // api_favorites_create_destroy('json'); - } - - /** - * Test the api_favorites_create_destroy() function with an invalid ID. - * - * @return void - */ - public function testApiFavoritesCreateDestroyWithInvalidId() - { - // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); - // DI::args()->setArgv(['api', '1.1', 'favorites', 'create', '12.json']); - // api_favorites_create_destroy('json'); - } - - /** - * Test the api_favorites_create_destroy() function with an invalid action. - * - * @return void - */ - public function testApiFavoritesCreateDestroyWithInvalidAction() - { - // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); - // DI::args()->setArgv(['api', '1.1', 'favorites', 'change.json']); - // $_REQUEST['id'] = 1; - // api_favorites_create_destroy('json'); - } - - /** - * Test the api_favorites_create_destroy() function with the create action. - * - * @return void - */ - public function testApiFavoritesCreateDestroyWithCreateAction() - { - // DI::args()->setArgv(['api', '1.1', 'favorites', 'create.json']); - // $_REQUEST['id'] = 3; - // $result = api_favorites_create_destroy('json'); - // self::assertStatus($result['status']); - } - - /** - * Test the api_favorites_create_destroy() function with the create action and an RSS result. - * - * @return void - */ - public function testApiFavoritesCreateDestroyWithCreateActionAndRss() - { - // DI::args()->setArgv(['api', '1.1', 'favorites', 'create.rss']); - // $_REQUEST['id'] = 3; - // $result = api_favorites_create_destroy('rss'); - // self::assertXml($result, 'status'); - } - - /** - * Test the api_favorites_create_destroy() function with the destroy action. - * - * @return void - */ - public function testApiFavoritesCreateDestroyWithDestroyAction() - { - // DI::args()->setArgv(['api', '1.1', 'favorites', 'destroy.json']); - // $_REQUEST['id'] = 3; - // $result = api_favorites_create_destroy('json'); - // self::assertStatus($result['status']); - } - - /** - * Test the api_favorites_create_destroy() function without an authenticated user. - * - * @return void - */ - public function testApiFavoritesCreateDestroyWithoutAuthenticatedUser() - { - /* - $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); - DI::args()->setArgv(['api', '1.1', 'favorites', 'create.json']); - BasicAuth::setCurrentUserID(); - $_SESSION['authenticated'] = false; - api_favorites_create_destroy('json'); - */ - } - - - /** * Test the api_format_messages() function. * diff --git a/tests/src/Module/Api/ApiTest.php b/tests/src/Module/Api/ApiTest.php index 154f54a1cf..91c7f21a02 100644 --- a/tests/src/Module/Api/ApiTest.php +++ b/tests/src/Module/Api/ApiTest.php @@ -22,6 +22,7 @@ namespace Friendica\Test\src\Module\Api; use Friendica\App; +use Friendica\Capabilities\ICanCreateResponses; use Friendica\Core\Addon; use Friendica\Core\Hook; use Friendica\Database\Database; @@ -32,9 +33,35 @@ use Friendica\Test\FixtureTest; use Friendica\Test\Util\AppDouble; use Friendica\Test\Util\AuthenticationDouble; use Friendica\Test\Util\AuthTestConfig; +use Psr\Http\Message\ResponseInterface; abstract class ApiTest extends FixtureTest { + // User data that the test database is populated with + const SELF_USER = [ + 'id' => 42, + 'name' => 'Self contact', + 'nick' => 'selfcontact', + 'nurl' => 'http://localhost/profile/selfcontact' + ]; + + const FRIEND_USER = [ + 'id' => 44, + 'name' => 'Friend contact', + 'nick' => 'friendcontact', + 'nurl' => 'http://localhost/profile/friendcontact' + ]; + + const OTHER_USER = [ + 'id' => 43, + 'name' => 'othercontact', + 'nick' => 'othercontact', + 'nurl' => 'http://localhost/profile/othercontact' + ]; + + // User ID that we know is not in the database + const WRONG_USER_ID = 666; + /** * Assert that the string is XML and contain the root element. * @@ -50,6 +77,92 @@ abstract class ApiTest extends FixtureTest // We could probably do more checks here. } + /** + * Assert that an user array contains expected keys. + * + * @param \stdClass $user User + * + * @return void + */ + protected function assertSelfUser(\stdClass $user) + { + self::assertEquals(self::SELF_USER['id'], $user->uid); + self::assertEquals(self::SELF_USER['id'], $user->cid); + self::assertEquals(1, $user->self); + self::assertEquals('DFRN', $user->location); + self::assertEquals(self::SELF_USER['name'], $user->name); + self::assertEquals(self::SELF_USER['nick'], $user->screen_name); + self::assertEquals('dfrn', $user->network); + self::assertTrue($user->verified); + } + + /** + * Assert that an user array contains expected keys. + * + * @param \stdClass $user User + * + * @return void + */ + protected function assertOtherUser(\stdClass $user) + { + self::assertEquals(self::OTHER_USER['id'], $user->id); + self::assertEquals(self::OTHER_USER['id'], $user->id_str); + self::assertEquals(self::OTHER_USER['name'], $user->name); + self::assertEquals(self::OTHER_USER['nick'], $user->screen_name); + self::assertFalse($user->verified); + } + + /** + * Assert that a status array contains expected keys. + * + * @param \stdClass $status Status + * + * @return void + */ + protected function assertStatus(\stdClass $status) + { + self::assertIsString($status->text); + self::assertIsInt($status->id); + // We could probably do more checks here. + } + + /** + * Get the path to a temporary empty PNG image. + * + * @return string Path + */ + protected function getTempImage() + { + $tmpFile = tempnam(sys_get_temp_dir(), 'tmp_file'); + file_put_contents( + $tmpFile, + base64_decode( + // Empty 1x1 px PNG image + 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==' + ) + ); + + return $tmpFile; + } + + /** + * Transforms a response into a JSON class + * + * @param ResponseInterface $response + * + * @return mixed + */ + protected function toJson(ResponseInterface $response) + { + self::assertEquals(ICanCreateResponses::TYPE_JSON, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); + + $body = (string)$response->getBody(); + + self::assertJson($body); + + return json_decode($body); + } + protected function setUp(): void { parent::setUp(); // TODO: Change the autogenerated stub @@ -63,7 +176,7 @@ abstract class ApiTest extends FixtureTest DI::app()->setIsLoggedIn(true); AuthTestConfig::$authenticated = true; - AuthTestConfig::$user_id = 42; + AuthTestConfig::$user_id = 42; $this->installAuthTest(); } diff --git a/tests/src/Module/Api/Friendica/NotificationTest.php b/tests/src/Module/Api/Friendica/NotificationTest.php index b5e2a41665..f05387bd88 100644 --- a/tests/src/Module/Api/Friendica/NotificationTest.php +++ b/tests/src/Module/Api/Friendica/NotificationTest.php @@ -78,7 +78,16 @@ XML; $notification = new Notification(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json']); $response = $notification->run(); - self::assertJson($response->getBody()); + $json = $this->toJson($response); + + self::assertIsArray($json); + + foreach ($json as $note) { + self::assertIsInt($note->id); + self::assertIsInt($note->uid); + self::assertIsString($note->msg); + } + self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); } } diff --git a/tests/src/Module/Api/Friendica/Photo/DeleteTest.php b/tests/src/Module/Api/Friendica/Photo/DeleteTest.php index 8c49456b36..05808d56c4 100644 --- a/tests/src/Module/Api/Friendica/Photo/DeleteTest.php +++ b/tests/src/Module/Api/Friendica/Photo/DeleteTest.php @@ -53,11 +53,7 @@ class DeleteTest extends ApiTest $delete = new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); $response = $delete->run(['photo_id' => '709057080661a283a6aa598501504178']); - $responseText = (string)$response->getBody(); - - self::assertJson($responseText); - - $json = json_decode($responseText); + $json = $this->toJson($response); self::assertEquals('deleted', $json->result); self::assertEquals('photo with id `709057080661a283a6aa598501504178` has been deleted from server.', $json->message); diff --git a/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php b/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php index 88355483a3..230ba70c89 100644 --- a/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php +++ b/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php @@ -49,11 +49,7 @@ class DeleteTest extends ApiTest $delete = new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); $response = $delete->run(['album' => 'test_album']); - $responseText = (string)$response->getBody(); - - self::assertJson($responseText); - - $json = json_decode($responseText); + $json = $this->toJson($response); self::assertEquals('deleted', $json->result); self::assertEquals('album `test_album` with all containing photos has been deleted.', $json->message); diff --git a/tests/src/Module/Api/Friendica/Photoalbum/UpdateTest.php b/tests/src/Module/Api/Friendica/Photoalbum/UpdateTest.php index 22ca155cbb..fa4638e370 100644 --- a/tests/src/Module/Api/Friendica/Photoalbum/UpdateTest.php +++ b/tests/src/Module/Api/Friendica/Photoalbum/UpdateTest.php @@ -58,11 +58,7 @@ class UpdateTest extends ApiTest $response = (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(['album' => 'test_album', 'album_new' => 'test_album_2']); - $responseBody = (string)$response->getBody(); - - self::assertJson($responseBody); - - $json = json_decode($responseBody); + $json = $this->toJson($response); self::assertEquals('updated', $json->result); self::assertEquals('album `test_album` with all containing photos has been renamed to `test_album_2`.', $json->message); diff --git a/tests/src/Module/Api/GnuSocial/GnuSocial/ConfigTest.php b/tests/src/Module/Api/GnuSocial/GnuSocial/ConfigTest.php index 3cc1df2961..b1874d8386 100644 --- a/tests/src/Module/Api/GnuSocial/GnuSocial/ConfigTest.php +++ b/tests/src/Module/Api/GnuSocial/GnuSocial/ConfigTest.php @@ -19,13 +19,8 @@ class ConfigTest extends ApiTest $config = new Config(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); $response = $config->run(); - $body = (string)$response->getBody(); - self::assertJson($body); - - $json = json_decode($body); - - self::assertEquals(1, 1); + $json = $this->toJson($response); self::assertEquals('localhost', $json->site->server); self::assertEquals('frio', $json->site->theme); diff --git a/tests/src/Module/Api/GnuSocial/Help/TestTest.php b/tests/src/Module/Api/GnuSocial/Help/TestTest.php index 5aa4286812..858c9b6cdc 100644 --- a/tests/src/Module/Api/GnuSocial/Help/TestTest.php +++ b/tests/src/Module/Api/GnuSocial/Help/TestTest.php @@ -14,8 +14,10 @@ class TestTest extends ApiTest $test = new Test(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json']); $response = $test->run(); + $json = $this->toJson($response); + self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); - self::assertEquals('"ok"', $response->getBody()); + self::assertEquals('ok', $json); } public function testXml() diff --git a/tests/src/Module/Api/Mastodon/Accounts/StatusesTest.php b/tests/src/Module/Api/Mastodon/Accounts/StatusesTest.php index f2a709531c..297c92bae1 100644 --- a/tests/src/Module/Api/Mastodon/Accounts/StatusesTest.php +++ b/tests/src/Module/Api/Mastodon/Accounts/StatusesTest.php @@ -2,9 +2,6 @@ namespace Friendica\Test\src\Module\Api\Mastodon\Accounts; -use Friendica\App\Router; -use Friendica\DI; -use Friendica\Module\Api\Mastodon\Accounts\Statuses; use Friendica\Test\src\Module\Api\ApiTest; class StatusesTest extends ApiTest diff --git a/tests/src/Module/Api/Mastodon/Accounts/VerifyCredentialsTest.php b/tests/src/Module/Api/Mastodon/Accounts/VerifyCredentialsTest.php index 5170f1cb2f..51d76696f6 100644 --- a/tests/src/Module/Api/Mastodon/Accounts/VerifyCredentialsTest.php +++ b/tests/src/Module/Api/Mastodon/Accounts/VerifyCredentialsTest.php @@ -19,11 +19,7 @@ class VerifyCredentialsTest extends ApiTest $verifyCredentials = new VerifyCredentials(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); $response = $verifyCredentials->run(); - $body = (string)$response->getBody(); - - self::assertJson($body); - - $json = json_decode($body); + $json = $this->toJson($response); self::assertEquals(48, $json->id); self::assertIsArray($json->emojis); diff --git a/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php b/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php index 1368990d08..a76b5d87e0 100644 --- a/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php +++ b/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php @@ -15,7 +15,7 @@ class RateLimitStatusTest extends ApiTest $rateLimitStatus = new RateLimitStatus(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET], ['extension' => 'json']); $response = $rateLimitStatus->run(); - $result = json_decode($response->getBody()); + $result = $this->toJson($response); self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); self::assertEquals(150, $result->remaining_hits); diff --git a/tests/src/Module/Api/Twitter/Account/UpdateProfileTest.php b/tests/src/Module/Api/Twitter/Account/UpdateProfileTest.php index 4ce3420d26..e06e8d4848 100644 --- a/tests/src/Module/Api/Twitter/Account/UpdateProfileTest.php +++ b/tests/src/Module/Api/Twitter/Account/UpdateProfileTest.php @@ -17,11 +17,7 @@ class UpdateProfileTest extends ApiTest $updateProfile = new UpdateProfile(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST], ['extension' => 'json']); $response = $updateProfile->run(['name' => 'new_name', 'description' => 'new_description']); - $body = (string)$response->getBody(); - - self::assertJson($body); - - $json = json_decode($body); + $json = $this->toJson($response); self::assertEquals('new_name', $json->name); self::assertEquals('new_description', $json->description); diff --git a/tests/src/Module/Api/Twitter/Blocks/ListsTest.php b/tests/src/Module/Api/Twitter/Blocks/ListsTest.php index 4f63581a70..a37b59f036 100644 --- a/tests/src/Module/Api/Twitter/Blocks/ListsTest.php +++ b/tests/src/Module/Api/Twitter/Blocks/ListsTest.php @@ -17,11 +17,7 @@ class ListsTest extends ApiTest $lists = new Lists(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); $response = $lists->run(); - $body = (string)$response->getBody(); - - self::assertJson($body); - - $json = json_decode($body); + $json = $this->toJson($response); self::assertIsArray($json->users); } diff --git a/tests/src/Module/Api/Twitter/ContactEndpointTest.php b/tests/src/Module/Api/Twitter/ContactEndpointTest.php index 65d28c4522..01e337cf78 100644 --- a/tests/src/Module/Api/Twitter/ContactEndpointTest.php +++ b/tests/src/Module/Api/Twitter/ContactEndpointTest.php @@ -32,6 +32,8 @@ class ContactEndpointTest extends FixtureTest { public function testIds() { + self::markTestIncomplete('Needs overall refactoring due changed method signature - Calling MrPetovan for help ;-)'); + /* $expectedEmpty = [ 'ids' => [], @@ -77,6 +79,8 @@ class ContactEndpointTest extends FixtureTest */ public function testIdsStringify() { + self::markTestIncomplete('Needs overall refactoring due changed method signature - Calling MrPetovan for help ;-)'); + /* $result = ContactEndpointMock::ids(Contact::SHARING, 42, -1, ContactEndpoint::DEFAULT_COUNT, true); @@ -88,6 +92,8 @@ class ContactEndpointTest extends FixtureTest public function testIdsPagination() { + self::markTestIncomplete('Needs overall refactoring due changed method signature - Calling MrPetovan for help ;-)'); + /* $expectedDefaultPageResult = [ 'ids' => [45], @@ -172,6 +178,8 @@ class ContactEndpointTest extends FixtureTest */ public function testList() { + self::markTestIncomplete('Needs overall refactoring due changed method signature - Calling MrPetovan for help ;-)'); + /* $expectedEmpty = [ 'users' => [], diff --git a/tests/src/Module/Api/Twitter/Favorites/CreateTest.php b/tests/src/Module/Api/Twitter/Favorites/CreateTest.php new file mode 100644 index 0000000000..00a99643bf --- /dev/null +++ b/tests/src/Module/Api/Twitter/Favorites/CreateTest.php @@ -0,0 +1,74 @@ +expectException(BadRequestException::class); + + $create = new Create(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); + $create->run(); + } + + /** + * Test the api_favorites_create_destroy() function with the create action. + * + * @return void + */ + public function testApiFavoritesCreateDestroyWithCreateAction() + { + $create = new Create(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); + $response = $create->run(['id' => 3]); + + $json = $this->toJson($response); + + self::assertStatus($json); + } + + /** + * Test the api_favorites_create_destroy() function with the create action and an RSS result. + * + * @return void + */ + public function testApiFavoritesCreateDestroyWithCreateActionAndRss() + { + $create = new Create(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST], ['extension' => ICanCreateResponses::TYPE_RSS]); + $response = $create->run(['id' => 3]); + + self::assertEquals(ICanCreateResponses::TYPE_RSS, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); + + self::assertXml((string)$response->getBody(), 'statuses'); + } + + /** + * Test the api_favorites_create_destroy() function without an authenticated user. + * + * @return void + */ + public function testApiFavoritesCreateDestroyWithoutAuthenticatedUser() + { + self::markTestIncomplete('Needs refactoring of Lists - replace filter_input() with $request parameter checks'); + + /* + $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); + DI::args()->setArgv(['api', '1.1', 'favorites', 'create.json']); + BasicAuth::setCurrentUserID(); + $_SESSION['authenticated'] = false; + api_favorites_create_destroy('json'); + */ + } +} diff --git a/tests/src/Module/Api/Twitter/Favorites/DestroyTest.php b/tests/src/Module/Api/Twitter/Favorites/DestroyTest.php new file mode 100644 index 0000000000..3d8ce8a212 --- /dev/null +++ b/tests/src/Module/Api/Twitter/Favorites/DestroyTest.php @@ -0,0 +1,58 @@ +expectException(BadRequestException::class); + + $destroy = new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); + $destroy->run(); + } + + /** + * Test the api_favorites_create_destroy() function with the destroy action. + * + * @return void + */ + public function testApiFavoritesCreateDestroyWithDestroyAction() + { + $destroy = new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); + $response = $destroy->run(['id' => 3]); + + $json = $this->toJson($response); + + self::assertStatus($json); + } + + /** + * Test the api_favorites_create_destroy() function without an authenticated user. + * + * @return void + */ + public function testApiFavoritesCreateDestroyWithoutAuthenticatedUser() + { + self::markTestIncomplete('Needs refactoring of Lists - replace filter_input() with $request parameter checks'); + + /* + $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); + DI::args()->setArgv(['api', '1.1', 'favorites', 'create.json']); + BasicAuth::setCurrentUserID(); + $_SESSION['authenticated'] = false; + api_favorites_create_destroy('json'); + */ + } +} diff --git a/tests/src/Module/Api/Twitter/FavoritesTest.php b/tests/src/Module/Api/Twitter/FavoritesTest.php index 26729144ee..dd95d73f90 100644 --- a/tests/src/Module/Api/Twitter/FavoritesTest.php +++ b/tests/src/Module/Api/Twitter/FavoritesTest.php @@ -2,6 +2,10 @@ namespace Friendica\Test\src\Module\Api\Twitter; +use Friendica\App\Router; +use Friendica\Capabilities\ICanCreateResponses; +use Friendica\DI; +use Friendica\Module\Api\Twitter\Favorites; use Friendica\Test\src\Module\Api\ApiTest; class FavoritesTest extends ApiTest @@ -13,14 +17,17 @@ class FavoritesTest extends ApiTest */ public function testApiFavorites() { - /* - $_REQUEST['page'] = -1; - $_REQUEST['max_id'] = 10; - $result = api_favorites('json'); - foreach ($result['status'] as $status) { - self::assertStatus($status); + $favorites = new Favorites(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $response = $favorites->run([ + 'page' => -1, + 'max_id' => 10, + ]); + + $json = $this->toJson($response); + + foreach ($json as $status) { + $this->assertStatus($status); } - */ } /** @@ -30,8 +37,12 @@ class FavoritesTest extends ApiTest */ public function testApiFavoritesWithRss() { - // $result = api_favorites('rss'); - // self::assertXml($result, 'statuses'); + $favorites = new Favorites(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET], ['extension' => ICanCreateResponses::TYPE_RSS]); + $response = $favorites->run(); + + self::assertEquals(ICanCreateResponses::TYPE_RSS, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); + + self::assertXml((string)$response->getBody(), 'statuses'); } /** @@ -41,6 +52,8 @@ class FavoritesTest extends ApiTest */ public function testApiFavoritesWithUnallowedUser() { + self::markTestIncomplete('Needs BasicAuth as dynamic method for overriding first'); + // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); // BasicAuth::setCurrentUserID(); // api_favorites('json'); diff --git a/tests/src/Module/Api/Twitter/Followers/ListsTest.php b/tests/src/Module/Api/Twitter/Followers/ListsTest.php index c1e053e5a1..7ea3863eaf 100644 --- a/tests/src/Module/Api/Twitter/Followers/ListsTest.php +++ b/tests/src/Module/Api/Twitter/Followers/ListsTest.php @@ -17,11 +17,7 @@ class ListsTest extends ApiTest $lists = new Lists(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); $response = $lists->run(); - $body = (string)$response->getBody(); - - self::assertJson($body); - - $json = json_decode($body); + $json = $this->toJson($response); self::assertIsArray($json->users); } diff --git a/tests/src/Module/Api/Twitter/Friends/ListsTest.php b/tests/src/Module/Api/Twitter/Friends/ListsTest.php index 363f8d73c3..7cb5bd10a7 100644 --- a/tests/src/Module/Api/Twitter/Friends/ListsTest.php +++ b/tests/src/Module/Api/Twitter/Friends/ListsTest.php @@ -19,11 +19,7 @@ class ListsTest extends ApiTest $lists = new Lists(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); $response = $lists->run(); - $body = (string)$response->getBody(); - - self::assertJson($body); - - $json = json_decode($body); + $json = $this->toJson($response); self::assertIsArray($json->users); } diff --git a/tests/src/Module/Api/Twitter/Friendships/IncomingTest.php b/tests/src/Module/Api/Twitter/Friendships/IncomingTest.php index 8c5cb6426b..c1309e1f0a 100644 --- a/tests/src/Module/Api/Twitter/Friendships/IncomingTest.php +++ b/tests/src/Module/Api/Twitter/Friendships/IncomingTest.php @@ -19,11 +19,7 @@ class IncomingTest extends ApiTest $lists = new Incoming(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); $response = $lists->run(); - $body = (string)$response->getBody(); - - self::assertJson($body); - - $json = json_decode($body); + $json = $this->toJson($response); self::assertIsArray($json->ids); } diff --git a/tests/src/Module/Api/Twitter/Lists/StatusesTest.php b/tests/src/Module/Api/Twitter/Lists/StatusesTest.php index 5d989b71e7..3f47fcaca6 100644 --- a/tests/src/Module/Api/Twitter/Lists/StatusesTest.php +++ b/tests/src/Module/Api/Twitter/Lists/StatusesTest.php @@ -31,11 +31,7 @@ class StatusesTest extends ApiTest $lists = new Statuses(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); $response = $lists->run(['list_id' => 1, 'page' => -1, 'max_id' => 10]); - $body = (string)$response->getBody(); - - self::assertJson($body); - - $json = json_decode($body); + $json = $this->toJson($response); foreach ($json as $status) { self::assertIsString($status->text); diff --git a/tests/src/Module/Api/Twitter/Media/UploadTest.php b/tests/src/Module/Api/Twitter/Media/UploadTest.php index abc9d8fdc6..4b0ffada12 100644 --- a/tests/src/Module/Api/Twitter/Media/UploadTest.php +++ b/tests/src/Module/Api/Twitter/Media/UploadTest.php @@ -72,30 +72,12 @@ class UploadTest extends ApiTest ]; $response = (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(); - $media = json_decode($response->getBody(), true); - self::assertEquals('image/png', $media['image']['image_type']); - self::assertEquals(1, $media['image']['w']); - self::assertEquals(1, $media['image']['h']); - self::assertNotEmpty($media['image']['friendica_preview_url']); - } + $media = $this->toJson($response); - /** - * Get the path to a temporary empty PNG image. - * - * @return string Path - */ - private function getTempImage() - { - $tmpFile = tempnam(sys_get_temp_dir(), 'tmp_file'); - file_put_contents( - $tmpFile, - base64_decode( - // Empty 1x1 px PNG image - 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==' - ) - ); - - return $tmpFile; + self::assertEquals('image/png', $media->image->image_type); + self::assertEquals(1, $media->image->w); + self::assertEquals(1, $media->image->h); + self::assertNotEmpty($media->image->friendica_preview_url); } } diff --git a/tests/src/Module/Api/Twitter/SavedSearchesTest.php b/tests/src/Module/Api/Twitter/SavedSearchesTest.php index 14973b3912..5735f8eef0 100644 --- a/tests/src/Module/Api/Twitter/SavedSearchesTest.php +++ b/tests/src/Module/Api/Twitter/SavedSearchesTest.php @@ -14,7 +14,7 @@ class SavedSearchesTest extends ApiTest $savedSearch = new SavedSearches(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json']); $response = $savedSearch->run(); - $result = json_decode($response->getBody()); + $result = $this->toJson($response); self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); self::assertEquals(1, $result[0]->id); diff --git a/tests/src/Module/Api/Twitter/Statuses/DestroyTest.php b/tests/src/Module/Api/Twitter/Statuses/DestroyTest.php index 73f32c5d6b..9b2110eb6b 100644 --- a/tests/src/Module/Api/Twitter/Statuses/DestroyTest.php +++ b/tests/src/Module/Api/Twitter/Statuses/DestroyTest.php @@ -2,6 +2,10 @@ namespace Friendica\Test\src\Module\Api\Twitter\Statuses; +use Friendica\App\Router; +use Friendica\DI; +use Friendica\Module\Api\Twitter\Statuses\Destroy; +use Friendica\Network\HTTPException\BadRequestException; use Friendica\Test\src\Module\Api\ApiTest; class DestroyTest extends ApiTest @@ -13,8 +17,10 @@ class DestroyTest extends ApiTest */ public function testApiStatusesDestroy() { - // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); - // api_statuses_destroy('json'); + $this->expectException(BadRequestException::class); + + $destroy = new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); + $destroy->run(); } /** @@ -24,6 +30,8 @@ class DestroyTest extends ApiTest */ public function testApiStatusesDestroyWithoutAuthenticatedUser() { + self::markTestIncomplete('Needs BasicAuth as dynamic method for overriding first'); + // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); // BasicAuth::setCurrentUserID(); // $_SESSION['authenticated'] = false; @@ -37,8 +45,13 @@ class DestroyTest extends ApiTest */ public function testApiStatusesDestroyWithId() { - // DI::args()->setArgv(['', '', '', 1]); - // $result = api_statuses_destroy('json'); - // self::assertStatus($result['status']); + $destroy = new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); + $response = $destroy->run(['id' => 1]); + + $json = $this->toJson($response); + + self::assertEquals(1, $json->id); + self::assertIsObject($json->user); + self::assertIsObject($json->friendica_author); } } diff --git a/tests/src/Module/Api/Twitter/Statuses/MentionsTest.php b/tests/src/Module/Api/Twitter/Statuses/MentionsTest.php index fb9a6b0b29..364af4a569 100644 --- a/tests/src/Module/Api/Twitter/Statuses/MentionsTest.php +++ b/tests/src/Module/Api/Twitter/Statuses/MentionsTest.php @@ -2,6 +2,10 @@ namespace Friendica\Test\src\Module\Api\Twitter\Statuses; +use Friendica\App\Router; +use Friendica\Capabilities\ICanCreateResponses; +use Friendica\DI; +use Friendica\Module\Api\Twitter\Statuses\Mentions; use Friendica\Test\src\Module\Api\ApiTest; class MentionsTest extends ApiTest @@ -13,13 +17,13 @@ class MentionsTest extends ApiTest */ public function testApiStatusesMentions() { - /* - $this->app->setLoggedInUserNickname($this->selfUser['nick']); - $_REQUEST['max_id'] = 10; - $result = api_statuses_mentions('json'); - self::assertEmpty($result['status']); + $mentions = new Mentions(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $response = $mentions->run(['max_id' => 10]); + + $json = $this->toJson($response); + + self::assertEmpty($json); // We should test with mentions in the database. - */ } /** @@ -29,9 +33,13 @@ class MentionsTest extends ApiTest */ public function testApiStatusesMentionsWithNegativePage() { - // $_REQUEST['page'] = -2; - // $result = api_statuses_mentions('json'); - // self::assertEmpty($result['status']); + $mentions = new Mentions(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $response = $mentions->run(['page' => -2]); + + $json = $this->toJson($response); + + self::assertEmpty($json); + // We should test with mentions in the database. } /** @@ -41,6 +49,8 @@ class MentionsTest extends ApiTest */ public function testApiStatusesMentionsWithUnallowedUser() { + self::markTestIncomplete('Needs BasicAuth as dynamic method for overriding first'); + // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); // BasicAuth::setCurrentUserID(); // api_statuses_mentions('json'); @@ -53,7 +63,11 @@ class MentionsTest extends ApiTest */ public function testApiStatusesMentionsWithRss() { - // $result = api_statuses_mentions('rss'); - // self::assertXml($result, 'statuses'); + $mentions = new Mentions(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET], ['extension' => ICanCreateResponses::TYPE_RSS]); + $response = $mentions->run(['page' => -2]); + + self::assertEquals(ICanCreateResponses::TYPE_RSS, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); + + self::assertXml((string)$response->getBody(), 'statuses'); } } diff --git a/tests/src/Module/Api/Twitter/Statuses/NetworkPublicTimelineTest.php b/tests/src/Module/Api/Twitter/Statuses/NetworkPublicTimelineTest.php index e340753f42..7d75cdd7d7 100644 --- a/tests/src/Module/Api/Twitter/Statuses/NetworkPublicTimelineTest.php +++ b/tests/src/Module/Api/Twitter/Statuses/NetworkPublicTimelineTest.php @@ -2,6 +2,10 @@ namespace Friendica\Test\src\Module\Api\Twitter\Statuses; +use Friendica\App\Router; +use Friendica\Capabilities\ICanCreateResponses; +use Friendica\DI; +use Friendica\Module\Api\Twitter\Statuses\NetworkPublicTimeline; use Friendica\Test\src\Module\Api\ApiTest; class NetworkPublicTimelineTest extends ApiTest @@ -13,14 +17,17 @@ class NetworkPublicTimelineTest extends ApiTest */ public function testApiStatusesNetworkpublicTimeline() { - /* - $_REQUEST['max_id'] = 10; - $result = api_statuses_networkpublic_timeline('json'); - self::assertNotEmpty($result['status']); - foreach ($result['status'] as $status) { - self::assertStatus($status); + $networkPublicTimeline = new NetworkPublicTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $response = $networkPublicTimeline->run(['max_id' => 10]); + + $json = $this->toJson($response); + + self::assertIsArray($json); + self::assertNotEmpty($json); + foreach ($json as $status) { + self::assertIsString($status->text); + self::assertIsInt($status->id); } - */ } /** @@ -30,14 +37,17 @@ class NetworkPublicTimelineTest extends ApiTest */ public function testApiStatusesNetworkpublicTimelineWithNegativePage() { - /* - $_REQUEST['page'] = -2; - $result = api_statuses_networkpublic_timeline('json'); - self::assertNotEmpty($result['status']); - foreach ($result['status'] as $status) { - self::assertStatus($status); + $networkPublicTimeline = new NetworkPublicTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $response = $networkPublicTimeline->run(['page' => -2]); + + $json = $this->toJson($response); + + self::assertIsArray($json); + self::assertNotEmpty($json); + foreach ($json as $status) { + self::assertIsString($status->text); + self::assertIsInt($status->id); } - */ } /** @@ -47,6 +57,8 @@ class NetworkPublicTimelineTest extends ApiTest */ public function testApiStatusesNetworkpublicTimelineWithUnallowedUser() { + self::markTestIncomplete('Needs BasicAuth as dynamic method for overriding first'); + // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); // BasicAuth::setCurrentUserID(); // api_statuses_networkpublic_timeline('json'); @@ -59,7 +71,11 @@ class NetworkPublicTimelineTest extends ApiTest */ public function testApiStatusesNetworkpublicTimelineWithRss() { - // $result = api_statuses_networkpublic_timeline('rss'); - // self::assertXml($result, 'statuses'); + $networkPublicTimeline = new NetworkPublicTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET], ['extension' => ICanCreateResponses::TYPE_RSS]); + $response = $networkPublicTimeline->run(['page' => -2]); + + self::assertEquals(ICanCreateResponses::TYPE_RSS, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); + + self::assertXml((string)$response->getBody(), 'statuses'); } } diff --git a/tests/src/Module/Api/Twitter/Statuses/RetweetTest.php b/tests/src/Module/Api/Twitter/Statuses/RetweetTest.php new file mode 100644 index 0000000000..1b527ccc9f --- /dev/null +++ b/tests/src/Module/Api/Twitter/Statuses/RetweetTest.php @@ -0,0 +1,70 @@ +expectException(BadRequestException::class); + + $retweet = new Retweet(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); + $retweet->run(); + } + + /** + * Test the api_statuses_repeat() function without an authenticated user. + * + * @return void + */ + public function testApiStatusesRepeatWithoutAuthenticatedUser() + { + self::markTestIncomplete('Needs BasicAuth as dynamic method for overriding first'); + + // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); + // BasicAuth::setCurrentUserID(); + // $_SESSION['authenticated'] = false; + // api_statuses_repeat('json'); + } + + /** + * Test the api_statuses_repeat() function with an ID. + * + * @return void + */ + public function testApiStatusesRepeatWithId() + { + $retweet = new Retweet(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); + $response = $retweet->run(['id' => 1]); + + $json = $this->toJson($response); + + self::assertStatus($json); + } + + /** + * Test the api_statuses_repeat() function with an shared ID. + * + * @return void + */ + public function testApiStatusesRepeatWithSharedId() + { + $retweet = new Retweet(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); + $response = $retweet->run(['id' => 5]); + + $json = $this->toJson($response); + + self::assertStatus($json); + } +} diff --git a/tests/src/Module/Api/Twitter/Statuses/ShowTest.php b/tests/src/Module/Api/Twitter/Statuses/ShowTest.php index 00fcbd5541..c2d87a95f4 100644 --- a/tests/src/Module/Api/Twitter/Statuses/ShowTest.php +++ b/tests/src/Module/Api/Twitter/Statuses/ShowTest.php @@ -2,6 +2,10 @@ namespace Friendica\Test\src\Module\Api\Twitter\Statuses; +use Friendica\App\Router; +use Friendica\DI; +use Friendica\Module\Api\Twitter\Statuses\Show; +use Friendica\Network\HTTPException\BadRequestException; use Friendica\Test\src\Module\Api\ApiTest; class ShowTest extends ApiTest @@ -13,8 +17,10 @@ class ShowTest extends ApiTest */ public function testApiStatusesShow() { - // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); - // api_statuses_show('json'); + $this->expectException(BadRequestException::class); + + $show = new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $show->run(); } /** @@ -24,9 +30,13 @@ class ShowTest extends ApiTest */ public function testApiStatusesShowWithId() { - // DI::args()->setArgv(['', '', '', 1]); - // $result = api_statuses_show('json'); - // self::assertStatus($result['status']); + $show = new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $response = $show->run(['id' => 1]); + + $json = $this->toJson($response); + + self::assertIsInt($json->id); + self::assertIsString($json->text); } /** @@ -36,15 +46,17 @@ class ShowTest extends ApiTest */ public function testApiStatusesShowWithConversation() { - /* - DI::args()->setArgv(['', '', '', 1]); - $_REQUEST['conversation'] = 1; - $result = api_statuses_show('json'); - self::assertNotEmpty($result['status']); - foreach ($result['status'] as $status) { - self::assertStatus($status); + $show = new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $response = $show->run(['id' => 1, 'conversation' => 1]); + + $json = $this->toJson($response); + + self::assertIsArray($json); + + foreach ($json as $status) { + self::assertIsInt($status->id); + self::assertIsString($status->text); } - */ } /** @@ -54,6 +66,8 @@ class ShowTest extends ApiTest */ public function testApiStatusesShowWithUnallowedUser() { + self::markTestIncomplete('Needs BasicAuth as dynamic method for overriding first'); + // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); // BasicAuth::setCurrentUserID(); // api_statuses_show('json'); diff --git a/tests/src/Module/Api/Twitter/Statuses/UpdateTest.php b/tests/src/Module/Api/Twitter/Statuses/UpdateTest.php new file mode 100644 index 0000000000..efa6f18066 --- /dev/null +++ b/tests/src/Module/Api/Twitter/Statuses/UpdateTest.php @@ -0,0 +1,109 @@ + [ + 'id' => 666, + 'size' => 666, + 'width' => 666, + 'height' => 666, + 'tmp_name' => $this->getTempImage(), + 'name' => 'spacer.png', + 'type' => 'image/png' + ] + ]; + + $show = new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); + $response = $show->run([ + 'status' => 'Status content #friendica', + 'in_reply_to_status_id' => 0, + 'lat' => 48, + 'long' => 7, + ]); + + $json = $this->toJson($response); + + self::assertStatus($json); + self::assertContains('Status content #friendica', $json->text); + self::assertContains('Status content #', $json->statusnet_html); + } + + /** + * Test the api_statuses_update() function with an HTML status. + * + * @return void + */ + public function testApiStatusesUpdateWithHtml() + { + $show = new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); + $response = $show->run([ + 'htmlstatus' => 'Status content', + ]); + + $json = $this->toJson($response); + + self::assertStatus($json); + } + + /** + * Test the api_statuses_update() function without an authenticated user. + * + * @return void + */ + public function testApiStatusesUpdateWithoutAuthenticatedUser() + { + self::markTestIncomplete('Needs BasicAuth as dynamic method for overriding first'); + + /* + $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); + BasicAuth::setCurrentUserID(); + $_SESSION['authenticated'] = false; + api_statuses_update('json'); + */ + } + + /** + * Test the api_statuses_update() function with a parent status. + * + * @return void + */ + public function testApiStatusesUpdateWithParent() + { + $this->markTestIncomplete('This triggers an exit() somewhere and kills PHPUnit.'); + } + + /** + * Test the api_statuses_update() function with a media_ids parameter. + * + * @return void + */ + public function testApiStatusesUpdateWithMediaIds() + { + $this->markTestIncomplete(); + } + + /** + * Test the api_statuses_update() function with the throttle limit reached. + * + * @return void + */ + public function testApiStatusesUpdateWithDayThrottleReached() + { + $this->markTestIncomplete(); + } +} diff --git a/tests/src/Module/Api/Twitter/Statuses/UserTimelineTest.php b/tests/src/Module/Api/Twitter/Statuses/UserTimelineTest.php index 1e4f9cbb7e..fc2565e31c 100644 --- a/tests/src/Module/Api/Twitter/Statuses/UserTimelineTest.php +++ b/tests/src/Module/Api/Twitter/Statuses/UserTimelineTest.php @@ -2,6 +2,10 @@ namespace Friendica\Test\src\Module\Api\Twitter\Statuses; +use Friendica\App\Router; +use Friendica\Capabilities\ICanCreateResponses; +use Friendica\DI; +use Friendica\Module\Api\Twitter\Statuses\UserTimeline; use Friendica\Test\src\Module\Api\ApiTest; class UserTimelineTest extends ApiTest @@ -13,18 +17,23 @@ class UserTimelineTest extends ApiTest */ public function testApiStatusesUserTimeline() { - /* - $_REQUEST['user_id'] = 42; - $_REQUEST['max_id'] = 10; - $_REQUEST['exclude_replies'] = true; - $_REQUEST['conversation_id'] = 7; + $networkPublicTimeline = new UserTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); - $result = api_statuses_user_timeline('json'); - self::assertNotEmpty($result['status']); - foreach ($result['status'] as $status) { - self::assertStatus($status); - } - */ + $response = $networkPublicTimeline->run([ + 'user_id' => 42, + 'max_id' => 10, + 'exclude_replies' => true, + 'conversation_id' => 7, + ]); + + $json = $this->toJson($response); + + self::assertIsArray($json); + self::assertNotEmpty($json); + foreach ($json as $status) { + self::assertIsString($status->text); + self::assertIsInt($status->id); + } } /** @@ -34,16 +43,21 @@ class UserTimelineTest extends ApiTest */ public function testApiStatusesUserTimelineWithNegativePage() { - /* - $_REQUEST['user_id'] = 42; - $_REQUEST['page'] = -2; + $networkPublicTimeline = new UserTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); - $result = api_statuses_user_timeline('json'); - self::assertNotEmpty($result['status']); - foreach ($result['status'] as $status) { - self::assertStatus($status); + $response = $networkPublicTimeline->run([ + 'user_id' => 42, + 'page' => -2, + ]); + + $json = $this->toJson($response); + + self::assertIsArray($json); + self::assertNotEmpty($json); + foreach ($json as $status) { + self::assertIsString($status->text); + self::assertIsInt($status->id); } - */ } /** @@ -53,8 +67,13 @@ class UserTimelineTest extends ApiTest */ public function testApiStatusesUserTimelineWithRss() { - // $result = api_statuses_user_timeline('rss'); - // self::assertXml($result, 'statuses'); + $networkPublicTimeline = new UserTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET], ['extension' => ICanCreateResponses::TYPE_RSS]); + + $response = $networkPublicTimeline->run(); + + self::assertEquals(ICanCreateResponses::TYPE_RSS, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); + + self::assertXml((string)$response->getBody(), 'statuses'); } /** @@ -64,6 +83,8 @@ class UserTimelineTest extends ApiTest */ public function testApiStatusesUserTimelineWithUnallowedUser() { + self::markTestIncomplete('Needs BasicAuth as dynamic method for overriding first'); + // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); // BasicAuth::setCurrentUserID(); // api_statuses_user_timeline('json'); diff --git a/tests/src/Module/Api/Twitter/Users/LookupTest.php b/tests/src/Module/Api/Twitter/Users/LookupTest.php index ddcedbc763..e54d20dcfb 100644 --- a/tests/src/Module/Api/Twitter/Users/LookupTest.php +++ b/tests/src/Module/Api/Twitter/Users/LookupTest.php @@ -2,6 +2,10 @@ namespace Friendica\Test\src\Module\Api\Twitter\Users; +use Friendica\App\Router; +use Friendica\DI; +use Friendica\Module\Api\Twitter\Users\Lookup; +use Friendica\Network\HTTPException\NotFoundException; use Friendica\Test\src\Module\Api\ApiTest; class LookupTest extends ApiTest @@ -13,8 +17,10 @@ class LookupTest extends ApiTest */ public function testApiUsersLookup() { - // $this->expectException(\Friendica\Network\HTTPException\NotFoundException::class); - // api_users_lookup('json'); + $this->expectException(NotFoundException::class); + + $lookup = new Lookup(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $lookup->run(); } /** @@ -24,8 +30,11 @@ class LookupTest extends ApiTest */ public function testApiUsersLookupWithUserId() { - // $_REQUEST['user_id'] = $this->otherUser['id']; - // $result = api_users_lookup('json'); - // self::assertOtherUser($result['users'][0]); + $lookup = new Lookup(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $respone = $lookup->run(['user_id' => static::OTHER_USER['id']]); + + $json = $this->toJson($respone); + + self::assertOtherUser($json[0]); } } diff --git a/tests/src/Module/Api/Twitter/Users/SearchTest.php b/tests/src/Module/Api/Twitter/Users/SearchTest.php index ce088a5412..4fee774dac 100644 --- a/tests/src/Module/Api/Twitter/Users/SearchTest.php +++ b/tests/src/Module/Api/Twitter/Users/SearchTest.php @@ -2,6 +2,11 @@ namespace Friendica\Test\src\Module\Api\Twitter\Users; +use Friendica\App\Router; +use Friendica\Capabilities\ICanCreateResponses; +use Friendica\DI; +use Friendica\Module\Api\Twitter\Users\Search; +use Friendica\Network\HTTPException\BadRequestException; use Friendica\Test\src\Module\Api\ApiTest; class SearchTest extends ApiTest @@ -13,9 +18,12 @@ class SearchTest extends ApiTest */ public function testApiUsersSearch() { - // $_GET['q'] = 'othercontact'; - // $result = api_users_search('json'); - // self::assertOtherUser($result['users'][0]); + $search = new Search(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $respone = $search->run(['q' => static::OTHER_USER['name']]); + + $json = $this->toJson($respone); + + self::assertOtherUser($json[0]); } /** @@ -25,9 +33,10 @@ class SearchTest extends ApiTest */ public function testApiUsersSearchWithXml() { - // $_GET['q'] = 'othercontact'; - // $result = api_users_search('xml'); - // self::assertXml($result, 'users'); + $search = new Search(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET], ['extension' => ICanCreateResponses::TYPE_XML]); + $respone = $search->run(['q' => static::OTHER_USER['name']]); + + self::assertXml((string)$respone->getBody(), 'users'); } /** @@ -37,7 +46,9 @@ class SearchTest extends ApiTest */ public function testApiUsersSearchWithoutQuery() { - // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); - // api_users_search('json'); + $this->expectException(BadRequestException::class); + + $search = new Search(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $search->run(); } } diff --git a/tests/src/Module/Api/Twitter/Users/ShowTest.php b/tests/src/Module/Api/Twitter/Users/ShowTest.php index e34f5c28a3..975bf6d8f1 100644 --- a/tests/src/Module/Api/Twitter/Users/ShowTest.php +++ b/tests/src/Module/Api/Twitter/Users/ShowTest.php @@ -2,6 +2,10 @@ namespace Friendica\Test\src\Module\Api\Twitter\Users; +use Friendica\App\Router; +use Friendica\Capabilities\ICanCreateResponses; +use Friendica\DI; +use Friendica\Module\Api\Twitter\Users\Show; use Friendica\Test\src\Module\Api\ApiTest; class ShowTest extends ApiTest @@ -13,15 +17,17 @@ class ShowTest extends ApiTest */ public function testApiUsersShow() { - /* - $result = api_users_show('json'); + $show = new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $response = $show->run(); + + $json = $this->toJson($response); + // We can't use assertSelfUser() here because the user object is missing some properties. - self::assertEquals($this->selfUser['id'], $result['user']['cid']); - self::assertEquals('DFRN', $result['user']['location']); - self::assertEquals($this->selfUser['name'], $result['user']['name']); - self::assertEquals($this->selfUser['nick'], $result['user']['screen_name']); - self::assertTrue($result['user']['verified']); - */ + self::assertEquals(static::SELF_USER['id'], $json->cid); + self::assertEquals('DFRN', $json->location); + self::assertEquals(static::SELF_USER['name'], $json->name); + self::assertEquals(static::SELF_USER['nick'], $json->screen_name); + self::assertTrue($json->verified); } /** @@ -31,7 +37,11 @@ class ShowTest extends ApiTest */ public function testApiUsersShowWithXml() { - // $result = api_users_show('xml'); - // self::assertXml($result, 'statuses'); + $show = new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET], ['extension' => ICanCreateResponses::TYPE_XML]); + $response = $show->run(); + + self::assertEquals(ICanCreateResponses::TYPE_XML, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); + + self::assertXml((string)$response->getBody(), 'statuses'); } }