diff --git a/index.php b/index.php index ba990532b8..c8d0037df0 100644 --- a/index.php +++ b/index.php @@ -45,6 +45,7 @@ $a->runFrontend( $dice->create(\Friendica\Core\PConfig\Capability\IManagePersonalConfigValues::class), $dice->create(\Friendica\Security\Authentication::class), $dice->create(\Friendica\App\Page::class), + $dice->create(Friendica\Module\Special\HTTPException::class), new \Friendica\Util\HTTPInputData($_SERVER), $start_time ); diff --git a/src/App.php b/src/App.php index b41215380f..b84c3b6294 100644 --- a/src/App.php +++ b/src/App.php @@ -573,13 +573,14 @@ class App * @param IManagePersonalConfigValues $pconfig * @param Authentication $auth The Authentication backend of the node * @param App\Page $page The Friendica page printing container + * @param ModuleHTTPException $httpException The possible HTTP Exception container * @param HTTPInputData $httpInput A library for processing PHP input streams * @param float $start_time The start time of the overall script execution * * @throws HTTPException\InternalServerErrorException * @throws \ImagickException */ - public function runFrontend(App\Router $router, IManagePersonalConfigValues $pconfig, Authentication $auth, App\Page $page, HTTPInputData $httpInput, float $start_time) + public function runFrontend(App\Router $router, IManagePersonalConfigValues $pconfig, Authentication $auth, App\Page $page, ModuleHTTPException $httpException, HTTPInputData $httpInput, float $start_time) { $this->profiler->set($start_time, 'start'); $this->profiler->set(microtime(true), 'classinit'); @@ -713,9 +714,9 @@ class App $httpinput = $httpInput->process(); $input = array_merge($httpinput['variables'], $httpinput['files'], $request ?? $_REQUEST); - // Let the module run it's internal process (init, get, post, ...) + // Let the module run its internal process (init, get, post, ...) $timestamp = microtime(true); - $response = $module->run($input); + $response = $module->run($httpException, $input); $this->profiler->set(microtime(true) - $timestamp, 'content'); if ($response->getHeaderLine(ICanCreateResponses::X_HEADER) === ICanCreateResponses::TYPE_HTML) { $page->run($this, $this->baseURL, $this->args, $this->mode, $response, $this->l10n, $this->profiler, $this->config, $pconfig, $this->session->getLocalUserId()); @@ -723,7 +724,7 @@ class App $page->exit($response); } } catch (HTTPException $e) { - (new ModuleHTTPException())->rawContent($e); + $httpException->rawContent($e); } $page->logRuntime($this->config, 'runFrontend'); } diff --git a/src/BaseModule.php b/src/BaseModule.php index 09107f0472..12efbce811 100644 --- a/src/BaseModule.php +++ b/src/BaseModule.php @@ -181,7 +181,7 @@ abstract class BaseModule implements ICanHandleRequests /** * {@inheritDoc} */ - public function run(array $request = []): ResponseInterface + public function run(ModuleHTTPException $httpException, array $request = []): ResponseInterface { // @see https://github.com/tootsuite/mastodon/blob/c3aef491d66aec743a3a53e934a494f653745b61/config/initializers/cors.rb if (substr($this->args->getQueryString(), 0, 12) == '.well-known/') { @@ -243,7 +243,7 @@ abstract class BaseModule implements ICanHandleRequests $this->response->addContent($arr['content']); $this->response->addContent($this->content($request)); } catch (HTTPException $e) { - $this->response->addContent((new ModuleHTTPException())->content($e)); + $this->response->addContent($httpException->content($e)); } finally { $this->profiler->set(microtime(true) - $timestamp, 'content'); } diff --git a/src/Capabilities/ICanHandleRequests.php b/src/Capabilities/ICanHandleRequests.php index 154eae69e5..c0f99eaa1b 100644 --- a/src/Capabilities/ICanHandleRequests.php +++ b/src/Capabilities/ICanHandleRequests.php @@ -21,6 +21,7 @@ namespace Friendica\Capabilities; +use Friendica\Module\Special\HTTPException as ModuleHTTPException; use Friendica\Network\HTTPException; use Psr\Http\Message\ResponseInterface; @@ -30,11 +31,12 @@ use Psr\Http\Message\ResponseInterface; interface ICanHandleRequests { /** - * @param array $request The $_REQUEST content (including content from the PHP input stream) + * @param ModuleHTTPException $httpException The special HTTPException Module in case of underlying errors + * @param array $request The $_REQUEST content (including content from the PHP input stream) * * @return ResponseInterface responding to the request handling * * @throws HTTPException\InternalServerErrorException */ - public function run(array $request = []): ResponseInterface; + public function run(ModuleHTTPException $httpException, array $request = []): ResponseInterface; } diff --git a/src/Module/Api/Mastodon/Apps.php b/src/Module/Api/Mastodon/Apps.php index f14ff68177..1c1ec80602 100644 --- a/src/Module/Api/Mastodon/Apps.php +++ b/src/Module/Api/Mastodon/Apps.php @@ -25,6 +25,7 @@ use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Module\BaseApi; +use Friendica\Module\Special\HTTPException; use Friendica\Util\Network; use Psr\Http\Message\ResponseInterface; @@ -33,9 +34,9 @@ use Psr\Http\Message\ResponseInterface; */ class Apps extends BaseApi { - public function run(array $request = [], bool $scopecheck = true): ResponseInterface + public function run(HTTPException $httpException, array $request = [], bool $scopecheck = true): ResponseInterface { - return parent::run($request, false); + return parent::run($httpException, $request, false); } /** diff --git a/src/Module/BaseApi.php b/src/Module/BaseApi.php index 1d5249ac85..82dda9de9f 100644 --- a/src/Module/BaseApi.php +++ b/src/Module/BaseApi.php @@ -33,6 +33,7 @@ use Friendica\Model\Item; use Friendica\Model\Post; use Friendica\Model\User; use Friendica\Module\Api\ApiResponse; +use Friendica\Module\Special\HTTPException as ModuleHTTPException; use Friendica\Network\HTTPException; use Friendica\Security\BasicAuth; use Friendica\Security\OAuth; @@ -80,7 +81,7 @@ class BaseApi extends BaseModule * * @throws HTTPException\ForbiddenException */ - public function run(array $request = [], bool $scopecheck = true): ResponseInterface + public function run(ModuleHTTPException $httpException, array $request = [], bool $scopecheck = true): ResponseInterface { if ($scopecheck) { switch ($this->args->getMethod()) { @@ -97,7 +98,7 @@ class BaseApi extends BaseModule } } - return parent::run($request); + return parent::run($httpException, $request); } /** diff --git a/src/Module/HTTPException/MethodNotAllowed.php b/src/Module/HTTPException/MethodNotAllowed.php index 7dc3737596..5728e0a376 100644 --- a/src/Module/HTTPException/MethodNotAllowed.php +++ b/src/Module/HTTPException/MethodNotAllowed.php @@ -22,13 +22,12 @@ namespace Friendica\Module\HTTPException; use Friendica\BaseModule; -use Friendica\DI; use Friendica\Network\HTTPException; class MethodNotAllowed extends BaseModule { protected function content(array $request = []): string { - throw new HTTPException\MethodNotAllowedException(DI::l10n()->t('Method Not Allowed.')); + throw new HTTPException\MethodNotAllowedException($this->t('Method Not Allowed.')); } } diff --git a/src/Module/HTTPException/PageNotFound.php b/src/Module/HTTPException/PageNotFound.php index ecebc7757a..2b6e546527 100644 --- a/src/Module/HTTPException/PageNotFound.php +++ b/src/Module/HTTPException/PageNotFound.php @@ -25,8 +25,8 @@ use Friendica\App; use Friendica\BaseModule; use Friendica\Core\L10n; use Friendica\Core\System; -use Friendica\DI; use Friendica\Module\Response; +use Friendica\Module\Special\HTTPException as ModuleHTTPException; use Friendica\Network\HTTPException; use Friendica\Util\Profiler; use Psr\Http\Message\ResponseInterface; @@ -46,10 +46,10 @@ class PageNotFound extends BaseModule protected function content(array $request = []): string { - throw new HTTPException\NotFoundException(DI::l10n()->t('Page not found.')); + throw new HTTPException\NotFoundException($this->t('Page not found.')); } - public function run(array $request = []): ResponseInterface + public function run(ModuleHTTPException $httpException, array $request = []): ResponseInterface { /* The URL provided does not resolve to a valid module. * @@ -77,6 +77,6 @@ class PageNotFound extends BaseModule 'query' => $this->server['QUERY_STRING'] ]); - return parent::run($request); // TODO: Change the autogenerated stub + return parent::run($httpException, $request); } } diff --git a/src/Module/OAuth/Acknowledge.php b/src/Module/OAuth/Acknowledge.php index fe947a63c0..e2a65a0e28 100644 --- a/src/Module/OAuth/Acknowledge.php +++ b/src/Module/OAuth/Acknowledge.php @@ -24,6 +24,7 @@ namespace Friendica\Module\OAuth; use Friendica\Core\Renderer; use Friendica\DI; use Friendica\Module\BaseApi; +use Friendica\Module\Special\HTTPException; use Psr\Http\Message\ResponseInterface; /** @@ -31,9 +32,9 @@ use Psr\Http\Message\ResponseInterface; */ class Acknowledge extends BaseApi { - public function run(array $request = [], bool $scopecheck = true): ResponseInterface + public function run(HTTPException $httpException, array $request = [], bool $scopecheck = true): ResponseInterface { - return parent::run($request, false); + return parent::run($httpException, $request, false); } protected function post(array $request = []) diff --git a/src/Module/OAuth/Revoke.php b/src/Module/OAuth/Revoke.php index 0604e90bf7..11d65420c0 100644 --- a/src/Module/OAuth/Revoke.php +++ b/src/Module/OAuth/Revoke.php @@ -26,6 +26,7 @@ use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Module\BaseApi; +use Friendica\Module\Special\HTTPException; use Psr\Http\Message\ResponseInterface; /** @@ -33,9 +34,9 @@ use Psr\Http\Message\ResponseInterface; */ class Revoke extends BaseApi { - public function run(array $request = [], bool $scopecheck = true): ResponseInterface + public function run(HTTPException $httpException, array $request = [], bool $scopecheck = true): ResponseInterface { - return parent::run($request, false); + return parent::run($httpException, $request, false); } protected function post(array $request = []) diff --git a/src/Module/OAuth/Token.php b/src/Module/OAuth/Token.php index 1da8df18d5..14e9be7a69 100644 --- a/src/Module/OAuth/Token.php +++ b/src/Module/OAuth/Token.php @@ -26,6 +26,7 @@ use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Module\BaseApi; +use Friendica\Module\Special\HTTPException; use Friendica\Security\OAuth; use Friendica\Util\DateTimeFormat; use Psr\Http\Message\ResponseInterface; @@ -36,9 +37,9 @@ use Psr\Http\Message\ResponseInterface; */ class Token extends BaseApi { - public function run(array $request = [], bool $scopecheck = true): ResponseInterface + public function run(HTTPException $httpException, array $request = [], bool $scopecheck = true): ResponseInterface { - return parent::run($request, false); + return parent::run($httpException, $request, false); } protected function post(array $request = []) diff --git a/src/Module/Special/HTTPException.php b/src/Module/Special/HTTPException.php index 0cd7817ed4..6928cf810f 100644 --- a/src/Module/Special/HTTPException.php +++ b/src/Module/Special/HTTPException.php @@ -21,10 +21,13 @@ namespace Friendica\Module\Special; -use Friendica\Core\Logger; +use Friendica\App\Arguments; +use Friendica\App\Request; +use Friendica\Core\L10n; use Friendica\Core\Renderer; +use Friendica\Core\Session\Model\UserSession; use Friendica\Core\System; -use Friendica\DI; +use Psr\Log\LoggerInterface; /** * This special module displays HTTPException when they are thrown in modules. @@ -33,27 +36,52 @@ use Friendica\DI; */ class HTTPException { + /** @var L10n */ + protected $l10n; + /** @var LoggerInterface */ + protected $logger; + /** @var Arguments */ + protected $args; + /** @var bool */ + protected $isSiteAdmin; + /** @var array */ + protected $server; + /** @var string */ + protected $requestId; + + public function __construct(L10n $l10n, LoggerInterface $logger, Arguments $args, UserSession $session, Request $request, array $server = []) + { + $this->logger = $logger; + $this->l10n = $l10n; + $this->args = $args; + $this->isSiteAdmin = $session->isSiteAdmin(); + $this->server = $server; + $this->requestId = $request->getRequestId(); + } + /** * Generates the necessary template variables from the caught HTTPException. * * Fills in the blanks if title or descriptions aren't provided by the exception. * * @param \Friendica\Network\HTTPException $e + * * @return array ['$title' => ..., '$description' => ...] */ - private static function getVars(\Friendica\Network\HTTPException $e) + private function getVars(\Friendica\Network\HTTPException $e) { // Explanations are mostly taken from https://en.wikipedia.org/wiki/List_of_HTTP_status_codes $vars = [ - '$title' => $e->getDescription() ?: 'Error ' . $e->getCode(), - '$message' => $e->getMessage() ?: $e->getExplanation(), - '$back' => DI::l10n()->t('Go back'), - '$stack_trace' => DI::l10n()->t('Stack trace:'), + '$title' => $e->getDescription() ?: 'Error ' . $e->getCode(), + '$message' => $e->getMessage() ?: $e->getExplanation(), + '$back' => $this->l10n->t('Go back'), + '$stack_trace' => $this->l10n->t('Stack trace:'), + '$request_id' => $this->requestId, ]; - if (DI::app()->isSiteAdmin()) { - $vars['$thrown'] = DI::l10n()->t('Exception thrown in %s:%d', $e->getFile(), $e->getLine()); - $vars['$trace'] = $e->getTraceAsString(); + if ($this->isSiteAdmin) { + $vars['$thrown'] = $this->l10n->t('Exception thrown in %s:%d', $e->getFile(), $e->getLine()); + $vars['$trace'] = $e->getTraceAsString(); } return $vars; @@ -63,6 +91,7 @@ class HTTPException * Displays a bare message page with no theming at all. * * @param \Friendica\Network\HTTPException $e + * * @throws \Exception */ public function rawContent(\Friendica\Network\HTTPException $e) @@ -70,13 +99,13 @@ class HTTPException $content = ''; if ($e->getCode() >= 400) { - $vars = self::getVars($e); + $vars = $this->getVars($e); try { - $tpl = Renderer::getMarkupTemplate('http_status.tpl'); + $tpl = Renderer::getMarkupTemplate('http_status.tpl'); $content = Renderer::replaceMacros($tpl, $vars); } catch (\Exception $e) { $content = "

{$vars['$title']}

{$vars['$message']}

"; - if (DI::app()->isSiteAdmin()) { + if ($this->isSiteAdmin) { $content .= "

{$vars['$thrown']}

"; $content .= "
{$vars['$trace']}
"; } @@ -90,19 +119,28 @@ class HTTPException * Returns a content string that can be integrated in the current theme. * * @param \Friendica\Network\HTTPException $e + * * @return string * @throws \Exception */ public function content(\Friendica\Network\HTTPException $e): string { - header($_SERVER["SERVER_PROTOCOL"] . ' ' . $e->getCode() . ' ' . $e->getDescription()); + header($this->server['SERVER_PROTOCOL'] ?? 'HTTP/1.0' . ' ' . $e->getCode() . ' ' . $e->getDescription()); if ($e->getCode() >= 400) { - Logger::debug('Exit with error', ['code' => $e->getCode(), 'description' => $e->getDescription(), 'query' => DI::args()->getQueryString(), 'callstack' => System::callstack(20), 'method' => DI::args()->getMethod(), 'agent' => $_SERVER['HTTP_USER_AGENT'] ?? '']); + $this->logger->debug('Exit with error', + [ + 'code' => $e->getCode(), + 'description' => $e->getDescription(), + 'query' => $this->args->getQueryString(), + 'callstack' => System::callstack(20), + 'method' => $this->args->getMethod(), + 'agent' => $this->server['HTTP_USER_AGENT'] ?? '' + ]); } $tpl = Renderer::getMarkupTemplate('exception.tpl'); - return Renderer::replaceMacros($tpl, self::getVars($e)); + return Renderer::replaceMacros($tpl, $this->getVars($e)); } } diff --git a/static/dependencies.config.php b/static/dependencies.config.php index fd242c3417..a4c52e0043 100644 --- a/static/dependencies.config.php +++ b/static/dependencies.config.php @@ -273,5 +273,10 @@ return [ ], \Psr\Clock\ClockInterface::class => [ 'instanceOf' => Util\Clock\SystemClock::class - ] + ], + \Friendica\Module\Special\HTTPException::class => [ + 'constructParams' => [ + $_SERVER + ], + ], ]; diff --git a/tests/src/Module/Api/ApiTest.php b/tests/src/Module/Api/ApiTest.php index 890bba19b6..c01f39f4c9 100644 --- a/tests/src/Module/Api/ApiTest.php +++ b/tests/src/Module/Api/ApiTest.php @@ -27,12 +27,14 @@ use Friendica\Core\Addon; use Friendica\Core\Hook; use Friendica\Database\Database; use Friendica\DI; +use Friendica\Module\Special\HTTPException; use Friendica\Security\Authentication; use Friendica\Security\BasicAuth; use Friendica\Test\FixtureTest; use Friendica\Test\Util\AppDouble; use Friendica\Test\Util\AuthenticationDouble; use Friendica\Test\Util\AuthTestConfig; +use Mockery\MockInterface; use Psr\Http\Message\ResponseInterface; abstract class ApiTest extends FixtureTest @@ -59,6 +61,9 @@ abstract class ApiTest extends FixtureTest 'nurl' => 'http://localhost/profile/othercontact' ]; + /** @var HTTPException */ + protected $httpExceptionMock; + // User ID that we know is not in the database const WRONG_USER_ID = 666; @@ -175,6 +180,8 @@ abstract class ApiTest extends FixtureTest // Manual override to bypass API authentication DI::app()->setIsLoggedIn(true); + $this->httpExceptionMock = $this->dice->create(HTTPException::class); + AuthTestConfig::$authenticated = true; AuthTestConfig::$user_id = 42; diff --git a/tests/src/Module/Api/Friendica/DirectMessages/SearchTest.php b/tests/src/Module/Api/Friendica/DirectMessages/SearchTest.php index 09845a99b4..9ec0f6f0dc 100644 --- a/tests/src/Module/Api/Friendica/DirectMessages/SearchTest.php +++ b/tests/src/Module/Api/Friendica/DirectMessages/SearchTest.php @@ -35,7 +35,7 @@ class SearchTest extends ApiTest $directMessage = new DirectMessage(new NullLogger(), DI::dba(), DI::twitterUser()); $response = (new Search($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); $json = $this->toJson($response); @@ -53,7 +53,7 @@ class SearchTest extends ApiTest $directMessage = new DirectMessage(new NullLogger(), DI::dba(), DI::twitterUser()); $response = (new Search($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'searchstring' => 'item_body' ]); @@ -74,7 +74,7 @@ class SearchTest extends ApiTest $directMessage = new DirectMessage(new NullLogger(), DI::dba(), DI::twitterUser()); $response = (new Search($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'searchstring' => 'test' ]); diff --git a/tests/src/Module/Api/Friendica/NotificationTest.php b/tests/src/Module/Api/Friendica/NotificationTest.php index 3c17471b03..1599b8abc1 100644 --- a/tests/src/Module/Api/Friendica/NotificationTest.php +++ b/tests/src/Module/Api/Friendica/NotificationTest.php @@ -67,7 +67,7 @@ class NotificationTest extends ApiTest XML; $response = (new Notification(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'xml'])) - ->run(); + ->run($this->httpExceptionMock); self::assertXmlStringEqualsXmlString($assertXml, (string)$response->getBody()); self::assertEquals([ @@ -79,7 +79,7 @@ XML; public function testWithJsonResult() { $response = (new Notification(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run(); + ->run($this->httpExceptionMock); $json = $this->toJson($response); diff --git a/tests/src/Module/Api/Friendica/Photo/DeleteTest.php b/tests/src/Module/Api/Friendica/Photo/DeleteTest.php index e3e208ff02..b946affe2b 100644 --- a/tests/src/Module/Api/Friendica/Photo/DeleteTest.php +++ b/tests/src/Module/Api/Friendica/Photo/DeleteTest.php @@ -39,7 +39,7 @@ class DeleteTest extends ApiTest public function testEmpty() { $this->expectException(BadRequestException::class); - (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run(); + (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run($this->httpExceptionMock); } public function testWithoutAuthenticatedUser() @@ -50,7 +50,7 @@ class DeleteTest extends ApiTest public function testWrong() { $this->expectException(BadRequestException::class); - (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run(['photo_id' => 1]); + (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run($this->httpExceptionMock, ['photo_id' => 1]); } public function testValidWithPost() @@ -58,7 +58,7 @@ class DeleteTest extends ApiTest $this->loadFixture(__DIR__ . '/../../../../../datasets/photo/photo.fixture.php', DI::dba()); $response = (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'photo_id' => '709057080661a283a6aa598501504178' ]); @@ -73,7 +73,7 @@ class DeleteTest extends ApiTest $this->loadFixture(__DIR__ . '/../../../../../datasets/photo/photo.fixture.php', DI::dba()); $response = (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'photo_id' => '709057080661a283a6aa598501504178' ]); diff --git a/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php b/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php index 6ce77f63aa..db16adfb90 100644 --- a/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php +++ b/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php @@ -40,7 +40,7 @@ class DeleteTest extends ApiTest { $this->expectException(BadRequestException::class); (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } @@ -48,7 +48,7 @@ class DeleteTest extends ApiTest { $this->expectException(BadRequestException::class); (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'album' => 'album_name' ]); } @@ -58,7 +58,7 @@ class DeleteTest extends ApiTest $this->loadFixture(__DIR__ . '/../../../../../datasets/photo/photo.fixture.php', DI::dba()); $response = (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'album' => 'test_album'] ); diff --git a/tests/src/Module/Api/Friendica/Photoalbum/UpdateTest.php b/tests/src/Module/Api/Friendica/Photoalbum/UpdateTest.php index 5f25a62ac0..9a2b053dde 100644 --- a/tests/src/Module/Api/Friendica/Photoalbum/UpdateTest.php +++ b/tests/src/Module/Api/Friendica/Photoalbum/UpdateTest.php @@ -40,14 +40,14 @@ class UpdateTest extends ApiTest { $this->expectException(BadRequestException::class); (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } public function testTooFewArgs() { $this->expectException(BadRequestException::class); (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'album' => 'album_name' ]); } @@ -56,7 +56,7 @@ class UpdateTest extends ApiTest { $this->expectException(BadRequestException::class); (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'album' => 'album_name', 'album_new' => 'album_name' ]); @@ -72,7 +72,7 @@ class UpdateTest extends ApiTest $this->loadFixture(__DIR__ . '/../../../../../datasets/photo/photo.fixture.php', DI::dba()); $response = (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'album' => 'test_album', 'album_new' => 'test_album_2' ]); diff --git a/tests/src/Module/Api/GnuSocial/GnuSocial/ConfigTest.php b/tests/src/Module/Api/GnuSocial/GnuSocial/ConfigTest.php index 64d2a77826..52beb98019 100644 --- a/tests/src/Module/Api/GnuSocial/GnuSocial/ConfigTest.php +++ b/tests/src/Module/Api/GnuSocial/GnuSocial/ConfigTest.php @@ -37,7 +37,7 @@ class ConfigTest extends ApiTest DI::config()->set('system', 'ssl_policy', BaseURL::SSL_POLICY_FULL); $response = (new Config(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); $json = $this->toJson($response); self::assertEquals('localhost', $json->site->server); diff --git a/tests/src/Module/Api/GnuSocial/GnuSocial/VersionTest.php b/tests/src/Module/Api/GnuSocial/GnuSocial/VersionTest.php index 175aaabda3..b0ec8f832e 100644 --- a/tests/src/Module/Api/GnuSocial/GnuSocial/VersionTest.php +++ b/tests/src/Module/Api/GnuSocial/GnuSocial/VersionTest.php @@ -31,7 +31,7 @@ class VersionTest extends ApiTest public function test() { $response = (new Version(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run(); + ->run($this->httpExceptionMock); self::assertEquals([ 'Content-type' => ['application/json'], diff --git a/tests/src/Module/Api/GnuSocial/Help/TestTest.php b/tests/src/Module/Api/GnuSocial/Help/TestTest.php index be0e187a63..47f6492b1e 100644 --- a/tests/src/Module/Api/GnuSocial/Help/TestTest.php +++ b/tests/src/Module/Api/GnuSocial/Help/TestTest.php @@ -31,7 +31,7 @@ class TestTest extends ApiTest public function testJson() { $response = (new Test(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run(); + ->run($this->httpExceptionMock); $json = $this->toJson($response); @@ -45,7 +45,7 @@ class TestTest extends ApiTest public function testXml() { $response = (new Test(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'xml'])) - ->run(); + ->run($this->httpExceptionMock); self::assertEquals([ 'Content-type' => ['text/xml'], diff --git a/tests/src/Module/Api/Mastodon/Accounts/VerifyCredentialsTest.php b/tests/src/Module/Api/Mastodon/Accounts/VerifyCredentialsTest.php index 5d3e33d132..daea2ca53e 100644 --- a/tests/src/Module/Api/Mastodon/Accounts/VerifyCredentialsTest.php +++ b/tests/src/Module/Api/Mastodon/Accounts/VerifyCredentialsTest.php @@ -36,7 +36,7 @@ class VerifyCredentialsTest extends ApiTest public function testApiAccountVerifyCredentials() { $response = (new VerifyCredentials(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); $json = $this->toJson($response); diff --git a/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php b/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php index 8d928b3ee3..ef566de2dd 100644 --- a/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php +++ b/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php @@ -32,7 +32,7 @@ class RateLimitStatusTest extends ApiTest public function testWithJson() { $response = (new RateLimitStatus(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run(); + ->run($this->httpExceptionMock); $result = $this->toJson($response); @@ -48,7 +48,7 @@ class RateLimitStatusTest extends ApiTest public function testWithXml() { $response = (new RateLimitStatus(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'xml'])) - ->run(); + ->run($this->httpExceptionMock); self::assertEquals([ 'Content-type' => ['text/xml'], diff --git a/tests/src/Module/Api/Twitter/Account/UpdateProfileTest.php b/tests/src/Module/Api/Twitter/Account/UpdateProfileTest.php index d3c8f93024..abdde24861 100644 --- a/tests/src/Module/Api/Twitter/Account/UpdateProfileTest.php +++ b/tests/src/Module/Api/Twitter/Account/UpdateProfileTest.php @@ -36,7 +36,7 @@ class UpdateProfileTest extends ApiTest $this->useHttpMethod(Router::POST); $response = (new UpdateProfile(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run([ + ->run($this->httpExceptionMock, [ 'name' => 'new_name', 'description' => 'new_description' ]); diff --git a/tests/src/Module/Api/Twitter/Blocks/ListsTest.php b/tests/src/Module/Api/Twitter/Blocks/ListsTest.php index 1212a3f8e9..30d42414d4 100644 --- a/tests/src/Module/Api/Twitter/Blocks/ListsTest.php +++ b/tests/src/Module/Api/Twitter/Blocks/ListsTest.php @@ -34,7 +34,7 @@ class ListsTest extends ApiTest public function testApiStatusesFWithBlocks() { $response = (new Lists(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); $json = $this->toJson($response); diff --git a/tests/src/Module/Api/Twitter/DirectMessages/AllTest.php b/tests/src/Module/Api/Twitter/DirectMessages/AllTest.php index 666299cc69..6d74b87128 100644 --- a/tests/src/Module/Api/Twitter/DirectMessages/AllTest.php +++ b/tests/src/Module/Api/Twitter/DirectMessages/AllTest.php @@ -40,7 +40,7 @@ class AllTest extends ApiTest $directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $response = (new All($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run(); + ->run($this->httpExceptionMock); $json = $this->toJson($response); diff --git a/tests/src/Module/Api/Twitter/DirectMessages/ConversationTest.php b/tests/src/Module/Api/Twitter/DirectMessages/ConversationTest.php index e895845aad..834a5150e0 100644 --- a/tests/src/Module/Api/Twitter/DirectMessages/ConversationTest.php +++ b/tests/src/Module/Api/Twitter/DirectMessages/ConversationTest.php @@ -39,7 +39,7 @@ class ConversationTest extends ApiTest $directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $response = (new Conversation($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run([ + ->run($this->httpExceptionMock, [ 'friendica_verbose' => true, ]); diff --git a/tests/src/Module/Api/Twitter/DirectMessages/DestroyTest.php b/tests/src/Module/Api/Twitter/DirectMessages/DestroyTest.php index b9317190b6..2145905379 100644 --- a/tests/src/Module/Api/Twitter/DirectMessages/DestroyTest.php +++ b/tests/src/Module/Api/Twitter/DirectMessages/DestroyTest.php @@ -38,7 +38,7 @@ class DestroyTest extends ApiTest { $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); (new Destroy(DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run(); + ->run($this->httpExceptionMock); } /** @@ -49,7 +49,7 @@ class DestroyTest extends ApiTest public function testApiDirectMessagesDestroyWithVerbose() { $response = (new Destroy(DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run([ + ->run($this->httpExceptionMock, [ 'friendica_verbose' => true, ]); @@ -85,7 +85,7 @@ class DestroyTest extends ApiTest { $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); (new Destroy(DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run([ + ->run($this->httpExceptionMock, [ 'id' => 1 ]); } @@ -98,7 +98,7 @@ class DestroyTest extends ApiTest public function testApiDirectMessagesDestroyWithIdAndVerbose() { $response = (new Destroy(DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run([ + ->run($this->httpExceptionMock, [ 'id' => 1, 'friendica_parenturi' => 'parent_uri', 'friendica_verbose' => true, @@ -122,7 +122,7 @@ class DestroyTest extends ApiTest $id = $ids[0]['id']; $response = (new Destroy(DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run([ + ->run($this->httpExceptionMock, [ 'id' => $id, 'friendica_verbose' => true, ]); diff --git a/tests/src/Module/Api/Twitter/DirectMessages/InboxTest.php b/tests/src/Module/Api/Twitter/DirectMessages/InboxTest.php index cee1450cf7..f239755b3e 100644 --- a/tests/src/Module/Api/Twitter/DirectMessages/InboxTest.php +++ b/tests/src/Module/Api/Twitter/DirectMessages/InboxTest.php @@ -41,7 +41,7 @@ class InboxTest extends ApiTest $directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $response = (new Inbox($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run(); + ->run($this->httpExceptionMock); $json = $this->toJson($response); diff --git a/tests/src/Module/Api/Twitter/DirectMessages/NewDMTest.php b/tests/src/Module/Api/Twitter/DirectMessages/NewDMTest.php index cab3c22026..2b473fb48b 100644 --- a/tests/src/Module/Api/Twitter/DirectMessages/NewDMTest.php +++ b/tests/src/Module/Api/Twitter/DirectMessages/NewDMTest.php @@ -39,7 +39,7 @@ class NewDMTest extends ApiTest $directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $response = (new NewDM($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run(); + ->run($this->httpExceptionMock); self::assertEmpty((string)$response->getBody()); } @@ -71,7 +71,7 @@ class NewDMTest extends ApiTest $directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $response = (new NewDM($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run([ + ->run($this->httpExceptionMock, [ 'text' => 'message_text', 'user_id' => 43 ]); @@ -93,7 +93,7 @@ class NewDMTest extends ApiTest $directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $response = (new NewDM($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run([ + ->run($this->httpExceptionMock, [ 'text' => 'message_text', 'user_id' => 44 ]); @@ -117,7 +117,7 @@ class NewDMTest extends ApiTest $directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $response = (new NewDM($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run([ + ->run($this->httpExceptionMock, [ 'text' => 'message_text', 'user_id' => 44, 'title' => 'message_title', @@ -143,7 +143,7 @@ class NewDMTest extends ApiTest $directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $response = (new NewDM($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'rss'])) - ->run([ + ->run($this->httpExceptionMock, [ 'text' => 'message_text', 'user_id' => 44, 'title' => 'message_title', diff --git a/tests/src/Module/Api/Twitter/DirectMessages/SentTest.php b/tests/src/Module/Api/Twitter/DirectMessages/SentTest.php index 9c498af5f6..f63a24f806 100644 --- a/tests/src/Module/Api/Twitter/DirectMessages/SentTest.php +++ b/tests/src/Module/Api/Twitter/DirectMessages/SentTest.php @@ -39,7 +39,7 @@ class SentTest extends ApiTest $directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $response = (new Sent($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run([ + ->run($this->httpExceptionMock, [ 'friendica_verbose' => true, ]); @@ -59,7 +59,7 @@ class SentTest extends ApiTest $directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $response = (new Sent($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'rss'])) - ->run(); + ->run($this->httpExceptionMock); self::assertXml((string)$response->getBody(), 'direct-messages'); } diff --git a/tests/src/Module/Api/Twitter/Favorites/CreateTest.php b/tests/src/Module/Api/Twitter/Favorites/CreateTest.php index 61e235700c..fd0f86b6aa 100644 --- a/tests/src/Module/Api/Twitter/Favorites/CreateTest.php +++ b/tests/src/Module/Api/Twitter/Favorites/CreateTest.php @@ -47,7 +47,7 @@ class CreateTest extends ApiTest $this->expectException(BadRequestException::class); (new Create(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } /** @@ -58,7 +58,7 @@ class CreateTest extends ApiTest public function testApiFavoritesCreateDestroyWithCreateAction() { $response = (new Create(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'id' => 3 ]); @@ -75,7 +75,7 @@ class CreateTest extends ApiTest public function testApiFavoritesCreateDestroyWithCreateActionAndRss() { $response = (new Create(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => ICanCreateResponses::TYPE_RSS])) - ->run([ + ->run($this->httpExceptionMock, [ 'id' => 3 ]); diff --git a/tests/src/Module/Api/Twitter/Favorites/DestroyTest.php b/tests/src/Module/Api/Twitter/Favorites/DestroyTest.php index bb7b54ee42..e65c120142 100644 --- a/tests/src/Module/Api/Twitter/Favorites/DestroyTest.php +++ b/tests/src/Module/Api/Twitter/Favorites/DestroyTest.php @@ -46,7 +46,7 @@ class DestroyTest extends ApiTest $this->expectException(BadRequestException::class); (new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } /** @@ -57,7 +57,7 @@ class DestroyTest extends ApiTest public function testApiFavoritesCreateDestroyWithDestroyAction() { $response = (new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'id' => 3 ]); diff --git a/tests/src/Module/Api/Twitter/FavoritesTest.php b/tests/src/Module/Api/Twitter/FavoritesTest.php index 6da92e667d..c95aff6917 100644 --- a/tests/src/Module/Api/Twitter/FavoritesTest.php +++ b/tests/src/Module/Api/Twitter/FavoritesTest.php @@ -37,7 +37,7 @@ class FavoritesTest extends ApiTest public function testApiFavorites() { $response = (new Favorites(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'page' => -1, 'max_id' => 10, ]); @@ -58,7 +58,7 @@ class FavoritesTest extends ApiTest { $response = (new Favorites(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], [ 'extension' => ICanCreateResponses::TYPE_RSS - ]))->run(); + ]))->run($this->httpExceptionMock); self::assertEquals(ICanCreateResponses::TYPE_RSS, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); diff --git a/tests/src/Module/Api/Twitter/Followers/ListsTest.php b/tests/src/Module/Api/Twitter/Followers/ListsTest.php index 02e2745492..f48916ce80 100644 --- a/tests/src/Module/Api/Twitter/Followers/ListsTest.php +++ b/tests/src/Module/Api/Twitter/Followers/ListsTest.php @@ -34,7 +34,7 @@ class ListsTest extends ApiTest public function testApiStatusesFWithFollowers() { $response = (new Lists(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); $json = $this->toJson($response); diff --git a/tests/src/Module/Api/Twitter/Friends/ListsTest.php b/tests/src/Module/Api/Twitter/Friends/ListsTest.php index 07fdc891f3..53d8d8d866 100644 --- a/tests/src/Module/Api/Twitter/Friends/ListsTest.php +++ b/tests/src/Module/Api/Twitter/Friends/ListsTest.php @@ -36,7 +36,7 @@ class ListsTest extends ApiTest public function testApiStatusesFWithFriends() { $response = (new Lists(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); $json = $this->toJson($response); diff --git a/tests/src/Module/Api/Twitter/Friendships/IncomingTest.php b/tests/src/Module/Api/Twitter/Friendships/IncomingTest.php index 89a296b066..f93375b14e 100644 --- a/tests/src/Module/Api/Twitter/Friendships/IncomingTest.php +++ b/tests/src/Module/Api/Twitter/Friendships/IncomingTest.php @@ -36,7 +36,7 @@ class IncomingTest extends ApiTest public function testApiFriendshipsIncoming() { $response = (new Incoming(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); $json = $this->toJson($response); diff --git a/tests/src/Module/Api/Twitter/Lists/StatusesTest.php b/tests/src/Module/Api/Twitter/Lists/StatusesTest.php index 8bc8257c0c..f642181533 100644 --- a/tests/src/Module/Api/Twitter/Lists/StatusesTest.php +++ b/tests/src/Module/Api/Twitter/Lists/StatusesTest.php @@ -39,7 +39,7 @@ class StatusesTest extends ApiTest $this->expectException(BadRequestException::class); (new Statuses(DI::dba(), DI::twitterStatus(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } /** @@ -48,7 +48,7 @@ class StatusesTest extends ApiTest public function testApiListsStatusesWithListId() { $response = (new Statuses(DI::dba(), DI::twitterStatus(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'list_id' => 1, 'page' => -1, 'max_id' => 10 @@ -68,7 +68,7 @@ class StatusesTest extends ApiTest public function testApiListsStatusesWithListIdAndRss() { $response = (new Statuses(DI::dba(), DI::twitterStatus(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'rss'])) - ->run([ + ->run($this->httpExceptionMock, [ 'list_id' => 1 ]); diff --git a/tests/src/Module/Api/Twitter/Media/UploadTest.php b/tests/src/Module/Api/Twitter/Media/UploadTest.php index 7d64971917..f1930e2444 100644 --- a/tests/src/Module/Api/Twitter/Media/UploadTest.php +++ b/tests/src/Module/Api/Twitter/Media/UploadTest.php @@ -47,7 +47,7 @@ class UploadTest extends ApiTest $this->expectException(BadRequestException::class); (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } /** @@ -61,7 +61,7 @@ class UploadTest extends ApiTest AuthTestConfig::$authenticated = false; (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } /** @@ -80,7 +80,7 @@ class UploadTest extends ApiTest ]; (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } /** @@ -103,7 +103,7 @@ class UploadTest extends ApiTest ]; $response = (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); $media = $this->toJson($response); diff --git a/tests/src/Module/Api/Twitter/SavedSearchesTest.php b/tests/src/Module/Api/Twitter/SavedSearchesTest.php index 1d6e140bd1..ab03919c99 100644 --- a/tests/src/Module/Api/Twitter/SavedSearchesTest.php +++ b/tests/src/Module/Api/Twitter/SavedSearchesTest.php @@ -31,7 +31,7 @@ class SavedSearchesTest extends ApiTest public function test() { $response = (new SavedSearches(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) - ->run(); + ->run($this->httpExceptionMock); $result = $this->toJson($response); diff --git a/tests/src/Module/Api/Twitter/Statuses/DestroyTest.php b/tests/src/Module/Api/Twitter/Statuses/DestroyTest.php index 68ec195ce3..4a29525578 100644 --- a/tests/src/Module/Api/Twitter/Statuses/DestroyTest.php +++ b/tests/src/Module/Api/Twitter/Statuses/DestroyTest.php @@ -46,7 +46,7 @@ class DestroyTest extends ApiTest $this->expectException(BadRequestException::class); (new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } /** @@ -72,7 +72,7 @@ class DestroyTest extends ApiTest public function testApiStatusesDestroyWithId() { $response = (new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'id' => 1 ]); diff --git a/tests/src/Module/Api/Twitter/Statuses/MentionsTest.php b/tests/src/Module/Api/Twitter/Statuses/MentionsTest.php index 0bb694528d..59daef80c7 100644 --- a/tests/src/Module/Api/Twitter/Statuses/MentionsTest.php +++ b/tests/src/Module/Api/Twitter/Statuses/MentionsTest.php @@ -37,7 +37,7 @@ class MentionsTest extends ApiTest public function testApiStatusesMentions() { $response = (new Mentions(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'max_id' => 10 ]); @@ -55,7 +55,7 @@ class MentionsTest extends ApiTest public function testApiStatusesMentionsWithNegativePage() { $response = (new Mentions(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'page' => -2 ]); @@ -87,7 +87,7 @@ class MentionsTest extends ApiTest public function testApiStatusesMentionsWithRss() { $response = (new Mentions(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => ICanCreateResponses::TYPE_RSS])) - ->run([ + ->run($this->httpExceptionMock, [ 'page' => -2 ]); diff --git a/tests/src/Module/Api/Twitter/Statuses/NetworkPublicTimelineTest.php b/tests/src/Module/Api/Twitter/Statuses/NetworkPublicTimelineTest.php index a09cd44d1e..542cb28bac 100644 --- a/tests/src/Module/Api/Twitter/Statuses/NetworkPublicTimelineTest.php +++ b/tests/src/Module/Api/Twitter/Statuses/NetworkPublicTimelineTest.php @@ -37,7 +37,7 @@ class NetworkPublicTimelineTest extends ApiTest public function testApiStatusesNetworkpublicTimeline() { $response = (new NetworkPublicTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'max_id' => 10 ]); @@ -59,7 +59,7 @@ class NetworkPublicTimelineTest extends ApiTest public function testApiStatusesNetworkpublicTimelineWithNegativePage() { $response = (new NetworkPublicTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'page' => -2 ]); @@ -96,7 +96,7 @@ class NetworkPublicTimelineTest extends ApiTest { $response = (new NetworkPublicTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], [ 'extension' => ICanCreateResponses::TYPE_RSS - ]))->run([ + ]))->run($this->httpExceptionMock, [ 'page' => -2 ]); diff --git a/tests/src/Module/Api/Twitter/Statuses/RetweetTest.php b/tests/src/Module/Api/Twitter/Statuses/RetweetTest.php index f2c99baa8f..9f498b6920 100644 --- a/tests/src/Module/Api/Twitter/Statuses/RetweetTest.php +++ b/tests/src/Module/Api/Twitter/Statuses/RetweetTest.php @@ -46,7 +46,7 @@ class RetweetTest extends ApiTest $this->expectException(BadRequestException::class); (new Retweet(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } /** @@ -72,7 +72,7 @@ class RetweetTest extends ApiTest public function testApiStatusesRepeatWithId() { $response = (new Retweet(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'id' => 1 ]); @@ -89,7 +89,7 @@ class RetweetTest extends ApiTest public function testApiStatusesRepeatWithSharedId() { $response = (new Retweet(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'id' => 5 ]); diff --git a/tests/src/Module/Api/Twitter/Statuses/ShowTest.php b/tests/src/Module/Api/Twitter/Statuses/ShowTest.php index 656aa5e91a..df284df2ae 100644 --- a/tests/src/Module/Api/Twitter/Statuses/ShowTest.php +++ b/tests/src/Module/Api/Twitter/Statuses/ShowTest.php @@ -40,7 +40,7 @@ class ShowTest extends ApiTest (new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } /** @@ -51,7 +51,7 @@ class ShowTest extends ApiTest public function testApiStatusesShowWithId() { $response = (new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'id' => 1 ]); @@ -69,7 +69,7 @@ class ShowTest extends ApiTest public function testApiStatusesShowWithConversation() { $response = (new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'id' => 1, 'conversation' => 1 ]); diff --git a/tests/src/Module/Api/Twitter/Statuses/UpdateTest.php b/tests/src/Module/Api/Twitter/Statuses/UpdateTest.php index 92ca0702e3..4754a34d7e 100644 --- a/tests/src/Module/Api/Twitter/Statuses/UpdateTest.php +++ b/tests/src/Module/Api/Twitter/Statuses/UpdateTest.php @@ -55,7 +55,7 @@ class UpdateTest extends ApiTest ]; $response = (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'status' => 'Status content #friendica', 'in_reply_to_status_id' => 0, 'lat' => 48, @@ -77,7 +77,7 @@ class UpdateTest extends ApiTest public function testApiStatusesUpdateWithHtml() { $response = (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'htmlstatus' => 'Status content', ]); diff --git a/tests/src/Module/Api/Twitter/Statuses/UserTimelineTest.php b/tests/src/Module/Api/Twitter/Statuses/UserTimelineTest.php index 078a88f96f..240ebc8e8e 100644 --- a/tests/src/Module/Api/Twitter/Statuses/UserTimelineTest.php +++ b/tests/src/Module/Api/Twitter/Statuses/UserTimelineTest.php @@ -37,7 +37,7 @@ class UserTimelineTest extends ApiTest public function testApiStatusesUserTimeline() { $response = (new UserTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'user_id' => 42, 'max_id' => 10, 'exclude_replies' => true, @@ -62,7 +62,7 @@ class UserTimelineTest extends ApiTest public function testApiStatusesUserTimelineWithNegativePage() { $response = (new UserTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'user_id' => 42, 'page' => -2, ]); @@ -86,7 +86,7 @@ class UserTimelineTest extends ApiTest { $response = (new UserTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], [ 'extension' => ICanCreateResponses::TYPE_RSS - ]))->run(); + ]))->run($this->httpExceptionMock); self::assertEquals(ICanCreateResponses::TYPE_RSS, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); diff --git a/tests/src/Module/Api/Twitter/Users/LookupTest.php b/tests/src/Module/Api/Twitter/Users/LookupTest.php index 9b5134fd8a..677e53df55 100644 --- a/tests/src/Module/Api/Twitter/Users/LookupTest.php +++ b/tests/src/Module/Api/Twitter/Users/LookupTest.php @@ -39,7 +39,7 @@ class LookupTest extends ApiTest $this->expectException(NotFoundException::class); (new Lookup(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } /** @@ -50,7 +50,7 @@ class LookupTest extends ApiTest public function testApiUsersLookupWithUserId() { $respone = (new Lookup(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'user_id' => static::OTHER_USER['id'] ]); diff --git a/tests/src/Module/Api/Twitter/Users/SearchTest.php b/tests/src/Module/Api/Twitter/Users/SearchTest.php index 903bbe9fda..0c816b5ab9 100644 --- a/tests/src/Module/Api/Twitter/Users/SearchTest.php +++ b/tests/src/Module/Api/Twitter/Users/SearchTest.php @@ -38,7 +38,7 @@ class SearchTest extends ApiTest public function testApiUsersSearch() { $respone = (new Search(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run([ + ->run($this->httpExceptionMock, [ 'q' => static::OTHER_USER['name'] ]); @@ -56,7 +56,7 @@ class SearchTest extends ApiTest { $respone = (new Search(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], [ 'extension' => ICanCreateResponses::TYPE_XML - ]))->run([ + ]))->run($this->httpExceptionMock, [ 'q' => static::OTHER_USER['name'] ]); @@ -73,6 +73,6 @@ class SearchTest extends ApiTest $this->expectException(BadRequestException::class); (new Search(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); } } diff --git a/tests/src/Module/Api/Twitter/Users/ShowTest.php b/tests/src/Module/Api/Twitter/Users/ShowTest.php index 703ad4f6cb..3cec455352 100644 --- a/tests/src/Module/Api/Twitter/Users/ShowTest.php +++ b/tests/src/Module/Api/Twitter/Users/ShowTest.php @@ -37,7 +37,7 @@ class ShowTest extends ApiTest public function testApiUsersShow() { $response = (new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) - ->run(); + ->run($this->httpExceptionMock); $json = $this->toJson($response); @@ -58,7 +58,7 @@ class ShowTest extends ApiTest { $response = (new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], [ 'extension' => ICanCreateResponses::TYPE_XML - ]))->run(); + ]))->run($this->httpExceptionMock); self::assertEquals(ICanCreateResponses::TYPE_XML, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); diff --git a/tests/src/Module/NodeInfoTest.php b/tests/src/Module/NodeInfoTest.php index a7766d2472..101ee021c7 100644 --- a/tests/src/Module/NodeInfoTest.php +++ b/tests/src/Module/NodeInfoTest.php @@ -27,14 +27,26 @@ use Friendica\DI; use Friendica\Module\NodeInfo110; use Friendica\Module\NodeInfo120; use Friendica\Module\NodeInfo210; +use Friendica\Module\Special\HTTPException; use Friendica\Test\FixtureTest; +use Mockery\MockInterface; class NodeInfoTest extends FixtureTest { + /** @var MockInterface|HTTPException */ + protected $httpExceptionMock; + + protected function setUp(): void + { + parent::setUp(); + + $this->httpExceptionMock = \Mockery::mock(HTTPException::class); + } + public function testNodeInfo110() { $response = (new NodeInfo110(DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), DI::config(), [])) - ->run(); + ->run($this->httpExceptionMock); self::assertJson($response->getBody()); self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); @@ -55,7 +67,7 @@ class NodeInfoTest extends FixtureTest public function testNodeInfo120() { $response = (new NodeInfo120(DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), DI::config(), [])) - ->run(); + ->run($this->httpExceptionMock); self::assertJson($response->getBody()); self::assertEquals(['Content-type' => ['application/json; charset=utf-8'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); @@ -75,7 +87,7 @@ class NodeInfoTest extends FixtureTest public function testNodeInfo210() { $response = (new NodeInfo210(DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), DI::config(), [])) - ->run(); + ->run($this->httpExceptionMock); self::assertJson($response->getBody()); self::assertEquals(['Content-type' => ['application/json; charset=utf-8'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); diff --git a/tests/src/Module/Special/OptionsTest.php b/tests/src/Module/Special/OptionsTest.php index 62ad1b3de2..cd16720505 100644 --- a/tests/src/Module/Special/OptionsTest.php +++ b/tests/src/Module/Special/OptionsTest.php @@ -24,16 +24,28 @@ namespace Friendica\Test\src\Module\Special; use Friendica\App\Router; use Friendica\Capabilities\ICanCreateResponses; use Friendica\DI; +use Friendica\Module\Special\HTTPException; use Friendica\Module\Special\Options; use Friendica\Test\FixtureTest; +use Mockery\MockInterface; class OptionsTest extends FixtureTest { + /** @var MockInterface|HTTPException */ + protected $httpExceptionMock; + + protected function setUp(): void + { + parent::setUp(); + + $this->httpExceptionMock = \Mockery::mock(HTTPException::class); + } + public function testOptionsAll() { $this->useHttpMethod(Router::OPTIONS); - $response = (new Options(DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run(); + $response = (new Options(DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run($this->httpExceptionMock); self::assertEmpty((string)$response->getBody()); self::assertEquals(204, $response->getStatusCode()); @@ -51,7 +63,7 @@ class OptionsTest extends FixtureTest $response = (new Options(DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], [ 'AllowedMethods' => [Router::GET, Router::POST], - ]))->run(); + ]))->run($this->httpExceptionMock); self::assertEmpty((string)$response->getBody()); self::assertEquals(204, $response->getStatusCode()); diff --git a/view/templates/exception.tpl b/view/templates/exception.tpl index ad1a15f878..3499a5cb15 100644 --- a/view/templates/exception.tpl +++ b/view/templates/exception.tpl @@ -7,6 +7,9 @@ {{$stack_trace}} {{$trace}} {{/if}} +{{if $request_id}} +
Request: {{$request_id}}
+{{/if}} {{if $back}}

{{/if}} diff --git a/view/templates/http_status.tpl b/view/templates/http_status.tpl index a9c094c4b2..874bf96691 100644 --- a/view/templates/http_status.tpl +++ b/view/templates/http_status.tpl @@ -8,5 +8,8 @@ {{if $trace}}
{{$trace nofilter}}
{{/if}} + {{if $request_id}} +
Request: {{$request_id}}
+ {{/if}}