. * */ namespace Friendica\Test\src\Module\Api; use Friendica\App\Arguments; use Friendica\App\BaseURL; use Friendica\Core\L10n; use Friendica\Factory\Api\Twitter\User; use Friendica\Module\Api\ApiResponse; use Friendica\Test\MockedTest; use Psr\Log\NullLogger; class ApiResponseTest extends MockedTest { public function testErrorWithJson() { $l10n = \Mockery::mock(L10n::class); $args = \Mockery::mock(Arguments::class); $args->shouldReceive('getQueryString')->andReturn(''); $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $response->error(200, 'OK', 'error_message', 'json'); self::assertEquals('{"error":"error_message","code":"200 OK","request":""}', $response->getContent()); } public function testErrorWithXml() { $l10n = \Mockery::mock(L10n::class); $args = \Mockery::mock(Arguments::class); $args->shouldReceive('getQueryString')->andReturn(''); $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $response->error(200, 'OK', 'error_message', 'xml'); self::assertEquals(['Content-type' => 'text/xml', 'HTTP/1.1 200 OK'], $response->getHeaders()); self::assertEquals('' . "\n" . '' . "\n" . ' error_message' . "\n" . ' 200 OK' . "\n" . ' ' . "\n" . '' . "\n", $response->getContent()); } public function testErrorWithRss() { $l10n = \Mockery::mock(L10n::class); $args = \Mockery::mock(Arguments::class); $args->shouldReceive('getQueryString')->andReturn(''); $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $response->error(200, 'OK', 'error_message', 'rss'); self::assertEquals(['Content-type' => 'application/rss+xml', 'HTTP/1.1 200 OK'], $response->getHeaders()); self::assertEquals( '' . "\n" . '' . "\n" . ' error_message' . "\n" . ' 200 OK' . "\n" . ' ' . "\n" . '' . "\n", $response->getContent()); } public function testErrorWithAtom() { $l10n = \Mockery::mock(L10n::class); $args = \Mockery::mock(Arguments::class); $args->shouldReceive('getQueryString')->andReturn(''); $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $response->error(200, 'OK', 'error_message', 'atom'); self::assertEquals(['Content-type' => 'application/atom+xml', 'HTTP/1.1 200 OK'], $response->getHeaders()); self::assertEquals( '' . "\n" . '' . "\n" . ' error_message' . "\n" . ' 200 OK' . "\n" . ' ' . "\n" . '' . "\n", $response->getContent()); } public function testUnsupported() { $l10n = \Mockery::mock(L10n::class); $l10n->shouldReceive('t')->andReturnUsing(function ($args) { return $args; }); $args = \Mockery::mock(Arguments::class); $args->shouldReceive('getQueryString')->andReturn(''); $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $response->unsupported(); self::assertEquals('{"error":"API endpoint %s %s is not implemented","error_description":"The API endpoint is currently not implemented but might be in the future."}', $response->getContent()); } /** * Test the BaseApi::reformatXML() function. * * @return void */ public function testApiReformatXml() { $item = true; $key = ''; self::assertTrue(ApiResponse::reformatXML($item, $key)); self::assertEquals('true', $item); } /** * Test the BaseApi::reformatXML() function with a statusnet_api key. * * @return void */ public function testApiReformatXmlWithStatusnetKey() { $item = ''; $key = 'statusnet_api'; self::assertTrue(ApiResponse::reformatXML($item, $key)); self::assertEquals('statusnet:api', $key); } /** * Test the BaseApi::reformatXML() function with a friendica_api key. * * @return void */ public function testApiReformatXmlWithFriendicaKey() { $item = ''; $key = 'friendica_api'; self::assertTrue(ApiResponse::reformatXML($item, $key)); self::assertEquals('friendica:api', $key); } /** * Test the BaseApi::createXML() function. * * @return void */ public function testApiCreateXml() { $l10n = \Mockery::mock(L10n::class); $l10n->shouldReceive('t')->andReturnUsing(function ($args) { return $args; }); $args = \Mockery::mock(Arguments::class); $args->shouldReceive('getQueryString')->andReturn(''); $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); self::assertEquals( '' . "\n" . '' . "\n" . ' some_data' . "\n" . '' . "\n", $response->createXML(['data' => ['some_data']], 'root_element') ); } /** * Test the BaseApi::createXML() function without any XML namespace. * * @return void */ public function testApiCreateXmlWithoutNamespaces() { $l10n = \Mockery::mock(L10n::class); $l10n->shouldReceive('t')->andReturnUsing(function ($args) { return $args; }); $args = \Mockery::mock(Arguments::class); $args->shouldReceive('getQueryString')->andReturn(''); $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); self::assertEquals( '' . "\n" . '' . "\n" . ' some_data' . "\n" . '' . "\n", $response->createXML(['data' => ['some_data']], 'ok') ); } /** * Test the BaseApi::formatData() function. * * @return void */ public function testApiFormatData() { $l10n = \Mockery::mock(L10n::class); $l10n->shouldReceive('t')->andReturnUsing(function ($args) { return $args; }); $args = \Mockery::mock(Arguments::class); $args->shouldReceive('getQueryString')->andReturn(''); $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $data = ['some_data']; self::assertEquals($data, $response->formatData('root_element', 'json', $data)); } /** * Test the BaseApi::formatData() function with an XML result. * * @return void */ public function testApiFormatDataWithXml() { $l10n = \Mockery::mock(L10n::class); $l10n->shouldReceive('t')->andReturnUsing(function ($args) { return $args; }); $args = \Mockery::mock(Arguments::class); $args->shouldReceive('getQueryString')->andReturn(''); $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); self::assertEquals( '' . "\n" . '' . "\n" . ' some_data' . "\n" . '' . "\n", $response->formatData('root_element', 'xml', ['data' => ['some_data']]) ); } /** * Test the api_rss_extra() function. * * @return void */ public function testApiRssExtra() { self::markTestIncomplete('Cannot mock it yet.'); /* $user_info = ['url' => 'user_url', 'lang' => 'en']; $userMock = \Mockery::mock(\Friendica\Object\Api\Twitter\User::class); $userMock->shouldReceive('toArray')->andReturn($user_info); $l10n = \Mockery::mock(L10n::class); $l10n->shouldReceive('t')->andReturnUsing(function ($args) { return $args; }); $args = \Mockery::mock(Arguments::class); $args->shouldReceive('getQueryString')->andReturn(''); $baseUrl = \Mockery::mock(BaseURL::class); $baseUrl->shouldReceive('__toString')->andReturn('https://friendica.local'); $twitterUser = \Mockery::mock(User::class); $twitterUser->shouldReceive('createFromContactId')->with(1)->andReturn($userMock); $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $result = $response->formatData('root_element', 'rss', ['data' => ['some_data']], 1); print_r($result); self::assertEquals($user_info, $result['$user']); self::assertEquals($user_info['url'], $result['$rss']['alternate']); self::assertArrayHasKey('self', $result['$rss']); self::assertArrayHasKey('base', $result['$rss']); self::assertArrayHasKey('updated', $result['$rss']); self::assertArrayHasKey('atom_updated', $result['$rss']); self::assertArrayHasKey('language', $result['$rss']); self::assertArrayHasKey('logo', $result['$rss']); */ } /** * Test the api_rss_extra() function without any user info. * * @return void */ public function testApiRssExtraWithoutUserInfo() { self::markTestIncomplete('Cannot mock it yet.'); /* $result = api_rss_extra([], null); self::assertIsArray($result['$user']); self::assertArrayHasKey('alternate', $result['$rss']); self::assertArrayHasKey('self', $result['$rss']); self::assertArrayHasKey('base', $result['$rss']); self::assertArrayHasKey('updated', $result['$rss']); self::assertArrayHasKey('atom_updated', $result['$rss']); self::assertArrayHasKey('language', $result['$rss']); self::assertArrayHasKey('logo', $result['$rss']); */ } }