]> git.mxchange.org Git - friendica.git/blob - tests/include/ApiTest.php
#6275 - q support hashtag search
[friendica.git] / tests / include / ApiTest.php
1 <?php
2 /**
3  * ApiTest class.
4  */
5
6 namespace Friendica\Test;
7
8 use Friendica\BaseObject;
9 use Friendica\Core\Config;
10 use Friendica\Core\PConfig;
11 use Friendica\Core\Protocol;
12 use Friendica\Core\System;
13 use Friendica\Network\HTTPException;
14
15 require_once __DIR__ . '/../../include/api.php';
16
17 /**
18  * Tests for the API functions.
19  *
20  * Functions that use header() need to be tested in a separate process.
21  * @see https://phpunit.de/manual/5.7/en/appendixes.annotations.html#appendixes.annotations.runTestsInSeparateProcesses
22  */
23 class ApiTest extends DatabaseTest
24 {
25         /**
26          * Create variables used by tests.
27          */
28         public function setUp()
29         {
30                 parent::setUp();
31
32                 $this->app = BaseObject::getApp();
33
34                 // User data that the test database is populated with
35                 $this->selfUser = [
36                         'id' => 42,
37                         'name' => 'Self contact',
38                         'nick' => 'selfcontact',
39                         'nurl' => 'http://localhost/profile/selfcontact'
40                 ];
41                 $this->friendUser = [
42                         'id' => 44,
43                         'name' => 'Friend contact',
44                         'nick' => 'friendcontact',
45                         'nurl' => 'http://localhost/profile/friendcontact'
46                 ];
47                 $this->otherUser = [
48                         'id' => 43,
49                         'name' => 'othercontact',
50                         'nick' => 'othercontact',
51                         'nurl' => 'http://localhost/profile/othercontact'
52                 ];
53
54                 // User ID that we know is not in the database
55                 $this->wrongUserId = 666;
56
57                 // Most API require login so we force the session
58                 $_SESSION = [
59                         'allow_api' => true,
60                         'authenticated' => true,
61                         'uid' => $this->selfUser['id']
62                 ];
63
64                 Config::set('system', 'url', 'http://localhost');
65                 Config::set('system', 'hostname', 'localhost');
66                 Config::set('system', 'worker_dont_fork', true);
67
68                 // Default config
69                 Config::set('config', 'hostname', 'localhost');
70                 Config::set('system', 'throttle_limit_day', 100);
71                 Config::set('system', 'throttle_limit_week', 100);
72                 Config::set('system', 'throttle_limit_month', 100);
73                 Config::set('system', 'theme', 'system_theme');
74         }
75
76         /**
77          * Cleanup variables used by tests.
78          */
79         protected function tearDown()
80         {
81                 parent::tearDown();
82
83                 $this->app->argc = 1;
84                 $this->app->argv = ['home'];
85         }
86
87         /**
88          * Assert that an user array contains expected keys.
89          * @param array $user User array
90          * @return void
91          */
92         private function assertSelfUser(array $user)
93         {
94                 $this->assertEquals($this->selfUser['id'], $user['uid']);
95                 $this->assertEquals($this->selfUser['id'], $user['cid']);
96                 $this->assertEquals(1, $user['self']);
97                 $this->assertEquals('DFRN', $user['location']);
98                 $this->assertEquals($this->selfUser['name'], $user['name']);
99                 $this->assertEquals($this->selfUser['nick'], $user['screen_name']);
100                 $this->assertEquals('dfrn', $user['network']);
101                 $this->assertTrue($user['verified']);
102         }
103
104         /**
105          * Assert that an user array contains expected keys.
106          * @param array $user User array
107          * @return void
108          */
109         private function assertOtherUser(array $user)
110         {
111                 $this->assertEquals($this->otherUser['id'], $user['id']);
112                 $this->assertEquals($this->otherUser['id'], $user['id_str']);
113                 $this->assertEquals(0, $user['self']);
114                 $this->assertEquals($this->otherUser['name'], $user['name']);
115                 $this->assertEquals($this->otherUser['nick'], $user['screen_name']);
116                 $this->assertFalse($user['verified']);
117         }
118
119         /**
120          * Assert that a status array contains expected keys.
121          * @param array $status Status array
122          * @return void
123          */
124         private function assertStatus(array $status)
125         {
126                 $this->assertInternalType('string', $status['text']);
127                 $this->assertInternalType('int', $status['id']);
128                 // We could probably do more checks here.
129         }
130
131         /**
132          * Assert that a list array contains expected keys.
133          * @param array $list List array
134          * @return void
135          */
136         private function assertList(array $list)
137         {
138                 $this->assertInternalType('string', $list['name']);
139                 $this->assertInternalType('int', $list['id']);
140                 $this->assertInternalType('string', $list['id_str']);
141                 $this->assertContains($list['mode'], ['public', 'private']);
142                 // We could probably do more checks here.
143         }
144
145         /**
146          * Assert that the string is XML and contain the root element.
147          * @param string $result       XML string
148          * @param string $root_element Root element name
149          * @return void
150          */
151         private function assertXml($result, $root_element)
152         {
153                 $this->assertStringStartsWith('<?xml version="1.0"?>', $result);
154                 $this->assertContains('<'.$root_element, $result);
155                 // We could probably do more checks here.
156         }
157
158         /**
159          * Get the path to a temporary empty PNG image.
160          * @return string Path
161          */
162         private function getTempImage()
163         {
164                 $tmpFile = tempnam(sys_get_temp_dir(), 'tmp_file');
165                 file_put_contents(
166                         $tmpFile,
167                         base64_decode(
168                                 // Empty 1x1 px PNG image
169                                 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg=='
170                         )
171                 );
172
173                 return $tmpFile;
174         }
175
176         /**
177          * Test the api_user() function.
178          * @return void
179          */
180         public function testApiUser()
181         {
182                 $this->assertEquals($this->selfUser['id'], api_user());
183         }
184
185         /**
186          * Test the api_user() function with an unallowed user.
187          * @return void
188          */
189         public function testApiUserWithUnallowedUser()
190         {
191                 $_SESSION = ['allow_api' => false];
192                 $this->assertEquals(false, api_user());
193         }
194
195         /**
196          * Test the api_source() function.
197          * @return void
198          */
199         public function testApiSource()
200         {
201                 $this->assertEquals('api', api_source());
202         }
203
204         /**
205          * Test the api_source() function with a Twidere user agent.
206          * @return void
207          */
208         public function testApiSourceWithTwidere()
209         {
210                 $_SERVER['HTTP_USER_AGENT'] = 'Twidere';
211                 $this->assertEquals('Twidere', api_source());
212         }
213
214         /**
215          * Test the api_source() function with a GET parameter.
216          * @return void
217          */
218         public function testApiSourceWithGet()
219         {
220                 $_GET['source'] = 'source_name';
221                 $this->assertEquals('source_name', api_source());
222         }
223
224         /**
225          * Test the api_date() function.
226          * @return void
227          */
228         public function testApiDate()
229         {
230                 $this->assertEquals('Wed Oct 10 00:00:00 +0000 1990', api_date('1990-10-10'));
231         }
232
233         /**
234          * Test the api_register_func() function.
235          * @return void
236          */
237         public function testApiRegisterFunc()
238         {
239                 global $API;
240                 $this->assertNull(
241                         api_register_func(
242                                 'api_path',
243                                 function () {
244                                 },
245                                 true,
246                                 'method'
247                         )
248                 );
249                 $this->assertTrue($API['api_path']['auth']);
250                 $this->assertEquals('method', $API['api_path']['method']);
251                 $this->assertTrue(is_callable($API['api_path']['func']));
252         }
253
254         /**
255          * Test the api_login() function without any login.
256          * @return void
257          * @runInSeparateProcess
258          * @expectedException Friendica\Network\HTTPException\UnauthorizedException
259          */
260         public function testApiLoginWithoutLogin()
261         {
262                 api_login($this->app);
263         }
264
265         /**
266          * Test the api_login() function with a bad login.
267          * @return void
268          * @runInSeparateProcess
269          * @expectedException Friendica\Network\HTTPException\UnauthorizedException
270          */
271         public function testApiLoginWithBadLogin()
272         {
273                 $_SERVER['PHP_AUTH_USER'] = 'user@server';
274                 api_login($this->app);
275         }
276
277         /**
278          * Test the api_login() function with oAuth.
279          * @return void
280          */
281         public function testApiLoginWithOauth()
282         {
283                 $this->markTestIncomplete('Can we test this easily?');
284         }
285
286         /**
287          * Test the api_login() function with authentication provided by an addon.
288          * @return void
289          */
290         public function testApiLoginWithAddonAuth()
291         {
292                 $this->markTestIncomplete('Can we test this easily?');
293         }
294
295         /**
296          * Test the api_login() function with a correct login.
297          * @return void
298          * @runInSeparateProcess
299          */
300         public function testApiLoginWithCorrectLogin()
301         {
302                 $_SERVER['PHP_AUTH_USER'] = 'Test user';
303                 $_SERVER['PHP_AUTH_PW'] = 'password';
304                 api_login($this->app);
305         }
306
307         /**
308          * Test the api_login() function with a remote user.
309          * @return void
310          * @runInSeparateProcess
311          * @expectedException Friendica\Network\HTTPException\UnauthorizedException
312          */
313         public function testApiLoginWithRemoteUser()
314         {
315                 $_SERVER['REDIRECT_REMOTE_USER'] = '123456dXNlcjpwYXNzd29yZA==';
316                 api_login($this->app);
317         }
318
319         /**
320          * Test the api_check_method() function.
321          * @return void
322          */
323         public function testApiCheckMethod()
324         {
325                 $this->assertFalse(api_check_method('method'));
326         }
327
328         /**
329          * Test the api_check_method() function with a correct method.
330          * @return void
331          */
332         public function testApiCheckMethodWithCorrectMethod()
333         {
334                 $_SERVER['REQUEST_METHOD'] = 'method';
335                 $this->assertTrue(api_check_method('method'));
336         }
337
338         /**
339          * Test the api_check_method() function with a wildcard.
340          * @return void
341          */
342         public function testApiCheckMethodWithWildcard()
343         {
344                 $this->assertTrue(api_check_method('*'));
345         }
346
347         /**
348          * Test the api_call() function.
349          * @return void
350          * @runInSeparateProcess
351          */
352         public function testApiCall()
353         {
354                 global $API;
355                 $API['api_path'] = [
356                         'method' => 'method',
357                         'func' => function () {
358                                 return ['data' => ['some_data']];
359                         }
360                 ];
361                 $_SERVER['REQUEST_METHOD'] = 'method';
362                 $_GET['callback'] = 'callback_name';
363
364                 $this->app->query_string = 'api_path';
365                 $this->assertEquals(
366                         'callback_name(["some_data"])',
367                         api_call($this->app)
368                 );
369         }
370
371         /**
372          * Test the api_call() function with the profiled enabled.
373          * @return void
374          * @runInSeparateProcess
375          */
376         public function testApiCallWithProfiler()
377         {
378                 global $API;
379                 $API['api_path'] = [
380                         'method' => 'method',
381                         'func' => function () {
382                                 return ['data' => ['some_data']];
383                         }
384                 ];
385                 $_SERVER['REQUEST_METHOD'] = 'method';
386                 Config::set('system', 'profiler', true);
387                 Config::set('rendertime', 'callstack', true);
388                 $this->app->callstack = [
389                         'database' => ['some_function' => 200],
390                         'database_write' => ['some_function' => 200],
391                         'cache' => ['some_function' => 200],
392                         'cache_write' => ['some_function' => 200],
393                         'network' => ['some_function' => 200]
394                 ];
395
396                 $this->app->query_string = 'api_path';
397                 $this->assertEquals(
398                         '["some_data"]',
399                         api_call($this->app)
400                 );
401         }
402
403         /**
404          * Test the api_call() function without any result.
405          * @return void
406          * @runInSeparateProcess
407          */
408         public function testApiCallWithNoResult()
409         {
410                 global $API;
411                 $API['api_path'] = [
412                         'method' => 'method',
413                         'func' => function () {
414                                 return false;
415                         }
416                 ];
417                 $_SERVER['REQUEST_METHOD'] = 'method';
418
419                 $this->app->query_string = 'api_path';
420                 $this->assertEquals(
421                         '{"status":{"error":"Internal Server Error","code":"500 Internal Server Error","request":"api_path"}}',
422                         api_call($this->app)
423                 );
424         }
425
426         /**
427          * Test the api_call() function with an unimplemented API.
428          * @return void
429          * @runInSeparateProcess
430          */
431         public function testApiCallWithUninplementedApi()
432         {
433                 $this->assertEquals(
434                         '{"status":{"error":"Not Implemented","code":"501 Not Implemented","request":""}}',
435                         api_call($this->app)
436                 );
437         }
438
439         /**
440          * Test the api_call() function with a JSON result.
441          * @return void
442          * @runInSeparateProcess
443          */
444         public function testApiCallWithJson()
445         {
446                 global $API;
447                 $API['api_path'] = [
448                         'method' => 'method',
449                         'func' => function () {
450                                 return ['data' => ['some_data']];
451                         }
452                 ];
453                 $_SERVER['REQUEST_METHOD'] = 'method';
454
455                 $this->app->query_string = 'api_path.json';
456                 $this->assertEquals(
457                         '["some_data"]',
458                         api_call($this->app)
459                 );
460         }
461
462         /**
463          * Test the api_call() function with an XML result.
464          * @return void
465          * @runInSeparateProcess
466          */
467         public function testApiCallWithXml()
468         {
469                 global $API;
470                 $API['api_path'] = [
471                         'method' => 'method',
472                         'func' => function () {
473                                 return 'some_data';
474                         }
475                 ];
476                 $_SERVER['REQUEST_METHOD'] = 'method';
477
478                 $this->app->query_string = 'api_path.xml';
479                 $this->assertEquals(
480                         'some_data',
481                         api_call($this->app)
482                 );
483         }
484
485         /**
486          * Test the api_call() function with an RSS result.
487          * @return void
488          * @runInSeparateProcess
489          */
490         public function testApiCallWithRss()
491         {
492                 global $API;
493                 $API['api_path'] = [
494                         'method' => 'method',
495                         'func' => function () {
496                                 return 'some_data';
497                         }
498                 ];
499                 $_SERVER['REQUEST_METHOD'] = 'method';
500
501                 $this->app->query_string = 'api_path.rss';
502                 $this->assertEquals(
503                         '<?xml version="1.0" encoding="UTF-8"?>'."\n".
504                                 'some_data',
505                         api_call($this->app)
506                 );
507         }
508
509         /**
510          * Test the api_call() function with an Atom result.
511          * @return void
512          * @runInSeparateProcess
513          */
514         public function testApiCallWithAtom()
515         {
516                 global $API;
517                 $API['api_path'] = [
518                         'method' => 'method',
519                         'func' => function () {
520                                 return 'some_data';
521                         }
522                 ];
523                 $_SERVER['REQUEST_METHOD'] = 'method';
524
525                 $this->app->query_string = 'api_path.atom';
526                 $this->assertEquals(
527                         '<?xml version="1.0" encoding="UTF-8"?>'."\n".
528                                 'some_data',
529                         api_call($this->app)
530                 );
531         }
532
533         /**
534          * Test the api_call() function with an unallowed method.
535          * @return void
536          * @runInSeparateProcess
537          */
538         public function testApiCallWithWrongMethod()
539         {
540                 global $API;
541                 $API['api_path'] = ['method' => 'method'];
542
543                 $this->app->query_string = 'api_path';
544                 $this->assertEquals(
545                         '{"status":{"error":"Method Not Allowed","code":"405 Method Not Allowed","request":"api_path"}}',
546                         api_call($this->app)
547                 );
548         }
549
550         /**
551          * Test the api_call() function with an unauthorized user.
552          * @return void
553          * @runInSeparateProcess
554          */
555         public function testApiCallWithWrongAuth()
556         {
557                 global $API;
558                 $API['api_path'] = [
559                         'method' => 'method',
560                         'auth' => true
561                 ];
562                 $_SERVER['REQUEST_METHOD'] = 'method';
563                 $_SESSION['authenticated'] = false;
564
565                 $this->app->query_string = 'api_path';
566                 $this->assertEquals(
567                         '{"status":{"error":"This API requires login","code":"401 Unauthorized","request":"api_path"}}',
568                         api_call($this->app)
569                 );
570         }
571
572         /**
573          * Test the api_error() function with a JSON result.
574          * @return void
575          * @runInSeparateProcess
576          */
577         public function testApiErrorWithJson()
578         {
579                 $this->assertEquals(
580                         '{"status":{"error":"error_message","code":"200 Friendica\\\\Network\\\\HTTP","request":""}}',
581                         api_error('json', new HTTPException('error_message'))
582                 );
583         }
584
585         /**
586          * Test the api_error() function with an XML result.
587          * @return void
588          * @runInSeparateProcess
589          */
590         public function testApiErrorWithXml()
591         {
592                 $this->assertEquals(
593                         '<?xml version="1.0"?>'."\n".
594                         '<status xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" '.
595                                 'xmlns:friendica="http://friendi.ca/schema/api/1/" '.
596                                 'xmlns:georss="http://www.georss.org/georss">'."\n".
597                         '  <error>error_message</error>'."\n".
598                         '  <code>200 Friendica\Network\HTTP</code>'."\n".
599                         '  <request/>'."\n".
600                         '</status>'."\n",
601                         api_error('xml', new HTTPException('error_message'))
602                 );
603         }
604
605         /**
606          * Test the api_error() function with an RSS result.
607          * @return void
608          * @runInSeparateProcess
609          */
610         public function testApiErrorWithRss()
611         {
612                 $this->assertEquals(
613                         '<?xml version="1.0"?>'."\n".
614                         '<status xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" '.
615                                 'xmlns:friendica="http://friendi.ca/schema/api/1/" '.
616                                 'xmlns:georss="http://www.georss.org/georss">'."\n".
617                         '  <error>error_message</error>'."\n".
618                         '  <code>200 Friendica\Network\HTTP</code>'."\n".
619                         '  <request/>'."\n".
620                         '</status>'."\n",
621                         api_error('rss', new HTTPException('error_message'))
622                 );
623         }
624
625         /**
626          * Test the api_error() function with an Atom result.
627          * @return void
628          * @runInSeparateProcess
629          */
630         public function testApiErrorWithAtom()
631         {
632                 $this->assertEquals(
633                         '<?xml version="1.0"?>'."\n".
634                         '<status xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" '.
635                                 'xmlns:friendica="http://friendi.ca/schema/api/1/" '.
636                                 'xmlns:georss="http://www.georss.org/georss">'."\n".
637                         '  <error>error_message</error>'."\n".
638                         '  <code>200 Friendica\Network\HTTP</code>'."\n".
639                         '  <request/>'."\n".
640                         '</status>'."\n",
641                         api_error('atom', new HTTPException('error_message'))
642                 );
643         }
644
645         /**
646          * Test the api_rss_extra() function.
647          * @return void
648          */
649         public function testApiRssExtra()
650         {
651                 $user_info = ['url' => 'user_url', 'lang' => 'en'];
652                 $result = api_rss_extra($this->app, [], $user_info);
653                 $this->assertEquals($user_info, $result['$user']);
654                 $this->assertEquals($user_info['url'], $result['$rss']['alternate']);
655                 $this->assertArrayHasKey('self', $result['$rss']);
656                 $this->assertArrayHasKey('base', $result['$rss']);
657                 $this->assertArrayHasKey('updated', $result['$rss']);
658                 $this->assertArrayHasKey('atom_updated', $result['$rss']);
659                 $this->assertArrayHasKey('language', $result['$rss']);
660                 $this->assertArrayHasKey('logo', $result['$rss']);
661         }
662
663         /**
664          * Test the api_rss_extra() function without any user info.
665          * @return void
666          * @runInSeparateProcess
667          */
668         public function testApiRssExtraWithoutUserInfo()
669         {
670                 $result = api_rss_extra($this->app, [], null);
671                 $this->assertInternalType('array', $result['$user']);
672                 $this->assertArrayHasKey('alternate', $result['$rss']);
673                 $this->assertArrayHasKey('self', $result['$rss']);
674                 $this->assertArrayHasKey('base', $result['$rss']);
675                 $this->assertArrayHasKey('updated', $result['$rss']);
676                 $this->assertArrayHasKey('atom_updated', $result['$rss']);
677                 $this->assertArrayHasKey('language', $result['$rss']);
678                 $this->assertArrayHasKey('logo', $result['$rss']);
679         }
680
681         /**
682          * Test the api_unique_id_to_nurl() function.
683          * @return void
684          */
685         public function testApiUniqueIdToNurl()
686         {
687                 $this->assertFalse(api_unique_id_to_nurl($this->wrongUserId));
688         }
689
690         /**
691          * Test the api_unique_id_to_nurl() function with a correct ID.
692          * @return void
693          */
694         public function testApiUniqueIdToNurlWithCorrectId()
695         {
696                 $this->assertEquals($this->otherUser['nurl'], api_unique_id_to_nurl($this->otherUser['id']));
697         }
698
699         /**
700          * Test the api_get_user() function.
701          * @return void
702          * @runInSeparateProcess
703          */
704         public function testApiGetUser()
705         {
706                 $user = api_get_user($this->app);
707                 $this->assertSelfUser($user);
708                 $this->assertEquals('708fa0', $user['profile_sidebar_fill_color']);
709                 $this->assertEquals('6fdbe8', $user['profile_link_color']);
710                 $this->assertEquals('ededed', $user['profile_background_color']);
711         }
712
713         /**
714          * Test the api_get_user() function with a Frio schema.
715          * @return void
716          * @runInSeparateProcess
717          */
718         public function testApiGetUserWithFrioSchema()
719         {
720                 PConfig::set($this->selfUser['id'], 'frio', 'schema', 'red');
721                 $user = api_get_user($this->app);
722                 $this->assertSelfUser($user);
723                 $this->assertEquals('708fa0', $user['profile_sidebar_fill_color']);
724                 $this->assertEquals('6fdbe8', $user['profile_link_color']);
725                 $this->assertEquals('ededed', $user['profile_background_color']);
726         }
727
728         /**
729          * Test the api_get_user() function with a custom Frio schema.
730          * @return void
731          * @runInSeparateProcess
732          */
733         public function testApiGetUserWithCustomFrioSchema()
734         {
735                 $ret1 = PConfig::set($this->selfUser['id'], 'frio', 'schema', '---');
736                 $ret2 = PConfig::set($this->selfUser['id'], 'frio', 'nav_bg', '#123456');
737                 $ret3 = PConfig::set($this->selfUser['id'], 'frio', 'link_color', '#123456');
738                 $ret4 = PConfig::set($this->selfUser['id'], 'frio', 'background_color', '#123456');
739                 $user = api_get_user($this->app);
740                 $this->assertSelfUser($user);
741                 $this->assertEquals('123456', $user['profile_sidebar_fill_color']);
742                 $this->assertEquals('123456', $user['profile_link_color']);
743                 $this->assertEquals('123456', $user['profile_background_color']);
744         }
745
746         /**
747          * Test the api_get_user() function with an empty Frio schema.
748          * @return void
749          * @runInSeparateProcess
750          */
751         public function testApiGetUserWithEmptyFrioSchema()
752         {
753                 PConfig::set($this->selfUser['id'], 'frio', 'schema', '---');
754                 $user = api_get_user($this->app);
755                 $this->assertSelfUser($user);
756                 $this->assertEquals('708fa0', $user['profile_sidebar_fill_color']);
757                 $this->assertEquals('6fdbe8', $user['profile_link_color']);
758                 $this->assertEquals('ededed', $user['profile_background_color']);
759         }
760
761         /**
762          * Test the api_get_user() function with an user that is not allowed to use the API.
763          * @return void
764          * @runInSeparateProcess
765          */
766         public function testApiGetUserWithoutApiUser()
767         {
768                 $_SERVER['PHP_AUTH_USER'] = 'Test user';
769                 $_SERVER['PHP_AUTH_PW'] = 'password';
770                 $_SESSION['allow_api'] = false;
771                 $this->assertFalse(api_get_user($this->app));
772         }
773
774         /**
775          * Test the api_get_user() function with an user ID in a GET parameter.
776          * @return void
777          * @runInSeparateProcess
778          */
779         public function testApiGetUserWithGetId()
780         {
781                 $_GET['user_id'] = $this->otherUser['id'];
782                 $this->assertOtherUser(api_get_user($this->app));
783         }
784
785         /**
786          * Test the api_get_user() function with a wrong user ID in a GET parameter.
787          * @return void
788          * @runInSeparateProcess
789          * @expectedException Friendica\Network\HTTPException\BadRequestException
790          */
791         public function testApiGetUserWithWrongGetId()
792         {
793                 $_GET['user_id'] = $this->wrongUserId;
794                 $this->assertOtherUser(api_get_user($this->app));
795         }
796
797         /**
798          * Test the api_get_user() function with an user name in a GET parameter.
799          * @return void
800          * @runInSeparateProcess
801          */
802         public function testApiGetUserWithGetName()
803         {
804                 $_GET['screen_name'] = $this->selfUser['nick'];
805                 $this->assertSelfUser(api_get_user($this->app));
806         }
807
808         /**
809          * Test the api_get_user() function with a profile URL in a GET parameter.
810          * @return void
811          * @runInSeparateProcess
812          */
813         public function testApiGetUserWithGetUrl()
814         {
815                 $_GET['profileurl'] = $this->selfUser['nurl'];
816                 $this->assertSelfUser(api_get_user($this->app));
817         }
818
819         /**
820          * Test the api_get_user() function with an user ID in the API path.
821          * @return void
822          * @runInSeparateProcess
823          */
824         public function testApiGetUserWithNumericCalledApi()
825         {
826                 global $called_api;
827                 $called_api = ['api_path'];
828                 $this->app->argv[1] = $this->otherUser['id'].'.json';
829                 $this->assertOtherUser(api_get_user($this->app));
830         }
831
832         /**
833          * Test the api_get_user() function with the $called_api global variable.
834          * @return void
835          * @runInSeparateProcess
836          */
837         public function testApiGetUserWithCalledApi()
838         {
839                 global $called_api;
840                 $called_api = ['api', 'api_path'];
841                 $this->assertSelfUser(api_get_user($this->app));
842         }
843
844         /**
845          * Test the api_get_user() function with a valid user.
846          * @return void
847          * @runInSeparateProcess
848          */
849         public function testApiGetUserWithCorrectUser()
850         {
851                 $this->assertOtherUser(api_get_user($this->app, $this->otherUser['id']));
852         }
853
854         /**
855          * Test the api_get_user() function with a wrong user ID.
856          * @return void
857          * @runInSeparateProcess
858          * @expectedException Friendica\Network\HTTPException\BadRequestException
859          */
860         public function testApiGetUserWithWrongUser()
861         {
862                 $this->assertOtherUser(api_get_user($this->app, $this->wrongUserId));
863         }
864
865         /**
866          * Test the api_get_user() function with a 0 user ID.
867          * @return void
868          * @runInSeparateProcess
869          */
870         public function testApiGetUserWithZeroUser()
871         {
872                 $this->assertSelfUser(api_get_user($this->app, 0));
873         }
874
875         /**
876          * Test the api_item_get_user() function.
877          * @return void
878          * @runInSeparateProcess
879          */
880         public function testApiItemGetUser()
881         {
882                 $users = api_item_get_user($this->app, []);
883                 $this->assertSelfUser($users[0]);
884         }
885
886         /**
887          * Test the api_item_get_user() function with a different item parent.
888          * @return void
889          */
890         public function testApiItemGetUserWithDifferentParent()
891         {
892                 $users = api_item_get_user($this->app, ['thr-parent' => 'item_parent', 'uri' => 'item_uri']);
893                 $this->assertSelfUser($users[0]);
894                 $this->assertEquals($users[0], $users[1]);
895         }
896
897         /**
898          * Test the api_walk_recursive() function.
899          * @return void
900          */
901         public function testApiWalkRecursive()
902         {
903                 $array = ['item1'];
904                 $this->assertEquals(
905                         $array,
906                         api_walk_recursive(
907                                 $array,
908                                 function () {
909                                         // Should we test this with a callback that actually does something?
910                                         return true;
911                                 }
912                         )
913                 );
914         }
915
916         /**
917          * Test the api_walk_recursive() function with an array.
918          * @return void
919          */
920         public function testApiWalkRecursiveWithArray()
921         {
922                 $array = [['item1'], ['item2']];
923                 $this->assertEquals(
924                         $array,
925                         api_walk_recursive(
926                                 $array,
927                                 function () {
928                                         // Should we test this with a callback that actually does something?
929                                         return true;
930                                 }
931                         )
932                 );
933         }
934
935         /**
936          * Test the api_reformat_xml() function.
937          * @return void
938          */
939         public function testApiReformatXml()
940         {
941                 $item = true;
942                 $key = '';
943                 $this->assertTrue(api_reformat_xml($item, $key));
944                 $this->assertEquals('true', $item);
945         }
946
947         /**
948          * Test the api_reformat_xml() function with a statusnet_api key.
949          * @return void
950          */
951         public function testApiReformatXmlWithStatusnetKey()
952         {
953                 $item = '';
954                 $key = 'statusnet_api';
955                 $this->assertTrue(api_reformat_xml($item, $key));
956                 $this->assertEquals('statusnet:api', $key);
957         }
958
959         /**
960          * Test the api_reformat_xml() function with a friendica_api key.
961          * @return void
962          */
963         public function testApiReformatXmlWithFriendicaKey()
964         {
965                 $item = '';
966                 $key = 'friendica_api';
967                 $this->assertTrue(api_reformat_xml($item, $key));
968                 $this->assertEquals('friendica:api', $key);
969         }
970
971         /**
972          * Test the api_create_xml() function.
973          * @return void
974          */
975         public function testApiCreateXml()
976         {
977                 $this->assertEquals(
978                         '<?xml version="1.0"?>'."\n".
979                         '<root_element xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" '.
980                                 'xmlns:friendica="http://friendi.ca/schema/api/1/" '.
981                                 'xmlns:georss="http://www.georss.org/georss">'."\n".
982                                 '  <data>some_data</data>'."\n".
983                         '</root_element>'."\n",
984                         api_create_xml(['data' => ['some_data']], 'root_element')
985                 );
986         }
987
988         /**
989          * Test the api_create_xml() function without any XML namespace.
990          * @return void
991          */
992         public function testApiCreateXmlWithoutNamespaces()
993         {
994                 $this->assertEquals(
995                         '<?xml version="1.0"?>'."\n".
996                         '<ok>'."\n".
997                                 '  <data>some_data</data>'."\n".
998                         '</ok>'."\n",
999                         api_create_xml(['data' => ['some_data']], 'ok')
1000                 );
1001         }
1002
1003         /**
1004          * Test the api_format_data() function.
1005          * @return void
1006          */
1007         public function testApiFormatData()
1008         {
1009                 $data = ['some_data'];
1010                 $this->assertEquals($data, api_format_data('root_element', 'json', $data));
1011         }
1012
1013         /**
1014          * Test the api_format_data() function with an XML result.
1015          * @return void
1016          */
1017         public function testApiFormatDataWithXml()
1018         {
1019                 $this->assertEquals(
1020                         '<?xml version="1.0"?>'."\n".
1021                         '<root_element xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" '.
1022                                 'xmlns:friendica="http://friendi.ca/schema/api/1/" '.
1023                                 'xmlns:georss="http://www.georss.org/georss">'."\n".
1024                                 '  <data>some_data</data>'."\n".
1025                         '</root_element>'."\n",
1026                         api_format_data('root_element', 'xml', ['data' => ['some_data']])
1027                 );
1028         }
1029
1030         /**
1031          * Test the api_account_verify_credentials() function.
1032          * @return void
1033          */
1034         public function testApiAccountVerifyCredentials()
1035         {
1036                 $this->assertArrayHasKey('user', api_account_verify_credentials('json'));
1037         }
1038
1039         /**
1040          * Test the api_account_verify_credentials() function without an authenticated user.
1041          * @return void
1042          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1043          */
1044         public function testApiAccountVerifyCredentialsWithoutAuthenticatedUser()
1045         {
1046                 $_SESSION['authenticated'] = false;
1047                 api_account_verify_credentials('json');
1048         }
1049
1050         /**
1051          * Test the requestdata() function.
1052          * @return void
1053          */
1054         public function testRequestdata()
1055         {
1056                 $this->assertNull(requestdata('variable_name'));
1057         }
1058
1059         /**
1060          * Test the requestdata() function with a POST parameter.
1061          * @return void
1062          */
1063         public function testRequestdataWithPost()
1064         {
1065                 $_POST['variable_name'] = 'variable_value';
1066                 $this->assertEquals('variable_value', requestdata('variable_name'));
1067         }
1068
1069         /**
1070          * Test the requestdata() function with a GET parameter.
1071          * @return void
1072          */
1073         public function testRequestdataWithGet()
1074         {
1075                 $_GET['variable_name'] = 'variable_value';
1076                 $this->assertEquals('variable_value', requestdata('variable_name'));
1077         }
1078
1079         /**
1080          * Test the api_statuses_mediap() function.
1081          * @return void
1082          */
1083         public function testApiStatusesMediap()
1084         {
1085                 $this->app->argc = 2;
1086
1087                 $_FILES = [
1088                         'media' => [
1089                                 'id' => 666,
1090                                 'size' => 666,
1091                                 'width' => 666,
1092                                 'height' => 666,
1093                                 'tmp_name' => $this->getTempImage(),
1094                                 'name' => 'spacer.png',
1095                                 'type' => 'image/png'
1096                         ]
1097                 ];
1098                 $_GET['status'] = '<b>Status content</b>';
1099
1100                 $result = api_statuses_mediap('json');
1101                 $this->assertStatus($result['status']);
1102         }
1103
1104         /**
1105          * Test the api_statuses_mediap() function without an authenticated user.
1106          * @return void
1107          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1108          */
1109         public function testApiStatusesMediapWithoutAuthenticatedUser()
1110         {
1111                 $_SESSION['authenticated'] = false;
1112                 api_statuses_mediap('json');
1113         }
1114
1115         /**
1116          * Test the api_statuses_update() function.
1117          * @return void
1118          */
1119         public function testApiStatusesUpdate()
1120         {
1121                 $_GET['status'] = 'Status content #friendica';
1122                 $_GET['in_reply_to_status_id'] = -1;
1123                 $_GET['lat'] = 48;
1124                 $_GET['long'] = 7;
1125                 $_FILES = [
1126                         'media' => [
1127                                 'id' => 666,
1128                                 'size' => 666,
1129                                 'width' => 666,
1130                                 'height' => 666,
1131                                 'tmp_name' => $this->getTempImage(),
1132                                 'name' => 'spacer.png',
1133                                 'type' => 'image/png'
1134                         ]
1135                 ];
1136
1137                 $result = api_statuses_update('json');
1138                 $this->assertStatus($result['status']);
1139         }
1140
1141         /**
1142          * Test the api_statuses_update() function with an HTML status.
1143          * @return void
1144          */
1145         public function testApiStatusesUpdateWithHtml()
1146         {
1147                 $_GET['htmlstatus'] = '<b>Status content</b>';
1148
1149                 $result = api_statuses_update('json');
1150                 $this->assertStatus($result['status']);
1151         }
1152
1153         /**
1154          * Test the api_statuses_update() function without an authenticated user.
1155          * @return void
1156          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1157          */
1158         public function testApiStatusesUpdateWithoutAuthenticatedUser()
1159         {
1160                 $_SESSION['authenticated'] = false;
1161                 api_statuses_update('json');
1162         }
1163
1164         /**
1165          * Test the api_statuses_update() function with a parent status.
1166          * @return void
1167          */
1168         public function testApiStatusesUpdateWithParent()
1169         {
1170                 $this->markTestIncomplete('This triggers an exit() somewhere and kills PHPUnit.');
1171         }
1172
1173         /**
1174          * Test the api_statuses_update() function with a media_ids parameter.
1175          * @return void
1176          */
1177         public function testApiStatusesUpdateWithMediaIds()
1178         {
1179                 $this->markTestIncomplete();
1180         }
1181
1182         /**
1183          * Test the api_statuses_update() function with the throttle limit reached.
1184          * @return void
1185          */
1186         public function testApiStatusesUpdateWithDayThrottleReached()
1187         {
1188                 $this->markTestIncomplete();
1189         }
1190
1191         /**
1192          * Test the api_media_upload() function.
1193          * @return void
1194          * @expectedException Friendica\Network\HTTPException\BadRequestException
1195          */
1196         public function testApiMediaUpload()
1197         {
1198                 api_media_upload();
1199         }
1200
1201         /**
1202          * Test the api_media_upload() function without an authenticated user.
1203          * @return void
1204          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1205          */
1206         public function testApiMediaUploadWithoutAuthenticatedUser()
1207         {
1208                 $_SESSION['authenticated'] = false;
1209                 api_media_upload();
1210         }
1211
1212         /**
1213          * Test the api_media_upload() function with an invalid uploaded media.
1214          * @return void
1215          * @expectedException Friendica\Network\HTTPException\InternalServerErrorException
1216          */
1217         public function testApiMediaUploadWithMedia()
1218         {
1219                 $_FILES = [
1220                         'media' => [
1221                                 'id' => 666,
1222                                 'tmp_name' => 'tmp_name'
1223                         ]
1224                 ];
1225                 api_media_upload();
1226         }
1227
1228         /**
1229          * Test the api_media_upload() function with an valid uploaded media.
1230          * @return void
1231          */
1232         public function testApiMediaUploadWithValidMedia()
1233         {
1234                 $_FILES = [
1235                         'media' => [
1236                                 'id' => 666,
1237                                 'size' => 666,
1238                                 'width' => 666,
1239                                 'height' => 666,
1240                                 'tmp_name' => $this->getTempImage(),
1241                                 'name' => 'spacer.png',
1242                                 'type' => 'image/png'
1243                         ]
1244                 ];
1245                 $app = \get_app();
1246                 $app->argc = 2;
1247
1248                 $result = api_media_upload();
1249                 $this->assertEquals('image/png', $result['media']['image']['image_type']);
1250                 $this->assertEquals(1, $result['media']['image']['w']);
1251                 $this->assertEquals(1, $result['media']['image']['h']);
1252                 $this->assertNotEmpty($result['media']['image']['friendica_preview_url']);
1253         }
1254
1255         /**
1256          * Test the api_status_show() function.
1257          * @return void
1258          */
1259         public function testApiStatusShow()
1260         {
1261                 $result = api_status_show('json');
1262                 $this->assertStatus($result['status']);
1263         }
1264
1265         /**
1266          * Test the api_status_show() function with an XML result.
1267          * @return void
1268          */
1269         public function testApiStatusShowWithXml()
1270         {
1271                 $result = api_status_show('xml');
1272                 $this->assertXml($result, 'statuses');
1273         }
1274
1275         /**
1276          * Test the api_status_show() function with a raw result.
1277          * @return void
1278          */
1279         public function testApiStatusShowWithRaw()
1280         {
1281                 $this->assertStatus(api_status_show('raw'));
1282         }
1283
1284         /**
1285          * Test the api_users_show() function.
1286          * @return void
1287          */
1288         public function testApiUsersShow()
1289         {
1290                 $result = api_users_show('json');
1291                 // We can't use assertSelfUser() here because the user object is missing some properties.
1292                 $this->assertEquals($this->selfUser['id'], $result['user']['cid']);
1293                 $this->assertEquals('DFRN', $result['user']['location']);
1294                 $this->assertEquals($this->selfUser['name'], $result['user']['name']);
1295                 $this->assertEquals($this->selfUser['nick'], $result['user']['screen_name']);
1296                 $this->assertEquals('dfrn', $result['user']['network']);
1297                 $this->assertTrue($result['user']['verified']);
1298         }
1299
1300         /**
1301          * Test the api_users_show() function with an XML result.
1302          * @return void
1303          */
1304         public function testApiUsersShowWithXml()
1305         {
1306                 $result = api_users_show('xml');
1307                 $this->assertXml($result, 'statuses');
1308         }
1309
1310         /**
1311          * Test the api_users_search() function.
1312          * @return void
1313          */
1314         public function testApiUsersSearch()
1315         {
1316                 $_GET['q'] = 'othercontact';
1317                 $result = api_users_search('json');
1318                 $this->assertOtherUser($result['users'][0]);
1319         }
1320
1321         /**
1322          * Test the api_users_search() function with an XML result.
1323          * @return void
1324          */
1325         public function testApiUsersSearchWithXml()
1326         {
1327                 $_GET['q'] = 'othercontact';
1328                 $result = api_users_search('xml');
1329                 $this->assertXml($result, 'users');
1330         }
1331
1332         /**
1333          * Test the api_users_search() function without a GET q parameter.
1334          * @return void
1335          * @expectedException Friendica\Network\HTTPException\BadRequestException
1336          */
1337         public function testApiUsersSearchWithoutQuery()
1338         {
1339                 api_users_search('json');
1340         }
1341
1342         /**
1343          * Test the api_users_lookup() function.
1344          * @return void
1345          * @expectedException Friendica\Network\HTTPException\NotFoundException
1346          */
1347         public function testApiUsersLookup()
1348         {
1349                 api_users_lookup('json');
1350         }
1351
1352         /**
1353          * Test the api_users_lookup() function with an user ID.
1354          * @return void
1355          */
1356         public function testApiUsersLookupWithUserId()
1357         {
1358                 $_REQUEST['user_id'] = $this->otherUser['id'];
1359                 $result = api_users_lookup('json');
1360                 $this->assertOtherUser($result['users'][0]);
1361         }
1362
1363         /**
1364          * Test the api_search() function.
1365          * @return void
1366          */
1367         public function testApiSearch()
1368         {
1369                 $_REQUEST['q'] = 'reply';
1370                 $_REQUEST['max_id'] = 10;
1371                 $result = api_search('json');
1372                 foreach ($result['status'] as $status) {
1373                         $this->assertStatus($status);
1374                         $this->assertContains('reply', $status['text'], null, true);
1375                 }
1376         }
1377
1378         /**
1379          * Test the api_search() function a count parameter.
1380          * @return void
1381          */
1382         public function testApiSearchWithCount()
1383         {
1384                 $_REQUEST['q'] = 'reply';
1385                 $_REQUEST['count'] = 20;
1386                 $result = api_search('json');
1387                 foreach ($result['status'] as $status) {
1388                         $this->assertStatus($status);
1389                         $this->assertContains('reply', $status['text'], null, true);
1390                 }
1391         }
1392
1393         /**
1394          * Test the api_search() function with an rpp parameter.
1395          * @return void
1396          */
1397         public function testApiSearchWithRpp()
1398         {
1399                 $_REQUEST['q'] = 'reply';
1400                 $_REQUEST['rpp'] = 20;
1401                 $result = api_search('json');
1402                 foreach ($result['status'] as $status) {
1403                         $this->assertStatus($status);
1404                         $this->assertContains('reply', $status['text'], null, true);
1405                 }
1406         }
1407
1408
1409         /**
1410          * Test the api_search() function without an authenticated user.
1411          * @return void
1412          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1413          */
1414         public function testApiSearchWithUnallowedUser()
1415         {
1416                 $_SESSION['allow_api'] = false;
1417                 $_GET['screen_name'] = $this->selfUser['nick'];
1418                 api_search('json');
1419         }
1420
1421         /**
1422          * Test the api_search() function without any GET query parameter.
1423          * @return void
1424          * @expectedException Friendica\Network\HTTPException\BadRequestException
1425          */
1426         public function testApiSearchWithoutQuery()
1427         {
1428                 api_search('json');
1429         }
1430
1431         /**
1432          * Test the api_statuses_home_timeline() function.
1433          * @return void
1434          */
1435         public function testApiStatusesHomeTimeline()
1436         {
1437                 $_REQUEST['max_id'] = 10;
1438                 $_REQUEST['exclude_replies'] = true;
1439                 $_REQUEST['conversation_id'] = 1;
1440                 $result = api_statuses_home_timeline('json');
1441                 $this->assertNotEmpty($result['status']);
1442                 foreach ($result['status'] as $status) {
1443                         $this->assertStatus($status);
1444                 }
1445         }
1446
1447         /**
1448          * Test the api_statuses_home_timeline() function with a negative page parameter.
1449          * @return void
1450          */
1451         public function testApiStatusesHomeTimelineWithNegativePage()
1452         {
1453                 $_REQUEST['page'] = -2;
1454                 $result = api_statuses_home_timeline('json');
1455                 $this->assertNotEmpty($result['status']);
1456                 foreach ($result['status'] as $status) {
1457                         $this->assertStatus($status);
1458                 }
1459         }
1460
1461         /**
1462          * Test the api_statuses_home_timeline() with an unallowed user.
1463          * @return void
1464          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1465          */
1466         public function testApiStatusesHomeTimelineWithUnallowedUser()
1467         {
1468                 $_SESSION['allow_api'] = false;
1469                 $_GET['screen_name'] = $this->selfUser['nick'];
1470                 api_statuses_home_timeline('json');
1471         }
1472
1473         /**
1474          * Test the api_statuses_home_timeline() function with an RSS result.
1475          * @return void
1476          */
1477         public function testApiStatusesHomeTimelineWithRss()
1478         {
1479                 $result = api_statuses_home_timeline('rss');
1480                 $this->assertXml($result, 'statuses');
1481         }
1482
1483         /**
1484          * Test the api_statuses_public_timeline() function.
1485          * @return void
1486          */
1487         public function testApiStatusesPublicTimeline()
1488         {
1489                 $_REQUEST['max_id'] = 10;
1490                 $_REQUEST['conversation_id'] = 1;
1491                 $result = api_statuses_public_timeline('json');
1492                 $this->assertNotEmpty($result['status']);
1493                 foreach ($result['status'] as $status) {
1494                         $this->assertStatus($status);
1495                 }
1496         }
1497
1498         /**
1499          * Test the api_statuses_public_timeline() function with the exclude_replies parameter.
1500          * @return void
1501          */
1502         public function testApiStatusesPublicTimelineWithExcludeReplies()
1503         {
1504                 $_REQUEST['max_id'] = 10;
1505                 $_REQUEST['exclude_replies'] = true;
1506                 $result = api_statuses_public_timeline('json');
1507                 $this->assertNotEmpty($result['status']);
1508                 foreach ($result['status'] as $status) {
1509                         $this->assertStatus($status);
1510                 }
1511         }
1512
1513         /**
1514          * Test the api_statuses_public_timeline() function with a negative page parameter.
1515          * @return void
1516          */
1517         public function testApiStatusesPublicTimelineWithNegativePage()
1518         {
1519                 $_REQUEST['page'] = -2;
1520                 $result = api_statuses_public_timeline('json');
1521                 $this->assertNotEmpty($result['status']);
1522                 foreach ($result['status'] as $status) {
1523                         $this->assertStatus($status);
1524                 }
1525         }
1526
1527         /**
1528          * Test the api_statuses_public_timeline() function with an unallowed user.
1529          * @return void
1530          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1531          */
1532         public function testApiStatusesPublicTimelineWithUnallowedUser()
1533         {
1534                 $_SESSION['allow_api'] = false;
1535                 $_GET['screen_name'] = $this->selfUser['nick'];
1536                 api_statuses_public_timeline('json');
1537         }
1538
1539         /**
1540          * Test the api_statuses_public_timeline() function with an RSS result.
1541          * @return void
1542          */
1543         public function testApiStatusesPublicTimelineWithRss()
1544         {
1545                 $result = api_statuses_public_timeline('rss');
1546                 $this->assertXml($result, 'statuses');
1547         }
1548
1549         /**
1550          * Test the api_statuses_networkpublic_timeline() function.
1551          * @return void
1552          */
1553         public function testApiStatusesNetworkpublicTimeline()
1554         {
1555                 $_REQUEST['max_id'] = 10;
1556                 $result = api_statuses_networkpublic_timeline('json');
1557                 $this->assertNotEmpty($result['status']);
1558                 foreach ($result['status'] as $status) {
1559                         $this->assertStatus($status);
1560                 }
1561         }
1562
1563         /**
1564          * Test the api_statuses_networkpublic_timeline() function with a negative page parameter.
1565          * @return void
1566          */
1567         public function testApiStatusesNetworkpublicTimelineWithNegativePage()
1568         {
1569                 $_REQUEST['page'] = -2;
1570                 $result = api_statuses_networkpublic_timeline('json');
1571                 $this->assertNotEmpty($result['status']);
1572                 foreach ($result['status'] as $status) {
1573                         $this->assertStatus($status);
1574                 }
1575         }
1576
1577         /**
1578          * Test the api_statuses_networkpublic_timeline() function with an unallowed user.
1579          * @return void
1580          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1581          */
1582         public function testApiStatusesNetworkpublicTimelineWithUnallowedUser()
1583         {
1584                 $_SESSION['allow_api'] = false;
1585                 $_GET['screen_name'] = $this->selfUser['nick'];
1586                 api_statuses_networkpublic_timeline('json');
1587         }
1588
1589         /**
1590          * Test the api_statuses_networkpublic_timeline() function with an RSS result.
1591          * @return void
1592          */
1593         public function testApiStatusesNetworkpublicTimelineWithRss()
1594         {
1595                 $result = api_statuses_networkpublic_timeline('rss');
1596                 $this->assertXml($result, 'statuses');
1597         }
1598
1599         /**
1600          * Test the api_statuses_show() function.
1601          * @return void
1602          * @expectedException Friendica\Network\HTTPException\BadRequestException
1603          */
1604         public function testApiStatusesShow()
1605         {
1606                 api_statuses_show('json');
1607         }
1608
1609         /**
1610          * Test the api_statuses_show() function with an ID.
1611          * @return void
1612          */
1613         public function testApiStatusesShowWithId()
1614         {
1615                 $this->app->argv[3] = 1;
1616                 $result = api_statuses_show('json');
1617                 $this->assertStatus($result['status']);
1618         }
1619
1620         /**
1621          * Test the api_statuses_show() function with the conversation parameter.
1622          * @return void
1623          */
1624         public function testApiStatusesShowWithConversation()
1625         {
1626                 $this->app->argv[3] = 1;
1627                 $_REQUEST['conversation'] = 1;
1628                 $result = api_statuses_show('json');
1629                 $this->assertNotEmpty($result['status']);
1630                 foreach ($result['status'] as $status) {
1631                         $this->assertStatus($status);
1632                 }
1633         }
1634
1635         /**
1636          * Test the api_statuses_show() function with an unallowed user.
1637          * @return void
1638          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1639          */
1640         public function testApiStatusesShowWithUnallowedUser()
1641         {
1642                 $_SESSION['allow_api'] = false;
1643                 $_GET['screen_name'] = $this->selfUser['nick'];
1644                 api_statuses_show('json');
1645         }
1646
1647         /**
1648          * Test the api_conversation_show() function.
1649          * @return void
1650          * @expectedException Friendica\Network\HTTPException\BadRequestException
1651          */
1652         public function testApiConversationShow()
1653         {
1654                 api_conversation_show('json');
1655         }
1656
1657         /**
1658          * Test the api_conversation_show() function with an ID.
1659          * @return void
1660          */
1661         public function testApiConversationShowWithId()
1662         {
1663                 $this->app->argv[3] = 1;
1664                 $_REQUEST['max_id'] = 10;
1665                 $_REQUEST['page'] = -2;
1666                 $result = api_conversation_show('json');
1667                 $this->assertNotEmpty($result['status']);
1668                 foreach ($result['status'] as $status) {
1669                         $this->assertStatus($status);
1670                 }
1671         }
1672
1673         /**
1674          * Test the api_conversation_show() function with an unallowed user.
1675          * @return void
1676          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1677          */
1678         public function testApiConversationShowWithUnallowedUser()
1679         {
1680                 $_SESSION['allow_api'] = false;
1681                 $_GET['screen_name'] = $this->selfUser['nick'];
1682                 api_conversation_show('json');
1683         }
1684
1685         /**
1686          * Test the api_statuses_repeat() function.
1687          * @return void
1688          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1689          */
1690         public function testApiStatusesRepeat()
1691         {
1692                 api_statuses_repeat('json');
1693         }
1694
1695         /**
1696          * Test the api_statuses_repeat() function without an authenticated user.
1697          * @return void
1698          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1699          */
1700         public function testApiStatusesRepeatWithoutAuthenticatedUser()
1701         {
1702                 $_SESSION['authenticated'] = false;
1703                 api_statuses_repeat('json');
1704         }
1705
1706         /**
1707          * Test the api_statuses_repeat() function with an ID.
1708          * @return void
1709          */
1710         public function testApiStatusesRepeatWithId()
1711         {
1712                 $this->app->argv[3] = 1;
1713                 $result = api_statuses_repeat('json');
1714                 $this->assertStatus($result['status']);
1715
1716                 // Also test with a shared status
1717                 $this->app->argv[3] = 5;
1718                 $result = api_statuses_repeat('json');
1719                 $this->assertStatus($result['status']);
1720         }
1721
1722         /**
1723          * Test the api_statuses_destroy() function.
1724          * @return void
1725          * @expectedException Friendica\Network\HTTPException\BadRequestException
1726          */
1727         public function testApiStatusesDestroy()
1728         {
1729                 api_statuses_destroy('json');
1730         }
1731
1732         /**
1733          * Test the api_statuses_destroy() function without an authenticated user.
1734          * @return void
1735          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1736          */
1737         public function testApiStatusesDestroyWithoutAuthenticatedUser()
1738         {
1739                 $_SESSION['authenticated'] = false;
1740                 api_statuses_destroy('json');
1741         }
1742
1743         /**
1744          * Test the api_statuses_destroy() function with an ID.
1745          * @return void
1746          */
1747         public function testApiStatusesDestroyWithId()
1748         {
1749                 $this->app->argv[3] = 1;
1750                 $result = api_statuses_destroy('json');
1751                 $this->assertStatus($result['status']);
1752         }
1753
1754         /**
1755          * Test the api_statuses_mentions() function.
1756          * @return void
1757          */
1758         public function testApiStatusesMentions()
1759         {
1760                 $this->app->user = ['nickname' => $this->selfUser['nick']];
1761                 $_REQUEST['max_id'] = 10;
1762                 $result = api_statuses_mentions('json');
1763                 $this->assertEmpty($result['status']);
1764                 // We should test with mentions in the database.
1765         }
1766
1767         /**
1768          * Test the api_statuses_mentions() function with a negative page parameter.
1769          * @return void
1770          */
1771         public function testApiStatusesMentionsWithNegativePage()
1772         {
1773                 $_REQUEST['page'] = -2;
1774                 $result = api_statuses_mentions('json');
1775                 $this->assertEmpty($result['status']);
1776         }
1777
1778         /**
1779          * Test the api_statuses_mentions() function with an unallowed user.
1780          * @return void
1781          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1782          */
1783         public function testApiStatusesMentionsWithUnallowedUser()
1784         {
1785                 $_SESSION['allow_api'] = false;
1786                 $_GET['screen_name'] = $this->selfUser['nick'];
1787                 api_statuses_mentions('json');
1788         }
1789
1790         /**
1791          * Test the api_statuses_mentions() function with an RSS result.
1792          * @return void
1793          */
1794         public function testApiStatusesMentionsWithRss()
1795         {
1796                 $result = api_statuses_mentions('rss');
1797                 $this->assertXml($result, 'statuses');
1798         }
1799
1800         /**
1801          * Test the api_statuses_user_timeline() function.
1802          * @return void
1803          */
1804         public function testApiStatusesUserTimeline()
1805         {
1806                 $_REQUEST['max_id'] = 10;
1807                 $_REQUEST['exclude_replies'] = true;
1808                 $_REQUEST['conversation_id'] = 1;
1809                 $result = api_statuses_user_timeline('json');
1810                 $this->assertNotEmpty($result['status']);
1811                 foreach ($result['status'] as $status) {
1812                         $this->assertStatus($status);
1813                 }
1814         }
1815
1816         /**
1817          * Test the api_statuses_user_timeline() function with a negative page parameter.
1818          * @return void
1819          */
1820         public function testApiStatusesUserTimelineWithNegativePage()
1821         {
1822                 $_REQUEST['page'] = -2;
1823                 $result = api_statuses_user_timeline('json');
1824                 $this->assertNotEmpty($result['status']);
1825                 foreach ($result['status'] as $status) {
1826                         $this->assertStatus($status);
1827                 }
1828         }
1829
1830         /**
1831          * Test the api_statuses_user_timeline() function with an RSS result.
1832          * @return void
1833          */
1834         public function testApiStatusesUserTimelineWithRss()
1835         {
1836                 $result = api_statuses_user_timeline('rss');
1837                 $this->assertXml($result, 'statuses');
1838         }
1839
1840         /**
1841          * Test the api_statuses_user_timeline() function with an unallowed user.
1842          * @return void
1843          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1844          */
1845         public function testApiStatusesUserTimelineWithUnallowedUser()
1846         {
1847                 $_SESSION['allow_api'] = false;
1848                 $_GET['screen_name'] = $this->selfUser['nick'];
1849                 api_statuses_user_timeline('json');
1850         }
1851
1852         /**
1853          * Test the api_favorites_create_destroy() function.
1854          * @return void
1855          * @expectedException Friendica\Network\HTTPException\BadRequestException
1856          */
1857         public function testApiFavoritesCreateDestroy()
1858         {
1859                 $this->app->argv = ['api', '1.1', 'favorites', 'create'];
1860                 $this->app->argc = count($this->app->argv);
1861                 api_favorites_create_destroy('json');
1862         }
1863
1864         /**
1865          * Test the api_favorites_create_destroy() function with an invalid ID.
1866          * @return void
1867          * @expectedException Friendica\Network\HTTPException\BadRequestException
1868          */
1869         public function testApiFavoritesCreateDestroyWithInvalidId()
1870         {
1871                 $this->app->argv = ['api', '1.1', 'favorites', 'create', '12.json'];
1872                 $this->app->argc = count($this->app->argv);
1873                 api_favorites_create_destroy('json');
1874         }
1875
1876         /**
1877          * Test the api_favorites_create_destroy() function with an invalid action.
1878          * @return void
1879          * @expectedException Friendica\Network\HTTPException\BadRequestException
1880          */
1881         public function testApiFavoritesCreateDestroyWithInvalidAction()
1882         {
1883                 $this->app->argv = ['api', '1.1', 'favorites', 'change.json'];
1884                 $this->app->argc = count($this->app->argv);
1885                 $_REQUEST['id'] = 1;
1886                 api_favorites_create_destroy('json');
1887         }
1888
1889         /**
1890          * Test the api_favorites_create_destroy() function with the create action.
1891          * @return void
1892          */
1893         public function testApiFavoritesCreateDestroyWithCreateAction()
1894         {
1895                 $this->app->argv = ['api', '1.1', 'favorites', 'create.json'];
1896                 $this->app->argc = count($this->app->argv);
1897                 $_REQUEST['id'] = 3;
1898                 $result = api_favorites_create_destroy('json');
1899                 $this->assertStatus($result['status']);
1900         }
1901
1902         /**
1903          * Test the api_favorites_create_destroy() function with the create action and an RSS result.
1904          * @return void
1905          */
1906         public function testApiFavoritesCreateDestroyWithCreateActionAndRss()
1907         {
1908                 $this->app->argv = ['api', '1.1', 'favorites', 'create.rss'];
1909                 $this->app->argc = count($this->app->argv);
1910                 $_REQUEST['id'] = 3;
1911                 $result = api_favorites_create_destroy('rss');
1912                 $this->assertXml($result, 'status');
1913         }
1914
1915         /**
1916          * Test the api_favorites_create_destroy() function with the destroy action.
1917          * @return void
1918          */
1919         public function testApiFavoritesCreateDestroyWithDestroyAction()
1920         {
1921                 $this->app->argv = ['api', '1.1', 'favorites', 'destroy.json'];
1922                 $this->app->argc = count($this->app->argv);
1923                 $_REQUEST['id'] = 3;
1924                 $result = api_favorites_create_destroy('json');
1925                 $this->assertStatus($result['status']);
1926         }
1927
1928         /**
1929          * Test the api_favorites_create_destroy() function without an authenticated user.
1930          * @return void
1931          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1932          */
1933         public function testApiFavoritesCreateDestroyWithoutAuthenticatedUser()
1934         {
1935                 $this->app->argv = ['api', '1.1', 'favorites', 'create.json'];
1936                 $this->app->argc = count($this->app->argv);
1937                 $_SESSION['authenticated'] = false;
1938                 api_favorites_create_destroy('json');
1939         }
1940
1941         /**
1942          * Test the api_favorites() function.
1943          * @return void
1944          */
1945         public function testApiFavorites()
1946         {
1947                 $_REQUEST['page'] = -1;
1948                 $_REQUEST['max_id'] = 10;
1949                 $result = api_favorites('json');
1950                 foreach ($result['status'] as $status) {
1951                         $this->assertStatus($status);
1952                 }
1953         }
1954
1955         /**
1956          * Test the api_favorites() function with an RSS result.
1957          * @return void
1958          */
1959         public function testApiFavoritesWithRss()
1960         {
1961                 $result = api_favorites('rss');
1962                 $this->assertXml($result, 'statuses');
1963         }
1964
1965         /**
1966          * Test the api_favorites() function with an unallowed user.
1967          * @return void
1968          * @expectedException Friendica\Network\HTTPException\ForbiddenException
1969          */
1970         public function testApiFavoritesWithUnallowedUser()
1971         {
1972                 $_SESSION['allow_api'] = false;
1973                 $_GET['screen_name'] = $this->selfUser['nick'];
1974                 api_favorites('json');
1975         }
1976
1977         /**
1978          * Test the api_format_messages() function.
1979          * @return void
1980          */
1981         public function testApiFormatMessages()
1982         {
1983                 $result = api_format_messages(
1984                         ['id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
1985                         ['id' => 2, 'screen_name' => 'recipient_name'],
1986                         ['id' => 3, 'screen_name' => 'sender_name']
1987                 );
1988                 $this->assertEquals('item_title'."\n".'item_body', $result['text']);
1989                 $this->assertEquals(1, $result['id']);
1990                 $this->assertEquals(2, $result['recipient_id']);
1991                 $this->assertEquals(3, $result['sender_id']);
1992                 $this->assertEquals('recipient_name', $result['recipient_screen_name']);
1993                 $this->assertEquals('sender_name', $result['sender_screen_name']);
1994         }
1995
1996         /**
1997          * Test the api_format_messages() function with HTML.
1998          * @return void
1999          */
2000         public function testApiFormatMessagesWithHtmlText()
2001         {
2002                 $_GET['getText'] = 'html';
2003                 $result = api_format_messages(
2004                         ['id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
2005                         ['id' => 2, 'screen_name' => 'recipient_name'],
2006                         ['id' => 3, 'screen_name' => 'sender_name']
2007                 );
2008                 $this->assertEquals('item_title', $result['title']);
2009                 $this->assertEquals('<strong>item_body</strong>', $result['text']);
2010         }
2011
2012         /**
2013          * Test the api_format_messages() function with plain text.
2014          * @return void
2015          */
2016         public function testApiFormatMessagesWithPlainText()
2017         {
2018                 $_GET['getText'] = 'plain';
2019                 $result = api_format_messages(
2020                         ['id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
2021                         ['id' => 2, 'screen_name' => 'recipient_name'],
2022                         ['id' => 3, 'screen_name' => 'sender_name']
2023                 );
2024                 $this->assertEquals('item_title', $result['title']);
2025                 $this->assertEquals('item_body', $result['text']);
2026         }
2027
2028         /**
2029          * Test the api_format_messages() function with the getUserObjects GET parameter set to false.
2030          * @return void
2031          */
2032         public function testApiFormatMessagesWithoutUserObjects()
2033         {
2034                 $_GET['getUserObjects'] = 'false';
2035                 $result = api_format_messages(
2036                         ['id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
2037                         ['id' => 2, 'screen_name' => 'recipient_name'],
2038                         ['id' => 3, 'screen_name' => 'sender_name']
2039                 );
2040                 $this->assertTrue(!isset($result['sender']));
2041                 $this->assertTrue(!isset($result['recipient']));
2042         }
2043
2044         /**
2045          * Test the api_convert_item() function.
2046          * @return void
2047          */
2048         public function testApiConvertItem()
2049         {
2050                 $result = api_convert_item(
2051                         [
2052                                 'network' => 'feed',
2053                                 'title' => 'item_title',
2054                                 // We need a long string to test that it is correctly cut
2055                                 'body' => 'perspiciatis impedit voluptatem quis molestiae ea qui '.
2056                                 'reiciendis dolorum aut ducimus sunt consequatur inventore dolor '.
2057                                 'officiis pariatur doloremque nemo culpa aut quidem qui dolore '.
2058                                 'laudantium atque commodi alias voluptatem non possimus aperiam '.
2059                                 'ipsum rerum consequuntur aut amet fugit quia aliquid praesentium '.
2060                                 'repellendus quibusdam et et inventore mollitia rerum sit autem '.
2061                                 'pariatur maiores ipsum accusantium perferendis vel sit possimus '.
2062                                 'veritatis nihil distinctio qui eum repellat officia illum quos '.
2063                                 'impedit quam iste esse unde qui suscipit aut facilis ut inventore '.
2064                                 'omnis exercitationem quo magnam consequatur maxime aut illum '.
2065                                 'soluta quaerat natus unde aspernatur et sed beatae nihil ullam '.
2066                                 'temporibus corporis ratione blanditiis perspiciatis impedit '.
2067                                 'voluptatem quis molestiae ea qui reiciendis dolorum aut ducimus '.
2068                                 'sunt consequatur inventore dolor officiis pariatur doloremque '.
2069                                 'nemo culpa aut quidem qui dolore laudantium atque commodi alias '.
2070                                 'voluptatem non possimus aperiam ipsum rerum consequuntur aut '.
2071                                 'amet fugit quia aliquid praesentium repellendus quibusdam et et '.
2072                                 'inventore mollitia rerum sit autem pariatur maiores ipsum accusantium '.
2073                                 'perferendis vel sit possimus veritatis nihil distinctio qui eum '.
2074                                 'repellat officia illum quos impedit quam iste esse unde qui '.
2075                                 'suscipit aut facilis ut inventore omnis exercitationem quo magnam '.
2076                                 'consequatur maxime aut illum soluta quaerat natus unde aspernatur '.
2077                                 'et sed beatae nihil ullam temporibus corporis ratione blanditiis',
2078                                 'plink' => 'item_plink'
2079                         ]
2080                 );
2081                 $this->assertStringStartsWith('item_title', $result['text']);
2082                 $this->assertStringStartsWith('<h4>item_title</h4><br>perspiciatis impedit voluptatem', $result['html']);
2083         }
2084
2085         /**
2086          * Test the api_convert_item() function with an empty item body.
2087          * @return void
2088          */
2089         public function testApiConvertItemWithoutBody()
2090         {
2091                 $result = api_convert_item(
2092                         [
2093                                 'network' => 'feed',
2094                                 'title' => 'item_title',
2095                                 'body' => '',
2096                                 'plink' => 'item_plink'
2097                         ]
2098                 );
2099                 $this->assertEquals('item_title', $result['text']);
2100                 $this->assertEquals('<h4>item_title</h4><br>item_plink', $result['html']);
2101         }
2102
2103         /**
2104          * Test the api_convert_item() function with the title in the body.
2105          * @return void
2106          */
2107         public function testApiConvertItemWithTitleInBody()
2108         {
2109                 $result = api_convert_item(
2110                         [
2111                                 'title' => 'item_title',
2112                                 'body' => 'item_title item_body'
2113                         ]
2114                 );
2115                 $this->assertEquals('item_title item_body', $result['text']);
2116                 $this->assertEquals('<h4>item_title</h4><br>item_title item_body', $result['html']);
2117         }
2118
2119         /**
2120          * Test the api_get_attachments() function.
2121          * @return void
2122          */
2123         public function testApiGetAttachments()
2124         {
2125                 $body = 'body';
2126                 $this->assertEmpty(api_get_attachments($body));
2127         }
2128
2129         /**
2130          * Test the api_get_attachments() function with an img tag.
2131          * @return void
2132          */
2133         public function testApiGetAttachmentsWithImage()
2134         {
2135                 $body = '[img]http://via.placeholder.com/1x1.png[/img]';
2136                 $this->assertInternalType('array', api_get_attachments($body));
2137         }
2138
2139         /**
2140          * Test the api_get_attachments() function with an img tag and an AndStatus user agent.
2141          * @return void
2142          */
2143         public function testApiGetAttachmentsWithImageAndAndStatus()
2144         {
2145                 $_SERVER['HTTP_USER_AGENT'] = 'AndStatus';
2146                 $body = '[img]http://via.placeholder.com/1x1.png[/img]';
2147                 $this->assertInternalType('array', api_get_attachments($body));
2148         }
2149
2150         /**
2151          * Test the api_get_entitities() function.
2152          * @return void
2153          */
2154         public function testApiGetEntitities()
2155         {
2156                 $text = 'text';
2157                 $this->assertInternalType('array', api_get_entitities($text, 'bbcode'));
2158         }
2159
2160         /**
2161          * Test the api_get_entitities() function with the include_entities parameter.
2162          * @return void
2163          */
2164         public function testApiGetEntititiesWithIncludeEntities()
2165         {
2166                 $_REQUEST['include_entities'] = 'true';
2167                 $text = 'text';
2168                 $result = api_get_entitities($text, 'bbcode');
2169                 $this->assertInternalType('array', $result['hashtags']);
2170                 $this->assertInternalType('array', $result['symbols']);
2171                 $this->assertInternalType('array', $result['urls']);
2172                 $this->assertInternalType('array', $result['user_mentions']);
2173         }
2174
2175         /**
2176          * Test the api_format_items_embeded_images() function.
2177          * @return void
2178          */
2179         public function testApiFormatItemsEmbededImages()
2180         {
2181                 $this->assertEquals(
2182                         'text ' . System::baseUrl() . '/display/item_guid',
2183                         api_format_items_embeded_images(['guid' => 'item_guid'], 'text data:image/foo')
2184                 );
2185         }
2186
2187         /**
2188          * Test the api_contactlink_to_array() function.
2189          * @return void
2190          */
2191         public function testApiContactlinkToArray()
2192         {
2193                 $this->assertEquals(
2194                         [
2195                                 'name' => 'text',
2196                                 'url' => '',
2197                         ],
2198                         api_contactlink_to_array('text')
2199                 );
2200         }
2201
2202         /**
2203          * Test the api_contactlink_to_array() function with an URL.
2204          * @return void
2205          */
2206         public function testApiContactlinkToArrayWithUrl()
2207         {
2208                 $this->assertEquals(
2209                         [
2210                                 'name' => ['link_text'],
2211                                 'url' => ['url'],
2212                         ],
2213                         api_contactlink_to_array('text <a href="url">link_text</a>')
2214                 );
2215         }
2216
2217         /**
2218          * Test the api_format_items_activities() function.
2219          * @return void
2220          */
2221         public function testApiFormatItemsActivities()
2222         {
2223                 $item = ['uid' => 0, 'uri' => ''];
2224                 $result = api_format_items_activities($item);
2225                 $this->assertArrayHasKey('like', $result);
2226                 $this->assertArrayHasKey('dislike', $result);
2227                 $this->assertArrayHasKey('attendyes', $result);
2228                 $this->assertArrayHasKey('attendno', $result);
2229                 $this->assertArrayHasKey('attendmaybe', $result);
2230         }
2231
2232         /**
2233          * Test the api_format_items_activities() function with an XML result.
2234          * @return void
2235          */
2236         public function testApiFormatItemsActivitiesWithXml()
2237         {
2238                 $item = ['uid' => 0, 'uri' => ''];
2239                 $result = api_format_items_activities($item, 'xml');
2240                 $this->assertArrayHasKey('friendica:like', $result);
2241                 $this->assertArrayHasKey('friendica:dislike', $result);
2242                 $this->assertArrayHasKey('friendica:attendyes', $result);
2243                 $this->assertArrayHasKey('friendica:attendno', $result);
2244                 $this->assertArrayHasKey('friendica:attendmaybe', $result);
2245         }
2246
2247         /**
2248          * Test the api_format_items_profiles() function.
2249          * @return void
2250          */
2251         public function testApiFormatItemsProfiles()
2252         {
2253                 $profile_row = [
2254                         'id' => 'profile_id',
2255                         'profile-name' => 'profile_name',
2256                         'is-default' => true,
2257                         'hide-friends' => true,
2258                         'photo' => 'profile_photo',
2259                         'thumb' => 'profile_thumb',
2260                         'publish' => true,
2261                         'net-publish' => true,
2262                         'pdesc' => 'description',
2263                         'dob' => 'date_of_birth',
2264                         'address' => 'address',
2265                         'locality' => 'city',
2266                         'region' => 'region',
2267                         'postal-code' => 'postal_code',
2268                         'country-name' => 'country',
2269                         'hometown' => 'hometown',
2270                         'gender' => 'gender',
2271                         'marital' => 'marital',
2272                         'with' => 'marital_with',
2273                         'howlong' => 'marital_since',
2274                         'sexual' => 'sexual',
2275                         'politic' => 'politic',
2276                         'religion' => 'religion',
2277                         'pub_keywords' => 'public_keywords',
2278                         'prv_keywords' => 'private_keywords',
2279
2280                         'likes' => 'likes',
2281                         'dislikes' => 'dislikes',
2282                         'about' => 'about',
2283                         'music' => 'music',
2284                         'book' => 'book',
2285                         'tv' => 'tv',
2286                         'film' => 'film',
2287                         'interest' => 'interest',
2288                         'romance' => 'romance',
2289                         'work' => 'work',
2290                         'education' => 'education',
2291                         'contact' => 'social_networks',
2292                         'homepage' => 'homepage'
2293                 ];
2294                 $result = api_format_items_profiles($profile_row);
2295                 $this->assertEquals(
2296                         [
2297                                 'profile_id' => 'profile_id',
2298                                 'profile_name' => 'profile_name',
2299                                 'is_default' => true,
2300                                 'hide_friends' => true,
2301                                 'profile_photo' => 'profile_photo',
2302                                 'profile_thumb' => 'profile_thumb',
2303                                 'publish' => true,
2304                                 'net_publish' => true,
2305                                 'description' => 'description',
2306                                 'date_of_birth' => 'date_of_birth',
2307                                 'address' => 'address',
2308                                 'city' => 'city',
2309                                 'region' => 'region',
2310                                 'postal_code' => 'postal_code',
2311                                 'country' => 'country',
2312                                 'hometown' => 'hometown',
2313                                 'gender' => 'gender',
2314                                 'marital' => 'marital',
2315                                 'marital_with' => 'marital_with',
2316                                 'marital_since' => 'marital_since',
2317                                 'sexual' => 'sexual',
2318                                 'politic' => 'politic',
2319                                 'religion' => 'religion',
2320                                 'public_keywords' => 'public_keywords',
2321                                 'private_keywords' => 'private_keywords',
2322
2323                                 'likes' => 'likes',
2324                                 'dislikes' => 'dislikes',
2325                                 'about' => 'about',
2326                                 'music' => 'music',
2327                                 'book' => 'book',
2328                                 'tv' => 'tv',
2329                                 'film' => 'film',
2330                                 'interest' => 'interest',
2331                                 'romance' => 'romance',
2332                                 'work' => 'work',
2333                                 'education' => 'education',
2334                                 'social_networks' => 'social_networks',
2335                                 'homepage' => 'homepage',
2336                                 'users' => null
2337                         ],
2338                         $result
2339                 );
2340         }
2341
2342         /**
2343          * Test the api_format_items() function.
2344          * @return void
2345          */
2346         public function testApiFormatItems()
2347         {
2348                 $items = [
2349                         [
2350                                 'item_network' => 'item_network',
2351                                 'source' => 'web',
2352                                 'coord' => '5 7',
2353                                 'body' => '',
2354                                 'verb' => '',
2355                                 'author-id' => 43,
2356                                 'author-network' => Protocol::DFRN,
2357                                 'author-link' => 'http://localhost/profile/othercontact',
2358                                 'plink' => '',
2359                         ]
2360                 ];
2361                 $result = api_format_items($items, ['id' => 0], true);
2362                 foreach ($result as $status) {
2363                         $this->assertStatus($status);
2364                 }
2365         }
2366
2367         /**
2368          * Test the api_format_items() function with an XML result.
2369          * @return void
2370          */
2371         public function testApiFormatItemsWithXml()
2372         {
2373                 $items = [
2374                         [
2375                                 'coord' => '5 7',
2376                                 'body' => '',
2377                                 'verb' => '',
2378                                 'author-id' => 43,
2379                                 'author-network' => Protocol::DFRN,
2380                                 'author-link' => 'http://localhost/profile/othercontact',
2381                                 'plink' => '',
2382                         ]
2383                 ];
2384                 $result = api_format_items($items, ['id' => 0], true, 'xml');
2385                 foreach ($result as $status) {
2386                         $this->assertStatus($status);
2387                 }
2388         }
2389
2390         /**
2391          * Test the api_format_items() function.
2392          * @return void
2393          */
2394         public function testApiAccountRateLimitStatus()
2395         {
2396                 $result = api_account_rate_limit_status('json');
2397                 $this->assertEquals(150, $result['hash']['remaining_hits']);
2398                 $this->assertEquals(150, $result['hash']['hourly_limit']);
2399                 $this->assertInternalType('int', $result['hash']['reset_time_in_seconds']);
2400         }
2401
2402         /**
2403          * Test the api_format_items() function with an XML result.
2404          * @return void
2405          */
2406         public function testApiAccountRateLimitStatusWithXml()
2407         {
2408                 $result = api_account_rate_limit_status('xml');
2409                 $this->assertXml($result, 'hash');
2410         }
2411
2412         /**
2413          * Test the api_help_test() function.
2414          * @return void
2415          */
2416         public function testApiHelpTest()
2417         {
2418                 $result = api_help_test('json');
2419                 $this->assertEquals(['ok' => 'ok'], $result);
2420         }
2421
2422         /**
2423          * Test the api_help_test() function with an XML result.
2424          * @return void
2425          */
2426         public function testApiHelpTestWithXml()
2427         {
2428                 $result = api_help_test('xml');
2429                 $this->assertXml($result, 'ok');
2430         }
2431
2432         /**
2433          * Test the api_lists_list() function.
2434          * @return void
2435          */
2436         public function testApiListsList()
2437         {
2438                 $result = api_lists_list('json');
2439                 $this->assertEquals(['lists_list' => []], $result);
2440         }
2441
2442         /**
2443          * Test the api_lists_ownerships() function.
2444          * @return void
2445          */
2446         public function testApiListsOwnerships()
2447         {
2448                 $result = api_lists_ownerships('json');
2449                 foreach ($result['lists']['lists'] as $list) {
2450                         $this->assertList($list);
2451                 }
2452         }
2453
2454         /**
2455          * Test the api_lists_ownerships() function without an authenticated user.
2456          * @return void
2457          * @expectedException Friendica\Network\HTTPException\ForbiddenException
2458          */
2459         public function testApiListsOwnershipsWithoutAuthenticatedUser()
2460         {
2461                 $_SESSION['authenticated'] = false;
2462                 api_lists_ownerships('json');
2463         }
2464
2465         /**
2466          * Test the api_lists_statuses() function.
2467          * @expectedException Friendica\Network\HTTPException\BadRequestException
2468          * @return void
2469          */
2470         public function testApiListsStatuses()
2471         {
2472                 api_lists_statuses('json');
2473         }
2474
2475         /**
2476          * Test the api_lists_statuses() function with a list ID.
2477          * @return void
2478          */
2479         public function testApiListsStatusesWithListId()
2480         {
2481                 $_REQUEST['list_id'] = 1;
2482                 $_REQUEST['page'] = -1;
2483                 $_REQUEST['max_id'] = 10;
2484                 $result = api_lists_statuses('json');
2485                 foreach ($result['status'] as $status) {
2486                         $this->assertStatus($status);
2487                 }
2488         }
2489
2490         /**
2491          * Test the api_lists_statuses() function with a list ID and a RSS result.
2492          * @return void
2493          */
2494         public function testApiListsStatusesWithListIdAndRss()
2495         {
2496                 $_REQUEST['list_id'] = 1;
2497                 $result = api_lists_statuses('rss');
2498                 $this->assertXml($result, 'statuses');
2499         }
2500
2501         /**
2502          * Test the api_lists_statuses() function with an unallowed user.
2503          * @return void
2504          * @expectedException Friendica\Network\HTTPException\ForbiddenException
2505          */
2506         public function testApiListsStatusesWithUnallowedUser()
2507         {
2508                 $_SESSION['allow_api'] = false;
2509                 $_GET['screen_name'] = $this->selfUser['nick'];
2510                 api_lists_statuses('json');
2511         }
2512
2513         /**
2514          * Test the api_statuses_f() function.
2515          * @return void
2516          */
2517         public function testApiStatusesFWithFriends()
2518         {
2519                 $_GET['page'] = -1;
2520                 $result = api_statuses_f('friends');
2521                 $this->assertArrayHasKey('user', $result);
2522         }
2523
2524         /**
2525          * Test the api_statuses_f() function.
2526          * @return void
2527          */
2528         public function testApiStatusesFWithFollowers()
2529         {
2530                 $result = api_statuses_f('followers');
2531                 $this->assertArrayHasKey('user', $result);
2532         }
2533
2534         /**
2535          * Test the api_statuses_f() function.
2536          * @return void
2537          */
2538         public function testApiStatusesFWithBlocks()
2539         {
2540                 $result = api_statuses_f('blocks');
2541                 $this->assertArrayHasKey('user', $result);
2542         }
2543
2544         /**
2545          * Test the api_statuses_f() function.
2546          * @return void
2547          */
2548         public function testApiStatusesFWithIncoming()
2549         {
2550                 $result = api_statuses_f('incoming');
2551                 $this->assertArrayHasKey('user', $result);
2552         }
2553
2554         /**
2555          * Test the api_statuses_f() function an undefined cursor GET variable.
2556          * @return void
2557          */
2558         public function testApiStatusesFWithUndefinedCursor()
2559         {
2560                 $_GET['cursor'] = 'undefined';
2561                 $this->assertFalse(api_statuses_f('friends'));
2562         }
2563
2564         /**
2565          * Test the api_statuses_friends() function.
2566          * @return void
2567          */
2568         public function testApiStatusesFriends()
2569         {
2570                 $result = api_statuses_friends('json');
2571                 $this->assertArrayHasKey('user', $result);
2572         }
2573
2574         /**
2575          * Test the api_statuses_friends() function an undefined cursor GET variable.
2576          * @return void
2577          */
2578         public function testApiStatusesFriendsWithUndefinedCursor()
2579         {
2580                 $_GET['cursor'] = 'undefined';
2581                 $this->assertFalse(api_statuses_friends('json'));
2582         }
2583
2584         /**
2585          * Test the api_statuses_followers() function.
2586          * @return void
2587          */
2588         public function testApiStatusesFollowers()
2589         {
2590                 $result = api_statuses_followers('json');
2591                 $this->assertArrayHasKey('user', $result);
2592         }
2593
2594         /**
2595          * Test the api_statuses_followers() function an undefined cursor GET variable.
2596          * @return void
2597          */
2598         public function testApiStatusesFollowersWithUndefinedCursor()
2599         {
2600                 $_GET['cursor'] = 'undefined';
2601                 $this->assertFalse(api_statuses_followers('json'));
2602         }
2603
2604         /**
2605          * Test the api_blocks_list() function.
2606          * @return void
2607          */
2608         public function testApiBlocksList()
2609         {
2610                 $result = api_blocks_list('json');
2611                 $this->assertArrayHasKey('user', $result);
2612         }
2613
2614         /**
2615          * Test the api_blocks_list() function an undefined cursor GET variable.
2616          * @return void
2617          */
2618         public function testApiBlocksListWithUndefinedCursor()
2619         {
2620                 $_GET['cursor'] = 'undefined';
2621                 $this->assertFalse(api_blocks_list('json'));
2622         }
2623
2624         /**
2625          * Test the api_friendships_incoming() function.
2626          * @return void
2627          */
2628         public function testApiFriendshipsIncoming()
2629         {
2630                 $result = api_friendships_incoming('json');
2631                 $this->assertArrayHasKey('id', $result);
2632         }
2633
2634         /**
2635          * Test the api_friendships_incoming() function an undefined cursor GET variable.
2636          * @return void
2637          */
2638         public function testApiFriendshipsIncomingWithUndefinedCursor()
2639         {
2640                 $_GET['cursor'] = 'undefined';
2641                 $this->assertFalse(api_friendships_incoming('json'));
2642         }
2643
2644         /**
2645          * Test the api_statusnet_config() function.
2646          * @return void
2647          */
2648         public function testApiStatusnetConfig()
2649         {
2650                 $result = api_statusnet_config('json');
2651                 $this->assertEquals('localhost', $result['config']['site']['server']);
2652                 $this->assertEquals('default', $result['config']['site']['theme']);
2653                 $this->assertEquals(System::baseUrl() . '/images/friendica-64.png', $result['config']['site']['logo']);
2654                 $this->assertTrue($result['config']['site']['fancy']);
2655                 $this->assertEquals('en', $result['config']['site']['language']);
2656                 $this->assertEquals('UTC', $result['config']['site']['timezone']);
2657                 $this->assertEquals(200000, $result['config']['site']['textlimit']);
2658                 $this->assertEquals('false', $result['config']['site']['private']);
2659                 $this->assertEquals('false', $result['config']['site']['ssl']);
2660                 $this->assertEquals(30, $result['config']['site']['shorturllength']);
2661         }
2662
2663         /**
2664          * Test the api_statusnet_version() function.
2665          * @return void
2666          */
2667         public function testApiStatusnetVersion()
2668         {
2669                 $result = api_statusnet_version('json');
2670                 $this->assertEquals('0.9.7', $result['version']);
2671         }
2672
2673         /**
2674          * Test the api_ff_ids() function.
2675          * @return void
2676          */
2677         public function testApiFfIds()
2678         {
2679                 $result = api_ff_ids('json');
2680                 $this->assertNull($result);
2681         }
2682
2683         /**
2684          * Test the api_ff_ids() function with a result.
2685          * @return void
2686          */
2687         public function testApiFfIdsWithResult()
2688         {
2689                 $this->markTestIncomplete();
2690         }
2691
2692         /**
2693          * Test the api_ff_ids() function without an authenticated user.
2694          * @return void
2695          * @expectedException Friendica\Network\HTTPException\ForbiddenException
2696          */
2697         public function testApiFfIdsWithoutAuthenticatedUser()
2698         {
2699                 $_SESSION['authenticated'] = false;
2700                 api_ff_ids('json');
2701         }
2702
2703         /**
2704          * Test the api_friends_ids() function.
2705          * @return void
2706          */
2707         public function testApiFriendsIds()
2708         {
2709                 $result = api_friends_ids('json');
2710                 $this->assertNull($result);
2711         }
2712
2713         /**
2714          * Test the api_followers_ids() function.
2715          * @return void
2716          */
2717         public function testApiFollowersIds()
2718         {
2719                 $result = api_followers_ids('json');
2720                 $this->assertNull($result);
2721         }
2722
2723         /**
2724          * Test the api_direct_messages_new() function.
2725          * @return void
2726          */
2727         public function testApiDirectMessagesNew()
2728         {
2729                 $result = api_direct_messages_new('json');
2730                 $this->assertNull($result);
2731         }
2732
2733         /**
2734          * Test the api_direct_messages_new() function without an authenticated user.
2735          * @return void
2736          * @expectedException Friendica\Network\HTTPException\ForbiddenException
2737          */
2738         public function testApiDirectMessagesNewWithoutAuthenticatedUser()
2739         {
2740                 $_SESSION['authenticated'] = false;
2741                 api_direct_messages_new('json');
2742         }
2743
2744         /**
2745          * Test the api_direct_messages_new() function with an user ID.
2746          * @return void
2747          */
2748         public function testApiDirectMessagesNewWithUserId()
2749         {
2750                 $_POST['text'] = 'message_text';
2751                 $_POST['user_id'] = $this->otherUser['id'];
2752                 $result = api_direct_messages_new('json');
2753                 $this->assertEquals(['direct_message' => ['error' => -1]], $result);
2754         }
2755
2756         /**
2757          * Test the api_direct_messages_new() function with a screen name.
2758          * @return void
2759          */
2760         public function testApiDirectMessagesNewWithScreenName()
2761         {
2762                 $_POST['text'] = 'message_text';
2763                 $_POST['screen_name'] = $this->friendUser['nick'];
2764                 $result = api_direct_messages_new('json');
2765                 $this->assertEquals(1, $result['direct_message']['id']);
2766                 $this->assertContains('message_text', $result['direct_message']['text']);
2767                 $this->assertEquals('selfcontact', $result['direct_message']['sender_screen_name']);
2768                 $this->assertEquals(1, $result['direct_message']['friendica_seen']);
2769         }
2770
2771         /**
2772          * Test the api_direct_messages_new() function with a title.
2773          * @return void
2774          */
2775         public function testApiDirectMessagesNewWithTitle()
2776         {
2777                 $_POST['text'] = 'message_text';
2778                 $_POST['screen_name'] = $this->friendUser['nick'];
2779                 $_REQUEST['title'] = 'message_title';
2780                 $result = api_direct_messages_new('json');
2781                 $this->assertEquals(1, $result['direct_message']['id']);
2782                 $this->assertContains('message_text', $result['direct_message']['text']);
2783                 $this->assertContains('message_title', $result['direct_message']['text']);
2784                 $this->assertEquals('selfcontact', $result['direct_message']['sender_screen_name']);
2785                 $this->assertEquals(1, $result['direct_message']['friendica_seen']);
2786         }
2787
2788         /**
2789          * Test the api_direct_messages_new() function with an RSS result.
2790          * @return void
2791          */
2792         public function testApiDirectMessagesNewWithRss()
2793         {
2794                 $_POST['text'] = 'message_text';
2795                 $_POST['screen_name'] = $this->friendUser['nick'];
2796                 $result = api_direct_messages_new('rss');
2797                 $this->assertXml($result, 'direct-messages');
2798         }
2799
2800         /**
2801          * Test the api_direct_messages_destroy() function.
2802          * @return void
2803          * @expectedException Friendica\Network\HTTPException\BadRequestException
2804          */
2805         public function testApiDirectMessagesDestroy()
2806         {
2807                 api_direct_messages_destroy('json');
2808         }
2809
2810         /**
2811          * Test the api_direct_messages_destroy() function with the friendica_verbose GET param.
2812          * @return void
2813          */
2814         public function testApiDirectMessagesDestroyWithVerbose()
2815         {
2816                 $_GET['friendica_verbose'] = 'true';
2817                 $result = api_direct_messages_destroy('json');
2818                 $this->assertEquals(
2819                         [
2820                                 '$result' => [
2821                                         'result' => 'error',
2822                                         'message' => 'message id or parenturi not specified'
2823                                 ]
2824                         ],
2825                         $result
2826                 );
2827         }
2828
2829         /**
2830          * Test the api_direct_messages_destroy() function without an authenticated user.
2831          * @return void
2832          * @expectedException Friendica\Network\HTTPException\ForbiddenException
2833          */
2834         public function testApiDirectMessagesDestroyWithoutAuthenticatedUser()
2835         {
2836                 $_SESSION['authenticated'] = false;
2837                 api_direct_messages_destroy('json');
2838         }
2839
2840         /**
2841          * Test the api_direct_messages_destroy() function with a non-zero ID.
2842          * @return void
2843          * @expectedException Friendica\Network\HTTPException\BadRequestException
2844          */
2845         public function testApiDirectMessagesDestroyWithId()
2846         {
2847                 $_REQUEST['id'] = 1;
2848                 api_direct_messages_destroy('json');
2849         }
2850
2851         /**
2852          * Test the api_direct_messages_destroy() with a non-zero ID and the friendica_verbose GET param.
2853          * @return void
2854          */
2855         public function testApiDirectMessagesDestroyWithIdAndVerbose()
2856         {
2857                 $_REQUEST['id'] = 1;
2858                 $_REQUEST['friendica_parenturi'] = 'parent_uri';
2859                 $_GET['friendica_verbose'] = 'true';
2860                 $result = api_direct_messages_destroy('json');
2861                 $this->assertEquals(
2862                         [
2863                                 '$result' => [
2864                                         'result' => 'error',
2865                                         'message' => 'message id not in database'
2866                                 ]
2867                         ],
2868                         $result
2869                 );
2870         }
2871
2872         /**
2873          * Test the api_direct_messages_destroy() function with a non-zero ID.
2874          * @return void
2875          */
2876         public function testApiDirectMessagesDestroyWithCorrectId()
2877         {
2878                 $this->markTestIncomplete('We need to add a dataset for this.');
2879         }
2880
2881         /**
2882          * Test the api_direct_messages_box() function.
2883          * @return void
2884          */
2885         public function testApiDirectMessagesBoxWithSentbox()
2886         {
2887                 $_REQUEST['page'] = -1;
2888                 $_REQUEST['max_id'] = 10;
2889                 $result = api_direct_messages_box('json', 'sentbox', 'false');
2890                 $this->assertArrayHasKey('direct_message', $result);
2891         }
2892
2893         /**
2894          * Test the api_direct_messages_box() function.
2895          * @return void
2896          */
2897         public function testApiDirectMessagesBoxWithConversation()
2898         {
2899                 $result = api_direct_messages_box('json', 'conversation', 'false');
2900                 $this->assertArrayHasKey('direct_message', $result);
2901         }
2902
2903         /**
2904          * Test the api_direct_messages_box() function.
2905          * @return void
2906          */
2907         public function testApiDirectMessagesBoxWithAll()
2908         {
2909                 $result = api_direct_messages_box('json', 'all', 'false');
2910                 $this->assertArrayHasKey('direct_message', $result);
2911         }
2912
2913         /**
2914          * Test the api_direct_messages_box() function.
2915          * @return void
2916          */
2917         public function testApiDirectMessagesBoxWithInbox()
2918         {
2919                 $result = api_direct_messages_box('json', 'inbox', 'false');
2920                 $this->assertArrayHasKey('direct_message', $result);
2921         }
2922
2923         /**
2924          * Test the api_direct_messages_box() function.
2925          * @return void
2926          */
2927         public function testApiDirectMessagesBoxWithVerbose()
2928         {
2929                 $result = api_direct_messages_box('json', 'sentbox', 'true');
2930                 $this->assertEquals(
2931                         [
2932                                 '$result' => [
2933                                         'result' => 'error',
2934                                         'message' => 'no mails available'
2935                                 ]
2936                         ],
2937                         $result
2938                 );
2939         }
2940
2941         /**
2942          * Test the api_direct_messages_box() function with a RSS result.
2943          * @return void
2944          */
2945         public function testApiDirectMessagesBoxWithRss()
2946         {
2947                 $result = api_direct_messages_box('rss', 'sentbox', 'false');
2948                 $this->assertXml($result, 'direct-messages');
2949         }
2950
2951         /**
2952          * Test the api_direct_messages_box() function without an authenticated user.
2953          * @return void
2954          * @expectedException Friendica\Network\HTTPException\ForbiddenException
2955          */
2956         public function testApiDirectMessagesBoxWithUnallowedUser()
2957         {
2958                 $_SESSION['allow_api'] = false;
2959                 $_GET['screen_name'] = $this->selfUser['nick'];
2960                 api_direct_messages_box('json', 'sentbox', 'false');
2961         }
2962
2963         /**
2964          * Test the api_direct_messages_sentbox() function.
2965          * @return void
2966          */
2967         public function testApiDirectMessagesSentbox()
2968         {
2969                 $result = api_direct_messages_sentbox('json');
2970                 $this->assertArrayHasKey('direct_message', $result);
2971         }
2972
2973         /**
2974          * Test the api_direct_messages_inbox() function.
2975          * @return void
2976          */
2977         public function testApiDirectMessagesInbox()
2978         {
2979                 $result = api_direct_messages_inbox('json');
2980                 $this->assertArrayHasKey('direct_message', $result);
2981         }
2982
2983         /**
2984          * Test the api_direct_messages_all() function.
2985          * @return void
2986          */
2987         public function testApiDirectMessagesAll()
2988         {
2989                 $result = api_direct_messages_all('json');
2990                 $this->assertArrayHasKey('direct_message', $result);
2991         }
2992
2993         /**
2994          * Test the api_direct_messages_conversation() function.
2995          * @return void
2996          */
2997         public function testApiDirectMessagesConversation()
2998         {
2999                 $result = api_direct_messages_conversation('json');
3000                 $this->assertArrayHasKey('direct_message', $result);
3001         }
3002
3003         /**
3004          * Test the api_oauth_request_token() function.
3005          * @return void
3006          */
3007         public function testApiOauthRequestToken()
3008         {
3009                 $this->markTestIncomplete('killme() kills phpunit as well');
3010         }
3011
3012         /**
3013          * Test the api_oauth_access_token() function.
3014          * @return void
3015          */
3016         public function testApiOauthAccessToken()
3017         {
3018                 $this->markTestIncomplete('killme() kills phpunit as well');
3019         }
3020
3021         /**
3022          * Test the api_fr_photoalbum_delete() function.
3023          * @return void
3024          * @expectedException Friendica\Network\HTTPException\BadRequestException
3025          */
3026         public function testApiFrPhotoalbumDelete()
3027         {
3028                 api_fr_photoalbum_delete('json');
3029         }
3030
3031         /**
3032          * Test the api_fr_photoalbum_delete() function with an album name.
3033          * @return void
3034          * @expectedException Friendica\Network\HTTPException\BadRequestException
3035          */
3036         public function testApiFrPhotoalbumDeleteWithAlbum()
3037         {
3038                 $_REQUEST['album'] = 'album_name';
3039                 api_fr_photoalbum_delete('json');
3040         }
3041
3042         /**
3043          * Test the api_fr_photoalbum_delete() function with an album name.
3044          * @return void
3045          */
3046         public function testApiFrPhotoalbumDeleteWithValidAlbum()
3047         {
3048                 $this->markTestIncomplete('We need to add a dataset for this.');
3049         }
3050
3051         /**
3052          * Test the api_fr_photoalbum_delete() function.
3053          * @return void
3054          * @expectedException Friendica\Network\HTTPException\BadRequestException
3055          */
3056         public function testApiFrPhotoalbumUpdate()
3057         {
3058                 api_fr_photoalbum_update('json');
3059         }
3060
3061         /**
3062          * Test the api_fr_photoalbum_delete() function with an album name.
3063          * @return void
3064          * @expectedException Friendica\Network\HTTPException\BadRequestException
3065          */
3066         public function testApiFrPhotoalbumUpdateWithAlbum()
3067         {
3068                 $_REQUEST['album'] = 'album_name';
3069                 api_fr_photoalbum_update('json');
3070         }
3071
3072         /**
3073          * Test the api_fr_photoalbum_delete() function with an album name.
3074          * @return void
3075          * @expectedException Friendica\Network\HTTPException\BadRequestException
3076          */
3077         public function testApiFrPhotoalbumUpdateWithAlbumAndNewAlbum()
3078         {
3079                 $_REQUEST['album'] = 'album_name';
3080                 $_REQUEST['album_new'] = 'album_name';
3081                 api_fr_photoalbum_update('json');
3082         }
3083
3084         /**
3085          * Test the api_fr_photoalbum_update() function without an authenticated user.
3086          * @return void
3087          * @expectedException Friendica\Network\HTTPException\ForbiddenException
3088          */
3089         public function testApiFrPhotoalbumUpdateWithoutAuthenticatedUser()
3090         {
3091                 $_SESSION['authenticated'] = false;
3092                 api_fr_photoalbum_update('json');
3093         }
3094
3095         /**
3096          * Test the api_fr_photoalbum_delete() function with an album name.
3097          * @return void
3098          */
3099         public function testApiFrPhotoalbumUpdateWithValidAlbum()
3100         {
3101                 $this->markTestIncomplete('We need to add a dataset for this.');
3102         }
3103
3104         /**
3105          * Test the api_fr_photos_list() function.
3106          * @return void
3107          */
3108         public function testApiFrPhotosList()
3109         {
3110                 $result = api_fr_photos_list('json');
3111                 $this->assertArrayHasKey('photo', $result);
3112         }
3113
3114         /**
3115          * Test the api_fr_photos_list() function without an authenticated user.
3116          * @return void
3117          * @expectedException Friendica\Network\HTTPException\ForbiddenException
3118          */
3119         public function testApiFrPhotosListWithoutAuthenticatedUser()
3120         {
3121                 $_SESSION['authenticated'] = false;
3122                 api_fr_photos_list('json');
3123         }
3124
3125         /**
3126          * Test the api_fr_photo_create_update() function.
3127          * @return void
3128          * @expectedException Friendica\Network\HTTPException\BadRequestException
3129          */
3130         public function testApiFrPhotoCreateUpdate()
3131         {
3132                 api_fr_photo_create_update('json');
3133         }
3134
3135         /**
3136          * Test the api_fr_photo_create_update() function without an authenticated user.
3137          * @return void
3138          * @expectedException Friendica\Network\HTTPException\ForbiddenException
3139          */
3140         public function testApiFrPhotoCreateUpdateWithoutAuthenticatedUser()
3141         {
3142                 $_SESSION['authenticated'] = false;
3143                 api_fr_photo_create_update('json');
3144         }
3145
3146         /**
3147          * Test the api_fr_photo_create_update() function with an album name.
3148          * @return void
3149          * @expectedException Friendica\Network\HTTPException\BadRequestException
3150          */
3151         public function testApiFrPhotoCreateUpdateWithAlbum()
3152         {
3153                 $_REQUEST['album'] = 'album_name';
3154                 api_fr_photo_create_update('json');
3155         }
3156
3157         /**
3158          * Test the api_fr_photo_create_update() function with the update mode.
3159          * @return void
3160          */
3161         public function testApiFrPhotoCreateUpdateWithUpdate()
3162         {
3163                 $this->markTestIncomplete('We need to create a dataset for this');
3164         }
3165
3166         /**
3167          * Test the api_fr_photo_create_update() function with an uploaded file.
3168          * @return void
3169          */
3170         public function testApiFrPhotoCreateUpdateWithFile()
3171         {
3172                 $this->markTestIncomplete();
3173         }
3174
3175         /**
3176          * Test the api_fr_photo_delete() function.
3177          * @return void
3178          * @expectedException Friendica\Network\HTTPException\BadRequestException
3179          */
3180         public function testApiFrPhotoDelete()
3181         {
3182                 api_fr_photo_delete('json');
3183         }
3184
3185         /**
3186          * Test the api_fr_photo_delete() function without an authenticated user.
3187          * @return void
3188          * @expectedException Friendica\Network\HTTPException\ForbiddenException
3189          */
3190         public function testApiFrPhotoDeleteWithoutAuthenticatedUser()
3191         {
3192                 $_SESSION['authenticated'] = false;
3193                 api_fr_photo_delete('json');
3194         }
3195
3196         /**
3197          * Test the api_fr_photo_delete() function with a photo ID.
3198          * @return void
3199          * @expectedException Friendica\Network\HTTPException\BadRequestException
3200          */
3201         public function testApiFrPhotoDeleteWithPhotoId()
3202         {
3203                 $_REQUEST['photo_id'] = 1;
3204                 api_fr_photo_delete('json');
3205         }
3206
3207         /**
3208          * Test the api_fr_photo_delete() function with a correct photo ID.
3209          * @return void
3210          */
3211         public function testApiFrPhotoDeleteWithCorrectPhotoId()
3212         {
3213                 $this->markTestIncomplete('We need to create a dataset for this.');
3214         }
3215
3216         /**
3217          * Test the api_fr_photo_detail() function.
3218          * @return void
3219          * @expectedException Friendica\Network\HTTPException\BadRequestException
3220          */
3221         public function testApiFrPhotoDetail()
3222         {
3223                 api_fr_photo_detail('json');
3224         }
3225
3226         /**
3227          * Test the api_fr_photo_detail() function without an authenticated user.
3228          * @return void
3229          * @expectedException Friendica\Network\HTTPException\ForbiddenException
3230          */
3231         public function testApiFrPhotoDetailWithoutAuthenticatedUser()
3232         {
3233                 $_SESSION['authenticated'] = false;
3234                 api_fr_photo_detail('json');
3235         }
3236
3237         /**
3238          * Test the api_fr_photo_detail() function with a photo ID.
3239          * @return void
3240          * @expectedException Friendica\Network\HTTPException\NotFoundException
3241          */
3242         public function testApiFrPhotoDetailWithPhotoId()
3243         {
3244                 $_REQUEST['photo_id'] = 1;
3245                 api_fr_photo_detail('json');
3246         }
3247
3248         /**
3249          * Test the api_fr_photo_detail() function with a correct photo ID.
3250          * @return void
3251          */
3252         public function testApiFrPhotoDetailCorrectPhotoId()
3253         {
3254                 $this->markTestIncomplete('We need to create a dataset for this.');
3255         }
3256
3257         /**
3258          * Test the api_account_update_profile_image() function.
3259          * @return void
3260          * @expectedException Friendica\Network\HTTPException\BadRequestException
3261          */
3262         public function testApiAccountUpdateProfileImage()
3263         {
3264                 api_account_update_profile_image('json');
3265         }
3266
3267         /**
3268          * Test the api_account_update_profile_image() function without an authenticated user.
3269          * @return void
3270          * @expectedException Friendica\Network\HTTPException\ForbiddenException
3271          */
3272         public function testApiAccountUpdateProfileImageWithoutAuthenticatedUser()
3273         {
3274                 $_SESSION['authenticated'] = false;
3275                 api_account_update_profile_image('json');
3276         }
3277
3278         /**
3279          * Test the api_account_update_profile_image() function with an uploaded file.
3280          * @return void
3281          * @expectedException Friendica\Network\HTTPException\BadRequestException
3282          */
3283         public function testApiAccountUpdateProfileImageWithUpload()
3284         {
3285                 $this->markTestIncomplete();
3286         }
3287
3288
3289         /**
3290          * Test the api_account_update_profile() function.
3291          * @return void
3292          */
3293         public function testApiAccountUpdateProfile()
3294         {
3295                 $_POST['name'] = 'new_name';
3296                 $_POST['description'] = 'new_description';
3297                 $result = api_account_update_profile('json');
3298                 // We can't use assertSelfUser() here because the user object is missing some properties.
3299                 $this->assertEquals($this->selfUser['id'], $result['user']['cid']);
3300                 $this->assertEquals('DFRN', $result['user']['location']);
3301                 $this->assertEquals($this->selfUser['nick'], $result['user']['screen_name']);
3302                 $this->assertEquals('dfrn', $result['user']['network']);
3303                 $this->assertEquals('new_name', $result['user']['name']);
3304                 $this->assertEquals('new_description', $result['user']['description']);
3305         }
3306
3307         /**
3308          * Test the check_acl_input() function.
3309          * @return void
3310          */
3311         public function testCheckAclInput()
3312         {
3313                 $result = check_acl_input('<aclstring>');
3314                 // Where does this result come from?
3315                 $this->assertEquals(1, $result);
3316         }
3317
3318         /**
3319          * Test the check_acl_input() function with an empty ACL string.
3320          * @return void
3321          */
3322         public function testCheckAclInputWithEmptyAclString()
3323         {
3324                 $result = check_acl_input(' ');
3325                 $this->assertFalse($result);
3326         }
3327
3328         /**
3329          * Test the save_media_to_database() function.
3330          * @return void
3331          */
3332         public function testSaveMediaToDatabase()
3333         {
3334                 $this->markTestIncomplete();
3335         }
3336
3337         /**
3338          * Test the post_photo_item() function.
3339          * @return void
3340          */
3341         public function testPostPhotoItem()
3342         {
3343                 $this->markTestIncomplete();
3344         }
3345
3346         /**
3347          * Test the prepare_photo_data() function.
3348          * @return void
3349          */
3350         public function testPreparePhotoData()
3351         {
3352                 $this->markTestIncomplete();
3353         }
3354
3355         /**
3356          * Test the api_friendica_remoteauth() function.
3357          * @return void
3358          * @expectedException Friendica\Network\HTTPException\BadRequestException
3359          */
3360         public function testApiFriendicaRemoteauth()
3361         {
3362                 api_friendica_remoteauth();
3363         }
3364
3365         /**
3366          * Test the api_friendica_remoteauth() function with an URL.
3367          * @return void
3368          * @expectedException Friendica\Network\HTTPException\BadRequestException
3369          */
3370         public function testApiFriendicaRemoteauthWithUrl()
3371         {
3372                 $_GET['url'] = 'url';
3373                 $_GET['c_url'] = 'url';
3374                 api_friendica_remoteauth();
3375         }
3376
3377         /**
3378          * Test the api_friendica_remoteauth() function with a correct URL.
3379          * @return void
3380          */
3381         public function testApiFriendicaRemoteauthWithCorrectUrl()
3382         {
3383                 $this->markTestIncomplete("We can't use an assertion here because of App->redirect().");
3384                 $_GET['url'] = 'url';
3385                 $_GET['c_url'] = $this->selfUser['nurl'];
3386                 api_friendica_remoteauth();
3387         }
3388
3389         /**
3390          * Test the api_share_as_retweet() function.
3391          * @return void
3392          */
3393         public function testApiShareAsRetweet()
3394         {
3395                 $item = ['body' => '', 'author-id' => 1, 'owner-id' => 1];
3396                 $result = api_share_as_retweet($item);
3397                 $this->assertFalse($result);
3398         }
3399
3400         /**
3401          * Test the api_share_as_retweet() function with a valid item.
3402          * @return void
3403          */
3404         public function testApiShareAsRetweetWithValidItem()
3405         {
3406                 $this->markTestIncomplete();
3407         }
3408
3409         /**
3410          * Test the api_get_nick() function.
3411          * @return void
3412          */
3413         public function testApiGetNick()
3414         {
3415                 $result = api_get_nick($this->otherUser['nurl']);
3416                 $this->assertEquals('othercontact', $result);
3417         }
3418
3419         /**
3420          * Test the api_get_nick() function with a wrong URL.
3421          * @return void
3422          */
3423         public function testApiGetNickWithWrongUrl()
3424         {
3425                 $result = api_get_nick('wrong_url');
3426                 $this->assertFalse($result);
3427         }
3428
3429         /**
3430          * Test the api_in_reply_to() function.
3431          * @return void
3432          */
3433         public function testApiInReplyTo()
3434         {
3435                 $result = api_in_reply_to(['id' => 0, 'parent' => 0, 'uri' => '', 'thr-parent' => '']);
3436                 $this->assertArrayHasKey('status_id', $result);
3437                 $this->assertArrayHasKey('user_id', $result);
3438                 $this->assertArrayHasKey('status_id_str', $result);
3439                 $this->assertArrayHasKey('user_id_str', $result);
3440                 $this->assertArrayHasKey('screen_name', $result);
3441         }
3442
3443         /**
3444          * Test the api_in_reply_to() function with a valid item.
3445          * @return void
3446          */
3447         public function testApiInReplyToWithValidItem()
3448         {
3449                 $this->markTestIncomplete();
3450         }
3451
3452         /**
3453          * Test the api_clean_plain_items() function.
3454          * @return void
3455          */
3456         public function testApiCleanPlainItems()
3457         {
3458                 $_REQUEST['include_entities'] = 'true';
3459                 $result = api_clean_plain_items('some_text [url="some_url"]some_text[/url]');
3460                 $this->assertEquals('some_text [url="some_url"]"some_url"[/url]', $result);
3461         }
3462
3463         /**
3464          * Test the api_clean_attachments() function.
3465          * @return void
3466          */
3467         public function testApiCleanAttachments()
3468         {
3469                 $this->markTestIncomplete();
3470         }
3471
3472         /**
3473          * Test the api_best_nickname() function.
3474          * @return void
3475          */
3476         public function testApiBestNickname()
3477         {
3478                 $contacts = [];
3479                 $result = api_best_nickname($contacts);
3480                 $this->assertNull($result);
3481         }
3482
3483         /**
3484          * Test the api_best_nickname() function with contacts.
3485          * @return void
3486          */
3487         public function testApiBestNicknameWithContacts()
3488         {
3489                 $this->markTestIncomplete();
3490         }
3491
3492         /**
3493          * Test the api_friendica_group_show() function.
3494          * @return void
3495          */
3496         public function testApiFriendicaGroupShow()
3497         {
3498                 $this->markTestIncomplete();
3499         }
3500
3501         /**
3502          * Test the api_friendica_group_delete() function.
3503          * @return void
3504          */
3505         public function testApiFriendicaGroupDelete()
3506         {
3507                 $this->markTestIncomplete();
3508         }
3509
3510         /**
3511          * Test the api_lists_destroy() function.
3512          * @return void
3513          */
3514         public function testApiListsDestroy()
3515         {
3516                 $this->markTestIncomplete();
3517         }
3518
3519         /**
3520          * Test the group_create() function.
3521          * @return void
3522          */
3523         public function testGroupCreate()
3524         {
3525                 $this->markTestIncomplete();
3526         }
3527
3528         /**
3529          * Test the api_friendica_group_create() function.
3530          * @return void
3531          */
3532         public function testApiFriendicaGroupCreate()
3533         {
3534                 $this->markTestIncomplete();
3535         }
3536
3537         /**
3538          * Test the api_lists_create() function.
3539          * @return void
3540          */
3541         public function testApiListsCreate()
3542         {
3543                 $this->markTestIncomplete();
3544         }
3545
3546         /**
3547          * Test the api_friendica_group_update() function.
3548          * @return void
3549          */
3550         public function testApiFriendicaGroupUpdate()
3551         {
3552                 $this->markTestIncomplete();
3553         }
3554
3555         /**
3556          * Test the api_lists_update() function.
3557          * @return void
3558          */
3559         public function testApiListsUpdate()
3560         {
3561                 $this->markTestIncomplete();
3562         }
3563
3564         /**
3565          * Test the api_friendica_activity() function.
3566          * @return void
3567          */
3568         public function testApiFriendicaActivity()
3569         {
3570                 $this->markTestIncomplete();
3571         }
3572
3573         /**
3574          * Test the api_friendica_notification() function.
3575          * @return void
3576          * @expectedException Friendica\Network\HTTPException\BadRequestException
3577          */
3578         public function testApiFriendicaNotification()
3579         {
3580                 api_friendica_notification('json');
3581         }
3582
3583         /**
3584          * Test the api_friendica_notification() function without an authenticated user.
3585          * @return void
3586          * @expectedException Friendica\Network\HTTPException\ForbiddenException
3587          */
3588         public function testApiFriendicaNotificationWithoutAuthenticatedUser()
3589         {
3590                 $_SESSION['authenticated'] = false;
3591                 api_friendica_notification('json');
3592         }
3593
3594         /**
3595          * Test the api_friendica_notification() function with an argument count.
3596          * @return void
3597          */
3598         public function testApiFriendicaNotificationWithArgumentCount()
3599         {
3600                 $this->app->argv = ['api', 'friendica', 'notification'];
3601                 $this->app->argc = count($this->app->argv);
3602                 $result = api_friendica_notification('json');
3603                 $this->assertEquals(['note' => false], $result);
3604         }
3605
3606         /**
3607          * Test the api_friendica_notification() function with an XML result.
3608          * @return void
3609          */
3610         public function testApiFriendicaNotificationWithXmlResult()
3611         {
3612                 $this->app->argv = ['api', 'friendica', 'notification'];
3613                 $this->app->argc = count($this->app->argv);
3614                 $result = api_friendica_notification('xml');
3615                 $this->assertXml($result, 'notes');
3616         }
3617
3618         /**
3619          * Test the api_friendica_notification_seen() function.
3620          * @return void
3621          */
3622         public function testApiFriendicaNotificationSeen()
3623         {
3624                 $this->markTestIncomplete();
3625         }
3626
3627         /**
3628          * Test the api_friendica_direct_messages_setseen() function.
3629          * @return void
3630          */
3631         public function testApiFriendicaDirectMessagesSetseen()
3632         {
3633                 $this->markTestIncomplete();
3634         }
3635
3636         /**
3637          * Test the api_friendica_direct_messages_search() function.
3638          * @return void
3639          */
3640         public function testApiFriendicaDirectMessagesSearch()
3641         {
3642                 $this->markTestIncomplete();
3643         }
3644
3645         /**
3646          * Test the api_friendica_profile_show() function.
3647          * @return void
3648          */
3649         public function testApiFriendicaProfileShow()
3650         {
3651                 $result = api_friendica_profile_show('json');
3652                 // We can't use assertSelfUser() here because the user object is missing some properties.
3653                 $this->assertEquals($this->selfUser['id'], $result['$result']['friendica_owner']['cid']);
3654                 $this->assertEquals('DFRN', $result['$result']['friendica_owner']['location']);
3655                 $this->assertEquals($this->selfUser['name'], $result['$result']['friendica_owner']['name']);
3656                 $this->assertEquals($this->selfUser['nick'], $result['$result']['friendica_owner']['screen_name']);
3657                 $this->assertEquals('dfrn', $result['$result']['friendica_owner']['network']);
3658                 $this->assertTrue($result['$result']['friendica_owner']['verified']);
3659                 $this->assertFalse($result['$result']['multi_profiles']);
3660         }
3661
3662         /**
3663          * Test the api_friendica_profile_show() function with a profile ID.
3664          * @return void
3665          */
3666         public function testApiFriendicaProfileShowWithProfileId()
3667         {
3668                 $this->markTestIncomplete('We need to add a dataset for this.');
3669         }
3670
3671         /**
3672          * Test the api_friendica_profile_show() function with a wrong profile ID.
3673          * @return void
3674          * @expectedException Friendica\Network\HTTPException\BadRequestException
3675          */
3676         public function testApiFriendicaProfileShowWithWrongProfileId()
3677         {
3678                 $_REQUEST['profile_id'] = 666;
3679                 api_friendica_profile_show('json');
3680         }
3681
3682         /**
3683          * Test the api_friendica_profile_show() function without an authenticated user.
3684          * @return void
3685          * @expectedException Friendica\Network\HTTPException\ForbiddenException
3686          */
3687         public function testApiFriendicaProfileShowWithoutAuthenticatedUser()
3688         {
3689                 $_SESSION['authenticated'] = false;
3690                 api_friendica_profile_show('json');
3691         }
3692
3693         /**
3694          * Test the api_saved_searches_list() function.
3695          * @return void
3696          */
3697         public function testApiSavedSearchesList()
3698         {
3699                 $result = api_saved_searches_list('json');
3700                 $this->assertEquals(1, $result['terms'][0]['id']);
3701                 $this->assertEquals(1, $result['terms'][0]['id_str']);
3702                 $this->assertEquals('Saved search', $result['terms'][0]['name']);
3703                 $this->assertEquals('Saved search', $result['terms'][0]['query']);
3704         }
3705 }