6 namespace Friendica\Test\legacy;
9 use Friendica\Core\Config\Capability\IManageConfigValues;
10 use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues;
11 use Friendica\Core\Protocol;
13 use Friendica\Model\Post;
14 use Friendica\Module\Api\ApiResponse;
15 use Friendica\Module\BaseApi;
16 use Friendica\Network\HTTPException;
17 use Friendica\Security\BasicAuth;
18 use Friendica\Test\FixtureTest;
19 use Friendica\Util\Arrays;
20 use Friendica\Util\DateTimeFormat;
21 use Friendica\Util\Temporal;
22 use Monolog\Handler\TestHandler;
24 require_once __DIR__ . '/../../include/api.php';
27 * Tests for the API functions.
29 * Functions that use header() need to be tested in a separate process.
30 * @see https://phpunit.de/manual/5.7/en/appendixes.annotations.html#appendixes.annotations.runTestsInSeparateProcesses
32 * @backupGlobals enabled
34 class ApiTest extends FixtureTest
37 * @var TestHandler Can handle log-outputs
44 protected $friendUser;
48 protected $wrongUserId;
53 /** @var IManageConfigValues */
57 * Create variables used by tests.
59 protected function setUp() : void
61 global $API, $called_api;
67 /** @var IManageConfigValues $config */
68 $this->config = $this->dice->create(IManageConfigValues::class);
70 $this->config->set('system', 'url', 'http://localhost');
71 $this->config->set('system', 'hostname', 'localhost');
72 $this->config->set('system', 'worker_dont_fork', true);
75 $this->config->set('config', 'hostname', 'localhost');
76 $this->config->set('system', 'throttle_limit_day', 100);
77 $this->config->set('system', 'throttle_limit_week', 100);
78 $this->config->set('system', 'throttle_limit_month', 100);
79 $this->config->set('system', 'theme', 'system_theme');
83 $this->app = DI::app();
85 DI::args()->setArgc(1);
87 // User data that the test database is populated with
90 'name' => 'Self contact',
91 'nick' => 'selfcontact',
92 'nurl' => 'http://localhost/profile/selfcontact'
96 'name' => 'Friend contact',
97 'nick' => 'friendcontact',
98 'nurl' => 'http://localhost/profile/friendcontact'
102 'name' => 'othercontact',
103 'nick' => 'othercontact',
104 'nurl' => 'http://localhost/profile/othercontact'
107 // User ID that we know is not in the database
108 $this->wrongUserId = 666;
110 DI::session()->start();
112 // Most API require login so we force the session
114 'authenticated' => true,
115 'uid' => $this->selfUser['id']
117 BasicAuth::setCurrentUserID($this->selfUser['id']);
121 * Assert that an user array contains expected keys.
123 * @param array $user User array
127 private function assertSelfUser(array $user)
129 self::assertEquals($this->selfUser['id'], $user['uid']);
130 self::assertEquals($this->selfUser['id'], $user['cid']);
131 self::assertEquals(1, $user['self']);
132 self::assertEquals('DFRN', $user['location']);
133 self::assertEquals($this->selfUser['name'], $user['name']);
134 self::assertEquals($this->selfUser['nick'], $user['screen_name']);
135 self::assertEquals('dfrn', $user['network']);
136 self::assertTrue($user['verified']);
140 * Assert that an user array contains expected keys.
142 * @param array $user User array
146 private function assertOtherUser(array $user = [])
148 self::assertEquals($this->otherUser['id'], $user['id']);
149 self::assertEquals($this->otherUser['id'], $user['id_str']);
150 self::assertEquals($this->otherUser['name'], $user['name']);
151 self::assertEquals($this->otherUser['nick'], $user['screen_name']);
152 self::assertFalse($user['verified']);
156 * Assert that a status array contains expected keys.
158 * @param array $status Status array
162 private function assertStatus(array $status = [])
164 self::assertIsString($status['text'] ?? '');
165 self::assertIsInt($status['id'] ?? '');
166 // We could probably do more checks here.
170 * Assert that a list array contains expected keys.
172 * @param array $list List array
176 private function assertList(array $list = [])
178 self::assertIsString($list['name']);
179 self::assertIsInt($list['id']);
180 self::assertIsString('string', $list['id_str']);
181 self::assertContains($list['mode'], ['public', 'private']);
182 // We could probably do more checks here.
186 * Assert that the string is XML and contain the root element.
188 * @param string $result XML string
189 * @param string $root_element Root element name
193 private function assertXml($result = '', $root_element = '')
195 self::assertStringStartsWith('<?xml version="1.0"?>', $result);
196 self::assertStringContainsString('<' . $root_element, $result);
197 // We could probably do more checks here.
201 * Get the path to a temporary empty PNG image.
203 * @return string Path
205 private function getTempImage()
207 $tmpFile = tempnam(sys_get_temp_dir(), 'tmp_file');
211 // Empty 1x1 px PNG image
212 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg=='
220 * Test the api_user() function.
224 public function testApiUser()
226 self::assertEquals($this->selfUser['id'], BaseApi::getCurrentUserID());
230 * Test the api_user() function with an unallowed user.
234 public function testApiUserWithUnallowedUser()
236 // self::assertEquals(false, api_user());
240 * Test the api_source() function.
244 public function testApiSource()
246 self::assertEquals('api', BasicAuth::getCurrentApplicationToken()['name']);
250 * Test the api_source() function with a Twidere user agent.
254 public function testApiSourceWithTwidere()
256 $_SERVER['HTTP_USER_AGENT'] = 'Twidere';
257 self::assertEquals('Twidere', BasicAuth::getCurrentApplicationToken()['name']);
261 * Test the api_source() function with a GET parameter.
265 public function testApiSourceWithGet()
267 $_REQUEST['source'] = 'source_name';
268 self::assertEquals('source_name', BasicAuth::getCurrentApplicationToken()['name']);
272 * Test the api_date() function.
276 public function testApiDate()
278 self::assertEquals('Wed Oct 10 00:00:00 +0000 1990', DateTimeFormat::utc('1990-10-10', DateTimeFormat::API));
282 * Test the api_register_func() function.
286 public function testApiRegisterFunc()
298 self::assertTrue(is_callable($API['api_path']['func']));
302 * Test the BasicAuth::getCurrentUserID() function without any login.
304 * @runInSeparateProcess
305 * @preserveGlobalState disabled
306 * @preserveGlobalState disabled
308 public function testApiLoginWithoutLogin()
310 BasicAuth::setCurrentUserID();
311 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
312 BasicAuth::getCurrentUserID(true);
316 * Test the BasicAuth::getCurrentUserID() function with a bad login.
318 * @runInSeparateProcess
319 * @preserveGlobalState disabled
320 * @preserveGlobalState disabled
322 public function testApiLoginWithBadLogin()
324 BasicAuth::setCurrentUserID();
325 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
326 $_SERVER['PHP_AUTH_USER'] = 'user@server';
327 BasicAuth::getCurrentUserID(true);
331 * Test the BasicAuth::getCurrentUserID() function with oAuth.
335 public function testApiLoginWithOauth()
337 $this->markTestIncomplete('Can we test this easily?');
341 * Test the BasicAuth::getCurrentUserID() function with authentication provided by an addon.
345 public function testApiLoginWithAddonAuth()
347 $this->markTestIncomplete('Can we test this easily?');
351 * Test the BasicAuth::getCurrentUserID() function with a correct login.
353 * @runInSeparateProcess
354 * @preserveGlobalState disabled
355 * @doesNotPerformAssertions
357 public function testApiLoginWithCorrectLogin()
359 BasicAuth::setCurrentUserID();
360 $_SERVER['PHP_AUTH_USER'] = 'Test user';
361 $_SERVER['PHP_AUTH_PW'] = 'password';
362 BasicAuth::getCurrentUserID(true);
366 * Test the BasicAuth::getCurrentUserID() function with a remote user.
368 * @runInSeparateProcess
369 * @preserveGlobalState disabled
371 public function testApiLoginWithRemoteUser()
373 BasicAuth::setCurrentUserID();
374 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
375 $_SERVER['REDIRECT_REMOTE_USER'] = '123456dXNlcjpwYXNzd29yZA==';
376 BasicAuth::getCurrentUserID(true);
380 * Test the api_call() function.
382 * @runInSeparateProcess
383 * @preserveGlobalState disabled
385 public function testApiCall()
389 'method' => 'method',
390 'func' => function () {
391 return ['data' => ['some_data']];
394 $_SERVER['REQUEST_METHOD'] = 'method';
395 $_SERVER['QUERY_STRING'] = 'pagename=api_path';
396 $_GET['callback'] = 'callback_name';
399 'callback_name(["some_data"])',
400 api_call('api_path', 'json')
405 * Test the api_call() function with the profiled enabled.
407 * @runInSeparateProcess
408 * @preserveGlobalState disabled
410 public function testApiCallWithProfiler()
414 'method' => 'method',
415 'func' => function () {
416 return ['data' => ['some_data']];
420 $_SERVER['REQUEST_METHOD'] = 'method';
421 $_SERVER['QUERY_STRING'] = 'pagename=api_path';
423 $this->config->set('system', 'profiler', true);
424 $this->config->set('rendertime', 'callstack', true);
425 $this->app->callstack = [
426 'database' => ['some_function' => 200],
427 'database_write' => ['some_function' => 200],
428 'cache' => ['some_function' => 200],
429 'cache_write' => ['some_function' => 200],
430 'network' => ['some_function' => 200]
435 api_call('api_path', 'json')
440 * Test the api_call() function with a JSON result.
442 * @runInSeparateProcess
443 * @preserveGlobalState disabled
445 public function testApiCallWithJson()
449 'method' => 'method',
450 'func' => function () {
451 return ['data' => ['some_data']];
454 $_SERVER['REQUEST_METHOD'] = 'method';
455 $_SERVER['QUERY_STRING'] = 'pagename=api_path.json';
459 api_call('api_path.json', 'json')
464 * Test the api_call() function with an XML result.
466 * @runInSeparateProcess
467 * @preserveGlobalState disabled
469 public function testApiCallWithXml()
473 'method' => 'method',
474 'func' => function () {
478 $_SERVER['REQUEST_METHOD'] = 'method';
479 $_SERVER['QUERY_STRING'] = 'pagename=api_path.xml';
481 $args = DI::args()->determine($_SERVER, $_GET);
485 api_call('api_path.xml', 'xml')
490 * Test the api_call() function with an RSS result.
492 * @runInSeparateProcess
493 * @preserveGlobalState disabled
495 public function testApiCallWithRss()
499 'method' => 'method',
500 'func' => function () {
504 $_SERVER['REQUEST_METHOD'] = 'method';
505 $_SERVER['QUERY_STRING'] = 'pagename=api_path.rss';
508 '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
510 api_call('api_path.rss', 'rss')
515 * Test the api_call() function with an Atom result.
517 * @runInSeparateProcess
518 * @preserveGlobalState disabled
520 public function testApiCallWithAtom()
524 'method' => 'method',
525 'func' => function () {
529 $_SERVER['REQUEST_METHOD'] = 'method';
530 $_SERVER['QUERY_STRING'] = 'pagename=api_path.atom';
533 '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
535 api_call('api_path.atom', 'atom')
540 * Test the api_rss_extra() function.
544 public function testApiRssExtra()
547 $user_info = ['url' => 'user_url', 'lang' => 'en'];
548 $result = api_rss_extra([], $user_info);
549 self::assertEquals($user_info, $result['$user']);
550 self::assertEquals($user_info['url'], $result['$rss']['alternate']);
551 self::assertArrayHasKey('self', $result['$rss']);
552 self::assertArrayHasKey('base', $result['$rss']);
553 self::assertArrayHasKey('updated', $result['$rss']);
554 self::assertArrayHasKey('atom_updated', $result['$rss']);
555 self::assertArrayHasKey('language', $result['$rss']);
556 self::assertArrayHasKey('logo', $result['$rss']);
561 * Test the api_rss_extra() function without any user info.
565 public function testApiRssExtraWithoutUserInfo()
568 $result = api_rss_extra([], null);
569 self::assertIsArray($result['$user']);
570 self::assertArrayHasKey('alternate', $result['$rss']);
571 self::assertArrayHasKey('self', $result['$rss']);
572 self::assertArrayHasKey('base', $result['$rss']);
573 self::assertArrayHasKey('updated', $result['$rss']);
574 self::assertArrayHasKey('atom_updated', $result['$rss']);
575 self::assertArrayHasKey('language', $result['$rss']);
576 self::assertArrayHasKey('logo', $result['$rss']);
581 * Test the api_get_user() function.
585 public function testApiGetUser()
587 // $user = api_get_user();
588 // self::assertSelfUser($user);
589 // self::assertEquals('708fa0', $user['profile_sidebar_fill_color']);
590 // self::assertEquals('6fdbe8', $user['profile_link_color']);
591 // self::assertEquals('ededed', $user['profile_background_color']);
595 * Test the api_get_user() function with a Frio schema.
599 public function testApiGetUserWithFrioSchema()
601 // $pConfig = $this->dice->create(IManagePersonalConfigValues::class);
602 // $pConfig->set($this->selfUser['id'], 'frio', 'schema', 'red');
603 // $user = api_get_user();
604 // self::assertSelfUser($user);
605 // self::assertEquals('708fa0', $user['profile_sidebar_fill_color']);
606 // self::assertEquals('6fdbe8', $user['profile_link_color']);
607 // self::assertEquals('ededed', $user['profile_background_color']);
611 * Test the api_get_user() function with an empty Frio schema.
615 public function testApiGetUserWithEmptyFrioSchema()
617 // $pConfig = $this->dice->create(IManagePersonalConfigValues::class);
618 // $pConfig->set($this->selfUser['id'], 'frio', 'schema', '---');
619 // $user = api_get_user();
620 // self::assertSelfUser($user);
621 // self::assertEquals('708fa0', $user['profile_sidebar_fill_color']);
622 // self::assertEquals('6fdbe8', $user['profile_link_color']);
623 // self::assertEquals('ededed', $user['profile_background_color']);
627 * Test the api_get_user() function with a custom Frio schema.
631 public function testApiGetUserWithCustomFrioSchema()
633 // $pConfig = $this->dice->create(IManagePersonalConfigValues::class);
634 // $pConfig->set($this->selfUser['id'], 'frio', 'schema', '---');
635 // $pConfig->set($this->selfUser['id'], 'frio', 'nav_bg', '#123456');
636 // $pConfig->set($this->selfUser['id'], 'frio', 'link_color', '#123456');
637 // $pConfig->set($this->selfUser['id'], 'frio', 'background_color', '#123456');
638 // $user = api_get_user();
639 // self::assertSelfUser($user);
640 // self::assertEquals('123456', $user['profile_sidebar_fill_color']);
641 // self::assertEquals('123456', $user['profile_link_color']);
642 // self::assertEquals('123456', $user['profile_background_color']);
646 * Test the api_get_user() function with an user that is not allowed to use the API.
648 * @runInSeparateProcess
649 * @preserveGlobalState disabled
651 public function testApiGetUserWithoutApiUser()
653 // api_get_user() with empty parameters is not used anymore
655 $_SERVER['PHP_AUTH_USER'] = 'Test user';
656 $_SERVER['PHP_AUTH_PW'] = 'password';
657 BasicAuth::setCurrentUserID();
658 self::assertFalse(api_get_user());
663 * Test the api_get_user() function with an user ID in a GET parameter.
667 public function testApiGetUserWithGetId()
669 // self::assertOtherUser(api_get_user());
673 * Test the api_get_user() function with a wrong user ID in a GET parameter.
677 public function testApiGetUserWithWrongGetId()
679 // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
680 // self::assertOtherUser(api_get_user());
684 * Test the api_get_user() function with an user name in a GET parameter.
688 public function testApiGetUserWithGetName()
690 // self::assertSelfUser(api_get_user());
694 * Test the api_get_user() function with a profile URL in a GET parameter.
698 public function testApiGetUserWithGetUrl()
700 // self::assertSelfUser(api_get_user());
704 * Test the api_get_user() function with an user ID in the API path.
708 public function testApiGetUserWithNumericCalledApi()
710 // global $called_api;
711 // $called_api = ['api_path'];
712 // DI::args()->setArgv(['', $this->otherUser['id'] . '.json']);
713 // self::assertOtherUser(api_get_user());
717 * Test the api_get_user() function with the $called_api global variable.
721 public function testApiGetUserWithCalledApi()
723 // global $called_api;
724 // $called_api = ['api', 'api_path'];
725 // self::assertSelfUser(api_get_user());
729 * Test the Arrays::walkRecursive() function.
733 public function testApiWalkRecursive()
738 Arrays::walkRecursive(
741 // Should we test this with a callback that actually does something?
749 * Test the Arrays::walkRecursive() function with an array.
753 public function testApiWalkRecursiveWithArray()
755 $array = [['item1'], ['item2']];
758 Arrays::walkRecursive(
761 // Should we test this with a callback that actually does something?
769 * Test the BaseApi::reformatXML() function.
773 public function testApiReformatXml()
777 self::assertTrue(ApiResponse::reformatXML($item, $key));
778 self::assertEquals('true', $item);
782 * Test the BaseApi::reformatXML() function with a statusnet_api key.
786 public function testApiReformatXmlWithStatusnetKey()
789 $key = 'statusnet_api';
790 self::assertTrue(ApiResponse::reformatXML($item, $key));
791 self::assertEquals('statusnet:api', $key);
795 * Test the BaseApi::reformatXML() function with a friendica_api key.
799 public function testApiReformatXmlWithFriendicaKey()
802 $key = 'friendica_api';
803 self::assertTrue(ApiResponse::reformatXML($item, $key));
804 self::assertEquals('friendica:api', $key);
808 * Test the BaseApi::createXML() function.
812 public function testApiCreateXml()
815 '<?xml version="1.0"?>' . "\n" .
816 '<root_element xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" ' .
817 'xmlns:friendica="http://friendi.ca/schema/api/1/" ' .
818 'xmlns:georss="http://www.georss.org/georss">' . "\n" .
819 ' <data>some_data</data>' . "\n" .
820 '</root_element>' . "\n",
821 DI::apiResponse()->createXML(['data' => ['some_data']], 'root_element')
826 * Test the BaseApi::createXML() function without any XML namespace.
830 public function testApiCreateXmlWithoutNamespaces()
833 '<?xml version="1.0"?>' . "\n" .
835 ' <data>some_data</data>' . "\n" .
837 DI::apiResponse()->createXML(['data' => ['some_data']], 'ok')
842 * Test the BaseApi::formatData() function.
846 public function testApiFormatData()
848 $data = ['some_data'];
849 self::assertEquals($data, DI::apiResponse()->formatData('root_element', 'json', $data));
853 * Test the BaseApi::formatData() function with an XML result.
857 public function testApiFormatDataWithXml()
860 '<?xml version="1.0"?>' . "\n" .
861 '<root_element xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" ' .
862 'xmlns:friendica="http://friendi.ca/schema/api/1/" ' .
863 'xmlns:georss="http://www.georss.org/georss">' . "\n" .
864 ' <data>some_data</data>' . "\n" .
865 '</root_element>' . "\n",
866 DI::apiResponse()->formatData('root_element', 'xml', ['data' => ['some_data']])
871 * Test the api_account_verify_credentials() function.
875 public function testApiAccountVerifyCredentials()
877 // self::assertArrayHasKey('user', api_account_verify_credentials('json'));
881 * Test the api_account_verify_credentials() function without an authenticated user.
885 public function testApiAccountVerifyCredentialsWithoutAuthenticatedUser()
887 // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
888 // BasicAuth::setCurrentUserID();
889 // $_SESSION['authenticated'] = false;
890 // api_account_verify_credentials('json');
894 * Test the api_statuses_mediap() function.
898 public function testApiStatusesMediap()
900 DI::args()->setArgc(2);
908 'tmp_name' => $this->getTempImage(),
909 'name' => 'spacer.png',
910 'type' => 'image/png'
913 $_GET['status'] = '<b>Status content</b>';
915 $result = api_statuses_mediap('json');
916 self::assertStatus($result['status']);
920 * Test the api_statuses_mediap() function without an authenticated user.
924 public function testApiStatusesMediapWithoutAuthenticatedUser()
926 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
927 BasicAuth::setCurrentUserID();
928 $_SESSION['authenticated'] = false;
929 api_statuses_mediap('json');
933 * Test the api_statuses_update() function.
937 public function testApiStatusesUpdate()
939 $_REQUEST['status'] = 'Status content #friendica';
940 $_REQUEST['in_reply_to_status_id'] = -1;
941 $_REQUEST['lat'] = 48;
942 $_REQUEST['long'] = 7;
949 'tmp_name' => $this->getTempImage(),
950 'name' => 'spacer.png',
951 'type' => 'image/png'
955 $result = api_statuses_update('json');
956 self::assertStatus($result['status']);
960 * Test the api_statuses_update() function with an HTML status.
964 public function testApiStatusesUpdateWithHtml()
966 $_REQUEST['htmlstatus'] = '<b>Status content</b>';
968 $result = api_statuses_update('json');
969 self::assertStatus($result['status']);
973 * Test the api_statuses_update() function without an authenticated user.
977 public function testApiStatusesUpdateWithoutAuthenticatedUser()
979 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
980 BasicAuth::setCurrentUserID();
981 $_SESSION['authenticated'] = false;
982 api_statuses_update('json');
986 * Test the api_statuses_update() function with a parent status.
990 public function testApiStatusesUpdateWithParent()
992 $this->markTestIncomplete('This triggers an exit() somewhere and kills PHPUnit.');
996 * Test the api_statuses_update() function with a media_ids parameter.
1000 public function testApiStatusesUpdateWithMediaIds()
1002 $this->markTestIncomplete();
1006 * Test the api_statuses_update() function with the throttle limit reached.
1010 public function testApiStatusesUpdateWithDayThrottleReached()
1012 $this->markTestIncomplete();
1016 * Test the api_media_upload() function.
1017 * @runInSeparateProcess
1018 * @preserveGlobalState disabled
1020 public function testApiMediaUpload()
1022 $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
1027 * Test the api_media_upload() function without an authenticated user.
1031 public function testApiMediaUploadWithoutAuthenticatedUser()
1033 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1034 BasicAuth::setCurrentUserID();
1035 $_SESSION['authenticated'] = false;
1040 * Test the api_media_upload() function with an invalid uploaded media.
1044 public function testApiMediaUploadWithMedia()
1046 $this->expectException(\Friendica\Network\HTTPException\InternalServerErrorException::class);
1050 'tmp_name' => 'tmp_name'
1057 * Test the api_media_upload() function with an valid uploaded media.
1061 public function testApiMediaUploadWithValidMedia()
1069 'tmp_name' => $this->getTempImage(),
1070 'name' => 'spacer.png',
1071 'type' => 'image/png'
1075 DI::args()->setArgc(2);
1077 $result = api_media_upload();
1078 self::assertEquals('image/png', $result['media']['image']['image_type']);
1079 self::assertEquals(1, $result['media']['image']['w']);
1080 self::assertEquals(1, $result['media']['image']['h']);
1081 self::assertNotEmpty($result['media']['image']['friendica_preview_url']);
1085 * Test the api_status_show() function.
1087 public function testApiStatusShowWithJson()
1089 // $result = api_status_show('json', 1);
1090 // self::assertStatus($result['status']);
1094 * Test the api_status_show() function with an XML result.
1096 public function testApiStatusShowWithXml()
1098 // $result = api_status_show('xml', 1);
1099 // self::assertXml($result, 'statuses');
1103 * Test the api_get_last_status() function
1105 public function testApiGetLastStatus()
1107 // $item = api_get_last_status($this->selfUser['id'], $this->selfUser['id']);
1108 // self::assertNotNull($item);
1112 * Test the api_users_show() function.
1116 public function testApiUsersShow()
1119 $result = api_users_show('json');
1120 // We can't use assertSelfUser() here because the user object is missing some properties.
1121 self::assertEquals($this->selfUser['id'], $result['user']['cid']);
1122 self::assertEquals('DFRN', $result['user']['location']);
1123 self::assertEquals($this->selfUser['name'], $result['user']['name']);
1124 self::assertEquals($this->selfUser['nick'], $result['user']['screen_name']);
1125 self::assertTrue($result['user']['verified']);
1130 * Test the api_users_show() function with an XML result.
1134 public function testApiUsersShowWithXml()
1136 // $result = api_users_show('xml');
1137 // self::assertXml($result, 'statuses');
1141 * Test the api_users_search() function.
1145 public function testApiUsersSearch()
1147 // $_GET['q'] = 'othercontact';
1148 // $result = api_users_search('json');
1149 // self::assertOtherUser($result['users'][0]);
1153 * Test the api_users_search() function with an XML result.
1157 public function testApiUsersSearchWithXml()
1159 // $_GET['q'] = 'othercontact';
1160 // $result = api_users_search('xml');
1161 // self::assertXml($result, 'users');
1165 * Test the api_users_search() function without a GET q parameter.
1169 public function testApiUsersSearchWithoutQuery()
1171 // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
1172 // api_users_search('json');
1176 * Test the api_users_lookup() function.
1180 public function testApiUsersLookup()
1182 // $this->expectException(\Friendica\Network\HTTPException\NotFoundException::class);
1183 // api_users_lookup('json');
1187 * Test the api_users_lookup() function with an user ID.
1191 public function testApiUsersLookupWithUserId()
1193 // $_REQUEST['user_id'] = $this->otherUser['id'];
1194 // $result = api_users_lookup('json');
1195 // self::assertOtherUser($result['users'][0]);
1199 * Test the api_search() function.
1203 public function testApiSearch()
1206 $_REQUEST['q'] = 'reply';
1207 $_REQUEST['max_id'] = 10;
1208 $result = api_search('json');
1209 foreach ($result['status'] as $status) {
1210 self::assertStatus($status);
1211 self::assertStringContainsStringIgnoringCase('reply', $status['text'], '', true);
1217 * Test the api_search() function a count parameter.
1221 public function testApiSearchWithCount()
1224 $_REQUEST['q'] = 'reply';
1225 $_REQUEST['count'] = 20;
1226 $result = api_search('json');
1227 foreach ($result['status'] as $status) {
1228 self::assertStatus($status);
1229 self::assertStringContainsStringIgnoringCase('reply', $status['text'], '', true);
1235 * Test the api_search() function with an rpp parameter.
1239 public function testApiSearchWithRpp()
1242 $_REQUEST['q'] = 'reply';
1243 $_REQUEST['rpp'] = 20;
1244 $result = api_search('json');
1245 foreach ($result['status'] as $status) {
1246 self::assertStatus($status);
1247 self::assertStringContainsStringIgnoringCase('reply', $status['text'], '', true);
1253 * Test the api_search() function with an q parameter contains hashtag.
1254 * @doesNotPerformAssertions
1256 public function testApiSearchWithHashtag()
1259 $_REQUEST['q'] = '%23friendica';
1260 $result = api_search('json');
1261 foreach ($result['status'] as $status) {
1262 self::assertStatus($status);
1263 self::assertStringContainsStringIgnoringCase('#friendica', $status['text'], '', true);
1269 * Test the api_search() function with an exclude_replies parameter.
1270 * @doesNotPerformAssertions
1272 public function testApiSearchWithExcludeReplies()
1275 $_REQUEST['max_id'] = 10;
1276 $_REQUEST['exclude_replies'] = true;
1277 $_REQUEST['q'] = 'friendica';
1278 $result = api_search('json');
1279 foreach ($result['status'] as $status) {
1280 self::assertStatus($status);
1286 * Test the api_search() function without an authenticated user.
1290 public function testApiSearchWithUnallowedUser()
1292 // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1293 // BasicAuth::setCurrentUserID();
1294 // api_search('json');
1298 * Test the api_search() function without any GET query parameter.
1302 public function testApiSearchWithoutQuery()
1304 // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
1305 // api_search('json');
1309 * Test the api_statuses_home_timeline() function.
1313 public function testApiStatusesHomeTimeline()
1316 $_REQUEST['max_id'] = 10;
1317 $_REQUEST['exclude_replies'] = true;
1318 $_REQUEST['conversation_id'] = 1;
1319 $result = api_statuses_home_timeline('json');
1320 self::assertNotEmpty($result['status']);
1321 foreach ($result['status'] as $status) {
1322 self::assertStatus($status);
1328 * Test the api_statuses_home_timeline() function with a negative page parameter.
1332 public function testApiStatusesHomeTimelineWithNegativePage()
1335 $_REQUEST['page'] = -2;
1336 $result = api_statuses_home_timeline('json');
1337 self::assertNotEmpty($result['status']);
1338 foreach ($result['status'] as $status) {
1339 self::assertStatus($status);
1345 * Test the api_statuses_home_timeline() with an unallowed user.
1349 public function testApiStatusesHomeTimelineWithUnallowedUser()
1352 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1353 BasicAuth::setCurrentUserID();
1354 api_statuses_home_timeline('json');
1359 * Test the api_statuses_home_timeline() function with an RSS result.
1363 public function testApiStatusesHomeTimelineWithRss()
1365 // $result = api_statuses_home_timeline('rss');
1366 // self::assertXml($result, 'statuses');
1370 * Test the api_statuses_public_timeline() function.
1374 public function testApiStatusesPublicTimeline()
1377 $_REQUEST['max_id'] = 10;
1378 $_REQUEST['conversation_id'] = 1;
1379 $result = api_statuses_public_timeline('json');
1380 self::assertNotEmpty($result['status']);
1381 foreach ($result['status'] as $status) {
1382 self::assertStatus($status);
1388 * Test the api_statuses_public_timeline() function with the exclude_replies parameter.
1392 public function testApiStatusesPublicTimelineWithExcludeReplies()
1395 $_REQUEST['max_id'] = 10;
1396 $_REQUEST['exclude_replies'] = true;
1397 $result = api_statuses_public_timeline('json');
1398 self::assertNotEmpty($result['status']);
1399 foreach ($result['status'] as $status) {
1400 self::assertStatus($status);
1406 * Test the api_statuses_public_timeline() function with a negative page parameter.
1410 public function testApiStatusesPublicTimelineWithNegativePage()
1413 $_REQUEST['page'] = -2;
1414 $result = api_statuses_public_timeline('json');
1415 self::assertNotEmpty($result['status']);
1416 foreach ($result['status'] as $status) {
1417 self::assertStatus($status);
1423 * Test the api_statuses_public_timeline() function with an unallowed user.
1427 public function testApiStatusesPublicTimelineWithUnallowedUser()
1429 // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1430 // BasicAuth::setCurrentUserID();
1431 // api_statuses_public_timeline('json');
1435 * Test the api_statuses_public_timeline() function with an RSS result.
1439 public function testApiStatusesPublicTimelineWithRss()
1441 // $result = api_statuses_public_timeline('rss');
1442 // self::assertXml($result, 'statuses');
1446 * Test the api_statuses_networkpublic_timeline() function.
1450 public function testApiStatusesNetworkpublicTimeline()
1453 $_REQUEST['max_id'] = 10;
1454 $result = api_statuses_networkpublic_timeline('json');
1455 self::assertNotEmpty($result['status']);
1456 foreach ($result['status'] as $status) {
1457 self::assertStatus($status);
1463 * Test the api_statuses_networkpublic_timeline() function with a negative page parameter.
1467 public function testApiStatusesNetworkpublicTimelineWithNegativePage()
1470 $_REQUEST['page'] = -2;
1471 $result = api_statuses_networkpublic_timeline('json');
1472 self::assertNotEmpty($result['status']);
1473 foreach ($result['status'] as $status) {
1474 self::assertStatus($status);
1480 * Test the api_statuses_networkpublic_timeline() function with an unallowed user.
1484 public function testApiStatusesNetworkpublicTimelineWithUnallowedUser()
1486 // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1487 // BasicAuth::setCurrentUserID();
1488 // api_statuses_networkpublic_timeline('json');
1492 * Test the api_statuses_networkpublic_timeline() function with an RSS result.
1496 public function testApiStatusesNetworkpublicTimelineWithRss()
1498 // $result = api_statuses_networkpublic_timeline('rss');
1499 // self::assertXml($result, 'statuses');
1503 * Test the api_statuses_show() function.
1507 public function testApiStatusesShow()
1509 // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
1510 // api_statuses_show('json');
1514 * Test the api_statuses_show() function with an ID.
1518 public function testApiStatusesShowWithId()
1520 // DI::args()->setArgv(['', '', '', 1]);
1521 // $result = api_statuses_show('json');
1522 // self::assertStatus($result['status']);
1526 * Test the api_statuses_show() function with the conversation parameter.
1530 public function testApiStatusesShowWithConversation()
1533 DI::args()->setArgv(['', '', '', 1]);
1534 $_REQUEST['conversation'] = 1;
1535 $result = api_statuses_show('json');
1536 self::assertNotEmpty($result['status']);
1537 foreach ($result['status'] as $status) {
1538 self::assertStatus($status);
1544 * Test the api_statuses_show() function with an unallowed user.
1548 public function testApiStatusesShowWithUnallowedUser()
1550 // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1551 // BasicAuth::setCurrentUserID();
1552 // api_statuses_show('json');
1556 * Test the api_conversation_show() function.
1560 public function testApiConversationShow()
1562 // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
1563 // api_conversation_show('json');
1567 * Test the api_conversation_show() function with an ID.
1571 public function testApiConversationShowWithId()
1574 DI::args()->setArgv(['', '', '', 1]);
1575 $_REQUEST['max_id'] = 10;
1576 $_REQUEST['page'] = -2;
1577 $result = api_conversation_show('json');
1578 self::assertNotEmpty($result['status']);
1579 foreach ($result['status'] as $status) {
1580 self::assertStatus($status);
1586 * Test the api_conversation_show() function with an unallowed user.
1590 public function testApiConversationShowWithUnallowedUser()
1592 // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1593 // BasicAuth::setCurrentUserID();
1594 // api_conversation_show('json');
1598 * Test the api_statuses_repeat() function.
1602 public function testApiStatusesRepeat()
1604 $this->expectException(\Friendica\Network\HTTPException\ForbiddenException::class);
1605 api_statuses_repeat('json');
1609 * Test the api_statuses_repeat() function without an authenticated user.
1613 public function testApiStatusesRepeatWithoutAuthenticatedUser()
1615 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1616 BasicAuth::setCurrentUserID();
1617 $_SESSION['authenticated'] = false;
1618 api_statuses_repeat('json');
1622 * Test the api_statuses_repeat() function with an ID.
1626 public function testApiStatusesRepeatWithId()
1628 DI::args()->setArgv(['', '', '', 1]);
1629 $result = api_statuses_repeat('json');
1630 self::assertStatus($result['status']);
1632 // Also test with a shared status
1633 DI::args()->setArgv(['', '', '', 5]);
1634 $result = api_statuses_repeat('json');
1635 self::assertStatus($result['status']);
1639 * Test the api_statuses_destroy() function.
1643 public function testApiStatusesDestroy()
1645 // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
1646 // api_statuses_destroy('json');
1650 * Test the api_statuses_destroy() function without an authenticated user.
1654 public function testApiStatusesDestroyWithoutAuthenticatedUser()
1656 // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1657 // BasicAuth::setCurrentUserID();
1658 // $_SESSION['authenticated'] = false;
1659 // api_statuses_destroy('json');
1663 * Test the api_statuses_destroy() function with an ID.
1667 public function testApiStatusesDestroyWithId()
1669 // DI::args()->setArgv(['', '', '', 1]);
1670 // $result = api_statuses_destroy('json');
1671 // self::assertStatus($result['status']);
1675 * Test the api_statuses_mentions() function.
1679 public function testApiStatusesMentions()
1682 $this->app->setLoggedInUserNickname($this->selfUser['nick']);
1683 $_REQUEST['max_id'] = 10;
1684 $result = api_statuses_mentions('json');
1685 self::assertEmpty($result['status']);
1686 // We should test with mentions in the database.
1691 * Test the api_statuses_mentions() function with a negative page parameter.
1695 public function testApiStatusesMentionsWithNegativePage()
1697 // $_REQUEST['page'] = -2;
1698 // $result = api_statuses_mentions('json');
1699 // self::assertEmpty($result['status']);
1703 * Test the api_statuses_mentions() function with an unallowed user.
1707 public function testApiStatusesMentionsWithUnallowedUser()
1709 // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1710 // BasicAuth::setCurrentUserID();
1711 // api_statuses_mentions('json');
1715 * Test the api_statuses_mentions() function with an RSS result.
1719 public function testApiStatusesMentionsWithRss()
1721 // $result = api_statuses_mentions('rss');
1722 // self::assertXml($result, 'statuses');
1726 * Test the api_statuses_user_timeline() function.
1730 public function testApiStatusesUserTimeline()
1733 $_REQUEST['user_id'] = 42;
1734 $_REQUEST['max_id'] = 10;
1735 $_REQUEST['exclude_replies'] = true;
1736 $_REQUEST['conversation_id'] = 7;
1738 $result = api_statuses_user_timeline('json');
1739 self::assertNotEmpty($result['status']);
1740 foreach ($result['status'] as $status) {
1741 self::assertStatus($status);
1747 * Test the api_statuses_user_timeline() function with a negative page parameter.
1751 public function testApiStatusesUserTimelineWithNegativePage()
1754 $_REQUEST['user_id'] = 42;
1755 $_REQUEST['page'] = -2;
1757 $result = api_statuses_user_timeline('json');
1758 self::assertNotEmpty($result['status']);
1759 foreach ($result['status'] as $status) {
1760 self::assertStatus($status);
1766 * Test the api_statuses_user_timeline() function with an RSS result.
1770 public function testApiStatusesUserTimelineWithRss()
1772 // $result = api_statuses_user_timeline('rss');
1773 // self::assertXml($result, 'statuses');
1777 * Test the api_statuses_user_timeline() function with an unallowed user.
1781 public function testApiStatusesUserTimelineWithUnallowedUser()
1783 // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1784 // BasicAuth::setCurrentUserID();
1785 // api_statuses_user_timeline('json');
1789 * Test the api_favorites_create_destroy() function.
1793 public function testApiFavoritesCreateDestroy()
1795 $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
1796 DI::args()->setArgv(['api', '1.1', 'favorites', 'create']);
1797 api_favorites_create_destroy('json');
1801 * Test the api_favorites_create_destroy() function with an invalid ID.
1805 public function testApiFavoritesCreateDestroyWithInvalidId()
1807 $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
1808 DI::args()->setArgv(['api', '1.1', 'favorites', 'create', '12.json']);
1809 api_favorites_create_destroy('json');
1813 * Test the api_favorites_create_destroy() function with an invalid action.
1817 public function testApiFavoritesCreateDestroyWithInvalidAction()
1819 $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
1820 DI::args()->setArgv(['api', '1.1', 'favorites', 'change.json']);
1821 $_REQUEST['id'] = 1;
1822 api_favorites_create_destroy('json');
1826 * Test the api_favorites_create_destroy() function with the create action.
1830 public function testApiFavoritesCreateDestroyWithCreateAction()
1832 DI::args()->setArgv(['api', '1.1', 'favorites', 'create.json']);
1833 $_REQUEST['id'] = 3;
1834 $result = api_favorites_create_destroy('json');
1835 self::assertStatus($result['status']);
1839 * Test the api_favorites_create_destroy() function with the create action and an RSS result.
1843 public function testApiFavoritesCreateDestroyWithCreateActionAndRss()
1845 DI::args()->setArgv(['api', '1.1', 'favorites', 'create.rss']);
1846 $_REQUEST['id'] = 3;
1847 $result = api_favorites_create_destroy('rss');
1848 self::assertXml($result, 'status');
1852 * Test the api_favorites_create_destroy() function with the destroy action.
1856 public function testApiFavoritesCreateDestroyWithDestroyAction()
1858 DI::args()->setArgv(['api', '1.1', 'favorites', 'destroy.json']);
1859 $_REQUEST['id'] = 3;
1860 $result = api_favorites_create_destroy('json');
1861 self::assertStatus($result['status']);
1865 * Test the api_favorites_create_destroy() function without an authenticated user.
1869 public function testApiFavoritesCreateDestroyWithoutAuthenticatedUser()
1871 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1872 DI::args()->setArgv(['api', '1.1', 'favorites', 'create.json']);
1873 BasicAuth::setCurrentUserID();
1874 $_SESSION['authenticated'] = false;
1875 api_favorites_create_destroy('json');
1879 * Test the api_favorites() function.
1883 public function testApiFavorites()
1886 $_REQUEST['page'] = -1;
1887 $_REQUEST['max_id'] = 10;
1888 $result = api_favorites('json');
1889 foreach ($result['status'] as $status) {
1890 self::assertStatus($status);
1896 * Test the api_favorites() function with an RSS result.
1900 public function testApiFavoritesWithRss()
1902 // $result = api_favorites('rss');
1903 // self::assertXml($result, 'statuses');
1907 * Test the api_favorites() function with an unallowed user.
1911 public function testApiFavoritesWithUnallowedUser()
1913 // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
1914 // BasicAuth::setCurrentUserID();
1915 // api_favorites('json');
1919 * Test the api_format_messages() function.
1923 public function testApiFormatMessages()
1925 $result = api_format_messages(
1926 ['id' => 1, 'uri-id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
1927 ['id' => 2, 'uri-id' => 2, 'screen_name' => 'recipient_name'],
1928 ['id' => 3, 'uri-id' => 2, 'screen_name' => 'sender_name']
1930 self::assertEquals('item_title' . "\n" . 'item_body', $result['text']);
1931 self::assertEquals(1, $result['id']);
1932 self::assertEquals(2, $result['recipient_id']);
1933 self::assertEquals(3, $result['sender_id']);
1934 self::assertEquals('recipient_name', $result['recipient_screen_name']);
1935 self::assertEquals('sender_name', $result['sender_screen_name']);
1939 * Test the api_format_messages() function with HTML.
1943 public function testApiFormatMessagesWithHtmlText()
1945 $_GET['getText'] = 'html';
1946 $result = api_format_messages(
1947 ['id' => 1, 'uri-id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
1948 ['id' => 2, 'uri-id' => 2, 'screen_name' => 'recipient_name'],
1949 ['id' => 3, 'uri-id' => 3, 'screen_name' => 'sender_name']
1951 self::assertEquals('item_title', $result['title']);
1952 self::assertEquals('<strong>item_body</strong>', $result['text']);
1956 * Test the api_format_messages() function with plain text.
1960 public function testApiFormatMessagesWithPlainText()
1962 $_GET['getText'] = 'plain';
1963 $result = api_format_messages(
1964 ['id' => 1, 'uri-id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
1965 ['id' => 2, 'uri-id' => 2, 'screen_name' => 'recipient_name'],
1966 ['id' => 3, 'uri-id' => 3, 'screen_name' => 'sender_name']
1968 self::assertEquals('item_title', $result['title']);
1969 self::assertEquals('item_body', $result['text']);
1973 * Test the api_format_messages() function with the getUserObjects GET parameter set to false.
1977 public function testApiFormatMessagesWithoutUserObjects()
1979 $_GET['getUserObjects'] = 'false';
1980 $result = api_format_messages(
1981 ['id' => 1, 'uri-id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
1982 ['id' => 2, 'uri-id' => 2, 'screen_name' => 'recipient_name'],
1983 ['id' => 3, 'uri-id' => 3, 'screen_name' => 'sender_name']
1985 self::assertTrue(!isset($result['sender']));
1986 self::assertTrue(!isset($result['recipient']));
1990 * Test the api_convert_item() function.
1994 public function testApiConvertItem()
1997 $result = api_convert_item(
1999 'network' => 'feed',
2000 'title' => 'item_title',
2002 // We need a long string to test that it is correctly cut
2003 'body' => 'perspiciatis impedit voluptatem quis molestiae ea qui ' .
2004 'reiciendis dolorum aut ducimus sunt consequatur inventore dolor ' .
2005 'officiis pariatur doloremque nemo culpa aut quidem qui dolore ' .
2006 'laudantium atque commodi alias voluptatem non possimus aperiam ' .
2007 'ipsum rerum consequuntur aut amet fugit quia aliquid praesentium ' .
2008 'repellendus quibusdam et et inventore mollitia rerum sit autem ' .
2009 'pariatur maiores ipsum accusantium perferendis vel sit possimus ' .
2010 'veritatis nihil distinctio qui eum repellat officia illum quos ' .
2011 'impedit quam iste esse unde qui suscipit aut facilis ut inventore ' .
2012 'omnis exercitationem quo magnam consequatur maxime aut illum ' .
2013 'soluta quaerat natus unde aspernatur et sed beatae nihil ullam ' .
2014 'temporibus corporis ratione blanditiis perspiciatis impedit ' .
2015 'voluptatem quis molestiae ea qui reiciendis dolorum aut ducimus ' .
2016 'sunt consequatur inventore dolor officiis pariatur doloremque ' .
2017 'nemo culpa aut quidem qui dolore laudantium atque commodi alias ' .
2018 'voluptatem non possimus aperiam ipsum rerum consequuntur aut ' .
2019 'amet fugit quia aliquid praesentium repellendus quibusdam et et ' .
2020 'inventore mollitia rerum sit autem pariatur maiores ipsum accusantium ' .
2021 'perferendis vel sit possimus veritatis nihil distinctio qui eum ' .
2022 'repellat officia illum quos impedit quam iste esse unde qui ' .
2023 'suscipit aut facilis ut inventore omnis exercitationem quo magnam ' .
2024 'consequatur maxime aut illum soluta quaerat natus unde aspernatur ' .
2025 'et sed beatae nihil ullam temporibus corporis ratione blanditiis',
2026 'plink' => 'item_plink'
2029 self::assertStringStartsWith('item_title', $result['text']);
2030 self::assertStringStartsWith('<h4>item_title</h4><br>perspiciatis impedit voluptatem', $result['html']);
2035 * Test the api_convert_item() function with an empty item body.
2039 public function testApiConvertItemWithoutBody()
2042 $result = api_convert_item(
2044 'network' => 'feed',
2045 'title' => 'item_title',
2048 'plink' => 'item_plink'
2051 self::assertEquals("item_title", $result['text']);
2052 self::assertEquals('<h4>item_title</h4><br>item_plink', $result['html']);
2057 * Test the api_convert_item() function with the title in the body.
2061 public function testApiConvertItemWithTitleInBody()
2064 $result = api_convert_item(
2066 'title' => 'item_title',
2067 'body' => 'item_title item_body',
2071 self::assertEquals('item_title item_body', $result['text']);
2072 self::assertEquals('<h4>item_title</h4><br>item_title item_body', $result['html']);
2077 * Test the api_get_attachments() function.
2081 public function testApiGetAttachments()
2084 // self::assertEmpty(api_get_attachments($body, 0));
2088 * Test the api_get_attachments() function with an img tag.
2092 public function testApiGetAttachmentsWithImage()
2094 // $body = '[img]http://via.placeholder.com/1x1.png[/img]';
2095 // self::assertIsArray(api_get_attachments($body, 0));
2099 * Test the api_get_attachments() function with an img tag and an AndStatus user agent.
2103 public function testApiGetAttachmentsWithImageAndAndStatus()
2105 // $_SERVER['HTTP_USER_AGENT'] = 'AndStatus';
2106 // $body = '[img]http://via.placeholder.com/1x1.png[/img]';
2107 // self::assertIsArray(api_get_attachments($body, 0));
2111 * Test the api_get_entitities() function.
2115 public function testApiGetEntitities()
2118 // self::assertIsArray(api_get_entitities($text, 'bbcode', 0));
2122 * Test the api_get_entitities() function with the include_entities parameter.
2126 public function testApiGetEntititiesWithIncludeEntities()
2129 $_REQUEST['include_entities'] = 'true';
2131 $result = api_get_entitities($text, 'bbcode', 0);
2132 self::assertIsArray($result['hashtags']);
2133 self::assertIsArray($result['symbols']);
2134 self::assertIsArray($result['urls']);
2135 self::assertIsArray($result['user_mentions']);
2140 * Test the api_format_items_embeded_images() function.
2144 public function testApiFormatItemsEmbededImages()
2148 'text ' . DI::baseUrl() . '/display/item_guid',
2149 api_format_items_embeded_images(['guid' => 'item_guid'], 'text data:image/foo')
2155 * Test the api_format_items_activities() function.
2159 public function testApiFormatItemsActivities()
2161 $item = ['uid' => 0, 'uri-id' => 1];
2162 $result = DI::friendicaActivities()->createFromUriId($item['uri-id'], $item['uid']);
2163 self::assertArrayHasKey('like', $result);
2164 self::assertArrayHasKey('dislike', $result);
2165 self::assertArrayHasKey('attendyes', $result);
2166 self::assertArrayHasKey('attendno', $result);
2167 self::assertArrayHasKey('attendmaybe', $result);
2171 * Test the api_format_items_activities() function with an XML result.
2175 public function testApiFormatItemsActivitiesWithXml()
2177 $item = ['uid' => 0, 'uri-id' => 1];
2178 $result = DI::friendicaActivities()->createFromUriId($item['uri-id'], $item['uid'], 'xml');
2179 self::assertArrayHasKey('friendica:like', $result);
2180 self::assertArrayHasKey('friendica:dislike', $result);
2181 self::assertArrayHasKey('friendica:attendyes', $result);
2182 self::assertArrayHasKey('friendica:attendno', $result);
2183 self::assertArrayHasKey('friendica:attendmaybe', $result);
2187 * Test the api_format_items() function.
2188 * @doesNotPerformAssertions
2190 public function testApiFormatItems()
2193 $items = Post::selectToArray([], ['uid' => 42]);
2194 foreach ($items as $item) {
2195 $status = api_format_item($item);
2196 self::assertStatus($status);
2202 * Test the api_format_items() function with an XML result.
2203 * @doesNotPerformAssertions
2205 public function testApiFormatItemsWithXml()
2208 $items = Post::selectToArray([], ['uid' => 42]);
2209 foreach ($items as $item) {
2210 $status = api_format_item($item, 'xml');
2211 self::assertStatus($status);
2217 * Test the api_lists_list() function.
2221 public function testApiListsList()
2223 $result = api_lists_list('json');
2224 self::assertEquals(['lists_list' => []], $result);
2228 * Test the api_lists_ownerships() function.
2232 public function testApiListsOwnerships()
2234 $result = api_lists_ownerships('json');
2235 foreach ($result['lists']['lists'] as $list) {
2236 self::assertList($list);
2241 * Test the api_lists_ownerships() function without an authenticated user.
2245 public function testApiListsOwnershipsWithoutAuthenticatedUser()
2247 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
2248 BasicAuth::setCurrentUserID();
2249 $_SESSION['authenticated'] = false;
2250 api_lists_ownerships('json');
2254 * Test the api_lists_statuses() function.
2258 public function testApiListsStatuses()
2260 // $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
2261 // api_lists_statuses('json');
2265 * Test the api_lists_statuses() function with a list ID.
2266 * @doesNotPerformAssertions
2268 public function testApiListsStatusesWithListId()
2271 $_REQUEST['list_id'] = 1;
2272 $_REQUEST['page'] = -1;
2273 $_REQUEST['max_id'] = 10;
2274 $result = api_lists_statuses('json');
2275 foreach ($result['status'] as $status) {
2276 self::assertStatus($status);
2282 * Test the api_lists_statuses() function with a list ID and a RSS result.
2286 public function testApiListsStatusesWithListIdAndRss()
2288 // $_REQUEST['list_id'] = 1;
2289 // $result = api_lists_statuses('rss');
2290 // self::assertXml($result, 'statuses');
2294 * Test the api_lists_statuses() function with an unallowed user.
2298 public function testApiListsStatusesWithUnallowedUser()
2300 // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
2301 // BasicAuth::setCurrentUserID();
2302 // api_lists_statuses('json');
2306 * Test the api_statuses_f() function.
2310 public function testApiStatusesFWithFriends()
2312 // $_GET['page'] = -1;
2313 // $result = api_statuses_f('friends');
2314 // self::assertArrayHasKey('user', $result);
2318 * Test the api_statuses_f() function.
2322 public function testApiStatusesFWithFollowers()
2324 // $result = api_statuses_f('followers');
2325 // self::assertArrayHasKey('user', $result);
2329 * Test the api_statuses_f() function.
2333 public function testApiStatusesFWithBlocks()
2335 // $result = api_statuses_f('blocks');
2336 // self::assertArrayHasKey('user', $result);
2340 * Test the api_statuses_f() function.
2344 public function testApiStatusesFWithIncoming()
2346 // $result = api_statuses_f('incoming');
2347 // self::assertArrayHasKey('user', $result);
2351 * Test the api_statuses_f() function an undefined cursor GET variable.
2355 public function testApiStatusesFWithUndefinedCursor()
2357 // $_GET['cursor'] = 'undefined';
2358 // self::assertFalse(api_statuses_f('friends'));
2362 * Test the api_statuses_friends() function.
2366 public function testApiStatusesFriends()
2368 // $result = api_statuses_friends('json');
2369 // self::assertArrayHasKey('user', $result);
2373 * Test the api_statuses_friends() function an undefined cursor GET variable.
2377 public function testApiStatusesFriendsWithUndefinedCursor()
2379 // $_GET['cursor'] = 'undefined';
2380 // self::assertFalse(api_statuses_friends('json'));
2384 * Test the api_statuses_followers() function.
2388 public function testApiStatusesFollowers()
2390 // $result = api_statuses_followers('json');
2391 // self::assertArrayHasKey('user', $result);
2395 * Test the api_statuses_followers() function an undefined cursor GET variable.
2399 public function testApiStatusesFollowersWithUndefinedCursor()
2401 // $_GET['cursor'] = 'undefined';
2402 // self::assertFalse(api_statuses_followers('json'));
2406 * Test the api_blocks_list() function.
2410 public function testApiBlocksList()
2412 // $result = api_blocks_list('json');
2413 // self::assertArrayHasKey('user', $result);
2417 * Test the api_blocks_list() function an undefined cursor GET variable.
2421 public function testApiBlocksListWithUndefinedCursor()
2423 // $_GET['cursor'] = 'undefined';
2424 // self::assertFalse(api_blocks_list('json'));
2428 * Test the api_friendships_incoming() function.
2432 public function testApiFriendshipsIncoming()
2434 // $result = api_friendships_incoming('json');
2435 // self::assertArrayHasKey('id', $result);
2439 * Test the api_friendships_incoming() function an undefined cursor GET variable.
2443 public function testApiFriendshipsIncomingWithUndefinedCursor()
2445 // $_GET['cursor'] = 'undefined';
2446 // self::assertFalse(api_friendships_incoming('json'));
2450 * Test the api_statusnet_config() function.
2454 public function testApiStatusnetConfig()
2457 $result = api_statusnet_config('json');
2458 self::assertEquals('localhost', $result['config']['site']['server']);
2459 self::assertEquals('default', $result['config']['site']['theme']);
2460 self::assertEquals(DI::baseUrl() . '/images/friendica-64.png', $result['config']['site']['logo']);
2461 self::assertTrue($result['config']['site']['fancy']);
2462 self::assertEquals('en', $result['config']['site']['language']);
2463 self::assertEquals('UTC', $result['config']['site']['timezone']);
2464 self::assertEquals(200000, $result['config']['site']['textlimit']);
2465 self::assertEquals('false', $result['config']['site']['private']);
2466 self::assertEquals('false', $result['config']['site']['ssl']);
2467 self::assertEquals(30, $result['config']['site']['shorturllength']);
2472 * Test the api_direct_messages_new() function.
2476 public function testApiDirectMessagesNew()
2478 $result = api_direct_messages_new('json');
2479 self::assertNull($result);
2483 * Test the api_direct_messages_new() function without an authenticated user.
2487 public function testApiDirectMessagesNewWithoutAuthenticatedUser()
2489 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
2490 BasicAuth::setCurrentUserID();
2491 $_SESSION['authenticated'] = false;
2492 api_direct_messages_new('json');
2496 * Test the api_direct_messages_new() function with an user ID.
2500 public function testApiDirectMessagesNewWithUserId()
2502 $_POST['text'] = 'message_text';
2503 $_REQUEST['user_id'] = $this->otherUser['id'];
2504 $result = api_direct_messages_new('json');
2505 self::assertEquals(['direct_message' => ['error' => -1]], $result);
2509 * Test the api_direct_messages_new() function with a screen name.
2513 public function testApiDirectMessagesNewWithScreenName()
2515 $this->app->setLoggedInUserNickname($this->selfUser['nick']);
2516 $_POST['text'] = 'message_text';
2517 $_REQUEST['user_id'] = $this->friendUser['id'];
2518 $result = api_direct_messages_new('json');
2519 self::assertStringContainsString('message_text', $result['direct_message']['text']);
2520 self::assertEquals('selfcontact', $result['direct_message']['sender_screen_name']);
2521 self::assertEquals(1, $result['direct_message']['friendica_seen']);
2525 * Test the api_direct_messages_new() function with a title.
2529 public function testApiDirectMessagesNewWithTitle()
2531 $this->app->setLoggedInUserNickname($this->selfUser['nick']);
2532 $_POST['text'] = 'message_text';
2533 $_REQUEST['user_id'] = $this->friendUser['id'];
2534 $_REQUEST['title'] = 'message_title';
2535 $result = api_direct_messages_new('json');
2536 self::assertStringContainsString('message_text', $result['direct_message']['text']);
2537 self::assertStringContainsString('message_title', $result['direct_message']['text']);
2538 self::assertEquals('selfcontact', $result['direct_message']['sender_screen_name']);
2539 self::assertEquals(1, $result['direct_message']['friendica_seen']);
2543 * Test the api_direct_messages_new() function with an RSS result.
2547 public function testApiDirectMessagesNewWithRss()
2549 $this->app->setLoggedInUserNickname($this->selfUser['nick']);
2550 $_POST['text'] = 'message_text';
2551 $_REQUEST['user_id'] = $this->friendUser['id'];
2552 $result = api_direct_messages_new('rss');
2553 self::assertXml($result, 'direct-messages');
2557 * Test the api_direct_messages_destroy() function.
2561 public function testApiDirectMessagesDestroy()
2563 $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
2564 api_direct_messages_destroy('json');
2568 * Test the api_direct_messages_destroy() function with the friendica_verbose GET param.
2572 public function testApiDirectMessagesDestroyWithVerbose()
2574 $_GET['friendica_verbose'] = 'true';
2575 $result = api_direct_messages_destroy('json');
2579 'result' => 'error',
2580 'message' => 'message id or parenturi not specified'
2588 * Test the api_direct_messages_destroy() function without an authenticated user.
2592 public function testApiDirectMessagesDestroyWithoutAuthenticatedUser()
2594 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
2595 BasicAuth::setCurrentUserID();
2596 $_SESSION['authenticated'] = false;
2597 api_direct_messages_destroy('json');
2601 * Test the api_direct_messages_destroy() function with a non-zero ID.
2605 public function testApiDirectMessagesDestroyWithId()
2607 $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
2608 $_REQUEST['id'] = 1;
2609 api_direct_messages_destroy('json');
2613 * Test the api_direct_messages_destroy() with a non-zero ID and the friendica_verbose GET param.
2617 public function testApiDirectMessagesDestroyWithIdAndVerbose()
2619 $_REQUEST['id'] = 1;
2620 $_REQUEST['friendica_parenturi'] = 'parent_uri';
2621 $_GET['friendica_verbose'] = 'true';
2622 $result = api_direct_messages_destroy('json');
2626 'result' => 'error',
2627 'message' => 'message id not in database'
2635 * Test the api_direct_messages_destroy() function with a non-zero ID.
2639 public function testApiDirectMessagesDestroyWithCorrectId()
2641 $this->markTestIncomplete('We need to add a dataset for this.');
2645 * Test the api_direct_messages_box() function.
2649 public function testApiDirectMessagesBoxWithSentbox()
2651 $_REQUEST['page'] = -1;
2652 $_REQUEST['max_id'] = 10;
2653 $result = api_direct_messages_box('json', 'sentbox', 'false');
2654 self::assertArrayHasKey('direct_message', $result);
2658 * Test the api_direct_messages_box() function.
2662 public function testApiDirectMessagesBoxWithConversation()
2664 $result = api_direct_messages_box('json', 'conversation', 'false');
2665 self::assertArrayHasKey('direct_message', $result);
2669 * Test the api_direct_messages_box() function.
2673 public function testApiDirectMessagesBoxWithAll()
2675 $result = api_direct_messages_box('json', 'all', 'false');
2676 self::assertArrayHasKey('direct_message', $result);
2680 * Test the api_direct_messages_box() function.
2684 public function testApiDirectMessagesBoxWithInbox()
2686 $result = api_direct_messages_box('json', 'inbox', 'false');
2687 self::assertArrayHasKey('direct_message', $result);
2691 * Test the api_direct_messages_box() function.
2695 public function testApiDirectMessagesBoxWithVerbose()
2697 $result = api_direct_messages_box('json', 'sentbox', 'true');
2701 'result' => 'error',
2702 'message' => 'no mails available'
2710 * Test the api_direct_messages_box() function with a RSS result.
2714 public function testApiDirectMessagesBoxWithRss()
2716 $result = api_direct_messages_box('rss', 'sentbox', 'false');
2717 self::assertXml($result, 'direct-messages');
2721 * Test the api_direct_messages_box() function without an authenticated user.
2725 public function testApiDirectMessagesBoxWithUnallowedUser()
2727 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
2728 BasicAuth::setCurrentUserID();
2729 api_direct_messages_box('json', 'sentbox', 'false');
2733 * Test the api_direct_messages_sentbox() function.
2737 public function testApiDirectMessagesSentbox()
2739 $result = api_direct_messages_sentbox('json');
2740 self::assertArrayHasKey('direct_message', $result);
2744 * Test the api_direct_messages_inbox() function.
2748 public function testApiDirectMessagesInbox()
2750 $result = api_direct_messages_inbox('json');
2751 self::assertArrayHasKey('direct_message', $result);
2755 * Test the api_direct_messages_all() function.
2759 public function testApiDirectMessagesAll()
2761 $result = api_direct_messages_all('json');
2762 self::assertArrayHasKey('direct_message', $result);
2766 * Test the api_direct_messages_conversation() function.
2770 public function testApiDirectMessagesConversation()
2772 $result = api_direct_messages_conversation('json');
2773 self::assertArrayHasKey('direct_message', $result);
2777 * Test the api_oauth_request_token() function.
2781 public function testApiOauthRequestToken()
2783 $this->markTestIncomplete('exit() kills phpunit as well');
2787 * Test the api_oauth_access_token() function.
2791 public function testApiOauthAccessToken()
2793 $this->markTestIncomplete('exit() kills phpunit as well');
2797 * Test the api_fr_photos_list() function.
2801 public function testApiFrPhotosList()
2803 $result = api_fr_photos_list('json');
2804 self::assertArrayHasKey('photo', $result);
2808 * Test the api_fr_photos_list() function without an authenticated user.
2812 public function testApiFrPhotosListWithoutAuthenticatedUser()
2814 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
2815 BasicAuth::setCurrentUserID();
2816 $_SESSION['authenticated'] = false;
2817 api_fr_photos_list('json');
2821 * Test the api_fr_photo_create_update() function.
2823 public function testApiFrPhotoCreateUpdate()
2825 $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
2826 api_fr_photo_create_update('json');
2830 * Test the api_fr_photo_create_update() function without an authenticated user.
2834 public function testApiFrPhotoCreateUpdateWithoutAuthenticatedUser()
2836 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
2837 BasicAuth::setCurrentUserID();
2838 $_SESSION['authenticated'] = false;
2839 api_fr_photo_create_update('json');
2843 * Test the api_fr_photo_create_update() function with an album name.
2847 public function testApiFrPhotoCreateUpdateWithAlbum()
2849 $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
2850 $_REQUEST['album'] = 'album_name';
2851 api_fr_photo_create_update('json');
2855 * Test the api_fr_photo_create_update() function with the update mode.
2859 public function testApiFrPhotoCreateUpdateWithUpdate()
2861 $this->markTestIncomplete('We need to create a dataset for this');
2865 * Test the api_fr_photo_create_update() function with an uploaded file.
2869 public function testApiFrPhotoCreateUpdateWithFile()
2871 $this->markTestIncomplete();
2875 * Test the api_fr_photo_detail() function.
2879 public function testApiFrPhotoDetail()
2881 $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
2882 api_fr_photo_detail('json');
2886 * Test the api_fr_photo_detail() function without an authenticated user.
2890 public function testApiFrPhotoDetailWithoutAuthenticatedUser()
2892 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
2893 BasicAuth::setCurrentUserID();
2894 $_SESSION['authenticated'] = false;
2895 api_fr_photo_detail('json');
2899 * Test the api_fr_photo_detail() function with a photo ID.
2903 public function testApiFrPhotoDetailWithPhotoId()
2905 $this->expectException(\Friendica\Network\HTTPException\NotFoundException::class);
2906 $_REQUEST['photo_id'] = 1;
2907 api_fr_photo_detail('json');
2911 * Test the api_fr_photo_detail() function with a correct photo ID.
2915 public function testApiFrPhotoDetailCorrectPhotoId()
2917 $this->markTestIncomplete('We need to create a dataset for this.');
2921 * Test the api_account_update_profile_image() function.
2925 public function testApiAccountUpdateProfileImage()
2927 $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
2928 api_account_update_profile_image('json');
2932 * Test the api_account_update_profile_image() function without an authenticated user.
2936 public function testApiAccountUpdateProfileImageWithoutAuthenticatedUser()
2938 $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
2939 BasicAuth::setCurrentUserID();
2940 $_SESSION['authenticated'] = false;
2941 api_account_update_profile_image('json');
2945 * Test the api_account_update_profile_image() function with an uploaded file.
2949 public function testApiAccountUpdateProfileImageWithUpload()
2951 $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class);
2952 $this->markTestIncomplete();
2957 * Test the api_account_update_profile() function.
2961 public function testApiAccountUpdateProfile()
2964 $_POST['name'] = 'new_name';
2965 $_POST['description'] = 'new_description';
2966 $result = api_account_update_profile('json');
2967 // We can't use assertSelfUser() here because the user object is missing some properties.
2968 self::assertEquals($this->selfUser['id'], $result['user']['cid']);
2969 self::assertEquals('DFRN', $result['user']['location']);
2970 self::assertEquals($this->selfUser['nick'], $result['user']['screen_name']);
2971 self::assertEquals('new_name', $result['user']['name']);
2972 self::assertEquals('new_description', $result['user']['description']);
2977 * Test the check_acl_input() function.
2981 public function testCheckAclInput()
2983 $result = check_acl_input('<aclstring>', BaseApi::getCurrentUserID());
2984 // Where does this result come from?
2985 self::assertEquals(1, $result);
2989 * Test the check_acl_input() function with an empty ACL string.
2993 public function testCheckAclInputWithEmptyAclString()
2995 $result = check_acl_input(' ', BaseApi::getCurrentUserID());
2996 self::assertFalse($result);
3000 * Test the save_media_to_database() function.
3004 public function testSaveMediaToDatabase()
3006 $this->markTestIncomplete();
3010 * Test the post_photo_item() function.
3014 public function testPostPhotoItem()
3016 $this->markTestIncomplete();
3020 * Test the prepare_photo_data() function.
3024 public function testPreparePhotoData()
3026 $this->markTestIncomplete();
3030 * Test the api_share_as_retweet() function with a valid item.
3034 public function testApiShareAsRetweetWithValidItem()
3036 $this->markTestIncomplete();
3040 * Test the api_in_reply_to() function with a valid item.
3044 public function testApiInReplyToWithValidItem()
3046 $this->markTestIncomplete();
3050 * Test the api_clean_plain_items() function.
3054 public function testApiCleanPlainItems()
3056 $_REQUEST['include_entities'] = 'true';
3057 $result = api_clean_plain_items('some_text [url="some_url"]some_text[/url]');
3058 self::assertEquals('some_text [url="some_url"]"some_url"[/url]', $result);
3062 * Test the api_best_nickname() function with contacts.
3066 public function testApiBestNicknameWithContacts()
3068 $this->markTestIncomplete();
3072 * Test the api_friendica_group_show() function.
3076 public function testApiFriendicaGroupShow()
3078 $this->markTestIncomplete();
3082 * Test the api_friendica_group_delete() function.
3086 public function testApiFriendicaGroupDelete()
3088 $this->markTestIncomplete();
3092 * Test the api_lists_destroy() function.
3096 public function testApiListsDestroy()
3098 $this->markTestIncomplete();
3102 * Test the group_create() function.
3106 public function testGroupCreate()
3108 $this->markTestIncomplete();
3112 * Test the api_friendica_group_create() function.
3116 public function testApiFriendicaGroupCreate()
3118 $this->markTestIncomplete();
3122 * Test the api_lists_create() function.
3126 public function testApiListsCreate()
3128 $this->markTestIncomplete();
3132 * Test the api_friendica_group_update() function.
3136 public function testApiFriendicaGroupUpdate()
3138 $this->markTestIncomplete();
3142 * Test the api_lists_update() function.
3146 public function testApiListsUpdate()
3148 $this->markTestIncomplete();
3152 * Test the api_friendica_activity() function.
3156 public function testApiFriendicaActivity()
3158 $this->markTestIncomplete();
3162 * Test the api_friendica_notification_seen() function.
3166 public function testApiFriendicaNotificationSeen()
3168 $this->markTestIncomplete();
3172 * Test the api_friendica_direct_messages_setseen() function.
3176 public function testApiFriendicaDirectMessagesSetseen()
3178 $this->markTestIncomplete();
3182 * Test the api_friendica_direct_messages_search() function.
3186 public function testApiFriendicaDirectMessagesSearch()
3188 $this->markTestIncomplete();