Merge pull request #12527 from nupplaphil/feat/request_id

Introduce Request::getRequestId()
This commit is contained in:
Hypolite Petovan 2022-12-26 16:07:35 -05:00 committed by GitHub
commit 5c332af844
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
65 changed files with 420 additions and 202 deletions

View file

@ -45,6 +45,7 @@ $a->runFrontend(
$dice->create(\Friendica\Core\PConfig\Capability\IManagePersonalConfigValues::class), $dice->create(\Friendica\Core\PConfig\Capability\IManagePersonalConfigValues::class),
$dice->create(\Friendica\Security\Authentication::class), $dice->create(\Friendica\Security\Authentication::class),
$dice->create(\Friendica\App\Page::class), $dice->create(\Friendica\App\Page::class),
$dice->create(Friendica\Module\Special\HTTPException::class),
new \Friendica\Util\HTTPInputData($_SERVER), new \Friendica\Util\HTTPInputData($_SERVER),
$start_time $start_time
); );

View file

@ -15,6 +15,25 @@
# ----- # -----
... ...
##
# by https://syshero.org/2018-04-13-nginx-unique-request-identifier/
# if X-Request-ID is set, NGINX will forward the same value to the next upstream
# if the header is not set, NGINX will generate a random request identifier and add it to the request.
#
# To guarantee backward compatibility, map to format the $request_id variable to a format that matches any old setups.
##
map $request_id $formatted_id {
"~*(?<p1>[0-9a-f]{8})(?<p2>[0-9a-f]{4})(?<p3>[0-9a-f]{4})(?<p4>[0-9a-f]{4})(?<p5>.*)$" "${p1}-${p2}-${p3}-${p4}-${p5}";
}
map $http_x_request_id $uuid {
default "${request_id}";
~* "${http_x_request_id}";
}
server { server {
... ...
@ -30,6 +49,7 @@ server {
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Forwarded "for=$proxy_add_x_forwarded_for; proto=$scheme"; proxy_set_header Forwarded "for=$proxy_add_x_forwarded_for; proto=$scheme";
proxy_set_header X-Request-ID $uuid;
} }
... ...

View file

@ -20,6 +20,24 @@
# http://wiki.nginx.org/Configuration # http://wiki.nginx.org/Configuration
## ##
##
# by https://syshero.org/2018-04-13-nginx-unique-request-identifier/
# if X-Request-ID is set, NGINX will forward the same value to the next upstream
# if the header is not set, NGINX will generate a random request identifier and add it to the request.
#
# To guarantee backward compatibility, map to format the $request_id variable to a format that matches any old setups.
##
map $request_id $formatted_id {
"~*(?<p1>[0-9a-f]{8})(?<p2>[0-9a-f]{4})(?<p3>[0-9a-f]{4})(?<p4>[0-9a-f]{4})(?<p5>.*)$" "${p1}-${p2}-${p3}-${p4}-${p5}";
}
map $http_x_request_id $uuid {
default "${request_id}";
~* "${http_x_request_id}";
}
## ##
# This configuration assumes your domain is example.net # This configuration assumes your domain is example.net
# You have a separate subdomain friendica.example.net # You have a separate subdomain friendica.example.net
@ -80,6 +98,9 @@ server {
client_max_body_size 20m; client_max_body_size 20m;
client_body_buffer_size 128k; client_body_buffer_size 128k;
# add the request id header to show it in the HTTP header output
add_header X-Request-ID $uuid;
# rewrite to front controller as default rule # rewrite to front controller as default rule
location / { location / {
try_files $uri /index.php?pagename=$uri&$args; try_files $uri /index.php?pagename=$uri&$args;
@ -125,6 +146,7 @@ server {
include fastcgi_params; include fastcgi_params;
fastcgi_index index.php; fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTP_X_REQUEST_ID $uuid;
fastcgi_buffers 16 16k; fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k; fastcgi_buffer_size 32k;

View file

@ -29,7 +29,6 @@ use Friendica\Core\Config\Factory\Config;
use Friendica\Core\Session\Capability\IHandleUserSessions; use Friendica\Core\Session\Capability\IHandleUserSessions;
use Friendica\Database\Definition\DbaDefinition; use Friendica\Database\Definition\DbaDefinition;
use Friendica\Database\Definition\ViewDefinition; use Friendica\Database\Definition\ViewDefinition;
use Friendica\Model\User;
use Friendica\Module\Maintenance; use Friendica\Module\Maintenance;
use Friendica\Security\Authentication; use Friendica\Security\Authentication;
use Friendica\Core\Config\ValueObject\Cache; use Friendica\Core\Config\ValueObject\Cache;
@ -73,8 +72,6 @@ class App
'videoheight' => 350, 'videoheight' => 350,
]; ];
private $user_id = 0;
private $nickname = '';
private $timezone = ''; private $timezone = '';
private $profile_owner = 0; private $profile_owner = 0;
private $contact_id = 0; private $contact_id = 0;
@ -136,64 +133,39 @@ class App
private $session; private $session;
/** /**
* Set the user ID * @deprecated 2022.03
* * @see IHandleUserSessions::isAuthenticated()
* @param int $user_id
* @return void
*/ */
public function setLoggedInUserId(int $user_id)
{
$this->user_id = $user_id;
}
/**
* Set the nickname
*
* @param int $user_id
* @return void
*/
public function setLoggedInUserNickname(string $nickname)
{
$this->nickname = $nickname;
}
public function isLoggedIn(): bool public function isLoggedIn(): bool
{ {
return $this->session->getLocalUserId() && $this->user_id && ($this->user_id == $this->session->getLocalUserId()); return $this->session->isAuthenticated();
} }
/** /**
* Check if current user has admin role. * @deprecated 2022.03
* * @see IHandleUserSessions::isSiteAdmin()
* @return bool true if user is an admin
* @throws Exception
*/ */
public function isSiteAdmin(): bool public function isSiteAdmin(): bool
{ {
return return $this->session->isSiteAdmin();
$this->session->getLocalUserId()
&& $this->database->exists('user', [
'uid' => $this->getLoggedInUserId(),
'email' => User::getAdminEmailList()
]);
} }
/** /**
* Fetch the user id * @deprecated 2022.03
* @return int User id * @see IHandleUserSessions::getLocalUserId()
*/ */
public function getLoggedInUserId(): int public function getLoggedInUserId(): int
{ {
return $this->user_id; return $this->session->getLocalUserId();
} }
/** /**
* Fetch the user nick name * @deprecated 2022.03
* @return string User's nickname * @see IHandleUserSessions::getLocalUserNickname()
*/ */
public function getLoggedInUserNickname(): string public function getLoggedInUserNickname(): string
{ {
return $this->nickname; return $this->session->getLocalUserNickname();
} }
/** /**
@ -601,13 +573,14 @@ class App
* @param IManagePersonalConfigValues $pconfig * @param IManagePersonalConfigValues $pconfig
* @param Authentication $auth The Authentication backend of the node * @param Authentication $auth The Authentication backend of the node
* @param App\Page $page The Friendica page printing container * @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 HTTPInputData $httpInput A library for processing PHP input streams
* @param float $start_time The start time of the overall script execution * @param float $start_time The start time of the overall script execution
* *
* @throws HTTPException\InternalServerErrorException * @throws HTTPException\InternalServerErrorException
* @throws \ImagickException * @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($start_time, 'start');
$this->profiler->set(microtime(true), 'classinit'); $this->profiler->set(microtime(true), 'classinit');
@ -741,9 +714,9 @@ class App
$httpinput = $httpInput->process(); $httpinput = $httpInput->process();
$input = array_merge($httpinput['variables'], $httpinput['files'], $request ?? $_REQUEST); $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); $timestamp = microtime(true);
$response = $module->run($input); $response = $module->run($httpException, $input);
$this->profiler->set(microtime(true) - $timestamp, 'content'); $this->profiler->set(microtime(true) - $timestamp, 'content');
if ($response->getHeaderLine(ICanCreateResponses::X_HEADER) === ICanCreateResponses::TYPE_HTML) { 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()); $page->run($this, $this->baseURL, $this->args, $this->mode, $response, $this->l10n, $this->profiler, $this->config, $pconfig, $this->session->getLocalUserId());
@ -751,7 +724,7 @@ class App
$page->exit($response); $page->exit($response);
} }
} catch (HTTPException $e) { } catch (HTTPException $e) {
(new ModuleHTTPException())->rawContent($e); $httpException->rawContent($e);
} }
$page->logRuntime($this->config, 'runFrontend'); $page->logRuntime($this->config, 'runFrontend');
} }

View file

@ -22,6 +22,7 @@
namespace Friendica\App; namespace Friendica\App;
use Friendica\Core\Config\Capability\IManageConfigValues; use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core\System;
/** /**
* Container for the whole request * Container for the whole request
@ -38,9 +39,17 @@ class Request
* @var string * @var string
*/ */
const DEFAULT_FORWARD_FOR_HEADER = 'HTTP_X_FORWARDED_FOR'; const DEFAULT_FORWARD_FOR_HEADER = 'HTTP_X_FORWARDED_FOR';
/**
* The default Request-ID header to retrieve the current transaction ID from the HTTP header (if set)
*
* @var string
*/
const DEFAULT_REQUEST_ID_HEADER = 'HTTP_X_REQUEST_ID';
/** @var string The remote IP address of the current request */ /** @var string The remote IP address of the current request */
protected $remoteAddress; protected $remoteAddress;
/** @var string The request-id of the current request */
protected $requestId;
/** /**
* @return string The remote IP address of the current request * @return string The remote IP address of the current request
@ -52,9 +61,20 @@ class Request
return $this->remoteAddress; return $this->remoteAddress;
} }
/**
* @return string The request ID of the current request
*
* Do always use this instead of $_SERVER['X_REQUEST_ID']
*/
public function getRequestId(): string
{
return $this->requestId;
}
public function __construct(IManageConfigValues $config, array $server = []) public function __construct(IManageConfigValues $config, array $server = [])
{ {
$this->remoteAddress = $this->determineRemoteAddress($config, $server); $this->remoteAddress = $this->determineRemoteAddress($config, $server);
$this->requestId = $server[static::DEFAULT_REQUEST_ID_HEADER] ?? System::createGUID(8);
} }
/** /**

View file

@ -181,7 +181,7 @@ abstract class BaseModule implements ICanHandleRequests
/** /**
* {@inheritDoc} * {@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 // @see https://github.com/tootsuite/mastodon/blob/c3aef491d66aec743a3a53e934a494f653745b61/config/initializers/cors.rb
if (substr($this->args->getQueryString(), 0, 12) == '.well-known/') { 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($arr['content']);
$this->response->addContent($this->content($request)); $this->response->addContent($this->content($request));
} catch (HTTPException $e) { } catch (HTTPException $e) {
$this->response->addContent((new ModuleHTTPException())->content($e)); $this->response->addContent($httpException->content($e));
} finally { } finally {
$this->profiler->set(microtime(true) - $timestamp, 'content'); $this->profiler->set(microtime(true) - $timestamp, 'content');
} }

View file

@ -21,6 +21,7 @@
namespace Friendica\Capabilities; namespace Friendica\Capabilities;
use Friendica\Module\Special\HTTPException as ModuleHTTPException;
use Friendica\Network\HTTPException; use Friendica\Network\HTTPException;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
@ -30,11 +31,12 @@ use Psr\Http\Message\ResponseInterface;
interface ICanHandleRequests 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 * @return ResponseInterface responding to the request handling
* *
* @throws HTTPException\InternalServerErrorException * @throws HTTPException\InternalServerErrorException
*/ */
public function run(array $request = []): ResponseInterface; public function run(ModuleHTTPException $httpException, array $request = []): ResponseInterface;
} }

View file

@ -0,0 +1,52 @@
<?php
/**
* @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Core\Logger\Capabilities;
use Friendica\Core\Logger\Factory\Logger;
use Friendica\Util\Profiler;
interface IHaveCallIntrospections
{
/**
* A list of classes, which shouldn't get logged
*
* @var string[]
*/
public const IGNORE_CLASS_LIST = [
Logger::class,
Profiler::class,
'Friendica\\Core\\Logger\\Type',
];
/**
* Adds new classes to get skipped
*
* @param array $classNames
*/
public function addClasses(array $classNames): void;
/**
* Returns the introspection record of the current call
*
* @return array
*/
public function getRecord(): array;
}

View file

@ -23,11 +23,11 @@ namespace Friendica\Core\Logger\Factory;
use Friendica\Core\Config\Capability\IManageConfigValues; use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core; use Friendica\Core;
use Friendica\Core\Logger\Capabilities\IHaveCallIntrospections;
use Friendica\Core\Logger\Exception\LogLevelException; use Friendica\Core\Logger\Exception\LogLevelException;
use Friendica\Database\Database; use Friendica\Database\Database;
use Friendica\Network\HTTPException\InternalServerErrorException; use Friendica\Network\HTTPException\InternalServerErrorException;
use Friendica\Util\FileSystem; use Friendica\Util\FileSystem;
use Friendica\Core\Logger\Util\Introspection;
use Friendica\Core\Logger\Type\ProfilerLogger; use Friendica\Core\Logger\Type\ProfilerLogger;
use Friendica\Core\Logger\Type\StreamLogger; use Friendica\Core\Logger\Type\StreamLogger;
use Friendica\Core\Logger\Type\SyslogLogger; use Friendica\Core\Logger\Type\SyslogLogger;
@ -43,17 +43,6 @@ class Logger
{ {
const DEV_CHANNEL = 'dev'; const DEV_CHANNEL = 'dev';
/**
* A list of classes, which shouldn't get logged
*
* @var string[]
*/
private static $ignoreClassList = [
Core\Logger::class,
Profiler::class,
'Friendica\\Core\\Logger\\Type',
];
/** @var string The log-channel (app, worker, ...) */ /** @var string The log-channel (app, worker, ...) */
private $channel; private $channel;
@ -79,7 +68,7 @@ class Logger
* *
* @return LoggerInterface The PSR-3 compliant logger instance * @return LoggerInterface The PSR-3 compliant logger instance
*/ */
public function create(Database $database, IManageConfigValues $config, Profiler $profiler, FileSystem $fileSystem, ?string $minLevel = null): LoggerInterface public function create(Database $database, IManageConfigValues $config, Profiler $profiler, FileSystem $fileSystem, IHaveCallIntrospections $introspection, ?string $minLevel = null): LoggerInterface
{ {
if (empty($config->get('system', 'debugging', false))) { if (empty($config->get('system', 'debugging', false))) {
$logger = new NullLogger(); $logger = new NullLogger();
@ -87,7 +76,6 @@ class Logger
return $logger; return $logger;
} }
$introspection = new Introspection(self::$ignoreClassList);
$minLevel = $minLevel ?? $config->get('system', 'loglevel'); $minLevel = $minLevel ?? $config->get('system', 'loglevel');
$loglevel = self::mapLegacyConfigDebugLevel((string)$minLevel); $loglevel = self::mapLegacyConfigDebugLevel((string)$minLevel);
@ -99,7 +87,7 @@ class Logger
$logger = new SyslogLogger($this->channel, $introspection, $loglevel, $config->get('system', 'syslog_flags', SyslogLogger::DEFAULT_FLAGS), $config->get('system', 'syslog_facility', SyslogLogger::DEFAULT_FACILITY)); $logger = new SyslogLogger($this->channel, $introspection, $loglevel, $config->get('system', 'syslog_flags', SyslogLogger::DEFAULT_FLAGS), $config->get('system', 'syslog_facility', SyslogLogger::DEFAULT_FACILITY));
} catch (LogLevelException $exception) { } catch (LogLevelException $exception) {
// If there's a wrong config value for loglevel, try again with standard // If there's a wrong config value for loglevel, try again with standard
$logger = $this->create($database, $config, $profiler, $fileSystem, LogLevel::NOTICE); $logger = $this->create($database, $config, $profiler, $fileSystem, $introspection, LogLevel::NOTICE);
$logger->warning('Invalid loglevel set in config.', ['loglevel' => $loglevel]); $logger->warning('Invalid loglevel set in config.', ['loglevel' => $loglevel]);
} catch (\Throwable $e) { } catch (\Throwable $e) {
// No logger ... // No logger ...
@ -134,7 +122,7 @@ class Logger
$logger = new StreamLogger($this->channel, $stream, $introspection, $fileSystem, $loglevel); $logger = new StreamLogger($this->channel, $stream, $introspection, $fileSystem, $loglevel);
} catch (LogLevelException $exception) { } catch (LogLevelException $exception) {
// If there's a wrong config value for loglevel, try again with standard // If there's a wrong config value for loglevel, try again with standard
$logger = $this->create($database, $config, $profiler, $fileSystem, LogLevel::NOTICE); $logger = $this->create($database, $config, $profiler, $fileSystem, $introspection, LogLevel::NOTICE);
$logger->warning('Invalid loglevel set in config.', ['loglevel' => $loglevel]); $logger->warning('Invalid loglevel set in config.', ['loglevel' => $loglevel]);
} catch (\Throwable $t) { } catch (\Throwable $t) {
// No logger ... // No logger ...
@ -145,7 +133,7 @@ class Logger
$logger = new SyslogLogger($this->channel, $introspection, $loglevel); $logger = new SyslogLogger($this->channel, $introspection, $loglevel);
} catch (LogLevelException $exception) { } catch (LogLevelException $exception) {
// If there's a wrong config value for loglevel, try again with standard // If there's a wrong config value for loglevel, try again with standard
$logger = $this->create($database, $config, $profiler, $fileSystem, LogLevel::NOTICE); $logger = $this->create($database, $config, $profiler, $fileSystem, $introspection, LogLevel::NOTICE);
$logger->warning('Invalid loglevel set in config.', ['loglevel' => $loglevel]); $logger->warning('Invalid loglevel set in config.', ['loglevel' => $loglevel]);
} catch (\Throwable $e) { } catch (\Throwable $e) {
// No logger ... // No logger ...
@ -182,7 +170,7 @@ class Logger
* @return LoggerInterface The PSR-3 compliant logger instance * @return LoggerInterface The PSR-3 compliant logger instance
* @throws \Exception * @throws \Exception
*/ */
public static function createDev(IManageConfigValues $config, Profiler $profiler, FileSystem $fileSystem) public static function createDev(IManageConfigValues $config, Profiler $profiler, FileSystem $fileSystem, IHaveCallIntrospections $introspection)
{ {
$debugging = $config->get('system', 'debugging'); $debugging = $config->get('system', 'debugging');
$stream = $config->get('system', 'dlogfile'); $stream = $config->get('system', 'dlogfile');
@ -193,8 +181,6 @@ class Logger
return new NullLogger(); return new NullLogger();
} }
$introspection = new Introspection(self::$ignoreClassList);
$name = $config->get('system', 'logger_config', 'stream'); $name = $config->get('system', 'logger_config', 'stream');
switch ($name) { switch ($name) {

View file

@ -21,11 +21,17 @@
namespace Friendica\Core\Logger\Util; namespace Friendica\Core\Logger\Util;
use Friendica\App\Request;
use Friendica\Core\Logger\Capabilities\IHaveCallIntrospections;
/** /**
* Get Introspection information about the current call * Get Introspection information about the current call
*/ */
class Introspection class Introspection implements IHaveCallIntrospections
{ {
/** @var string */
private $requestId;
/** @var int */ /** @var int */
private $skipStackFramesCount; private $skipStackFramesCount;
@ -41,8 +47,9 @@ class Introspection
* @param string[] $skipClassesPartials An array of classes to skip during logging * @param string[] $skipClassesPartials An array of classes to skip during logging
* @param int $skipStackFramesCount If the logger should use information from other hierarchy levels of the call * @param int $skipStackFramesCount If the logger should use information from other hierarchy levels of the call
*/ */
public function __construct(array $skipClassesPartials = [], int $skipStackFramesCount = 0) public function __construct(Request $request, array $skipClassesPartials = [], int $skipStackFramesCount = 0)
{ {
$this->requestId = $request->getRequestId();
$this->skipClassesPartials = $skipClassesPartials; $this->skipClassesPartials = $skipClassesPartials;
$this->skipStackFramesCount = $skipStackFramesCount; $this->skipStackFramesCount = $skipStackFramesCount;
} }
@ -52,7 +59,7 @@ class Introspection
* *
* @param array $classNames * @param array $classNames
*/ */
public function addClasses(array $classNames) public function addClasses(array $classNames): void
{ {
$this->skipClassesPartials = array_merge($this->skipClassesPartials, $classNames); $this->skipClassesPartials = array_merge($this->skipClassesPartials, $classNames);
} }
@ -75,9 +82,10 @@ class Introspection
$i += $this->skipStackFramesCount; $i += $this->skipStackFramesCount;
return [ return [
'file' => isset($trace[$i - 1]['file']) ? basename($trace[$i - 1]['file']) : null, 'file' => isset($trace[$i - 1]['file']) ? basename($trace[$i - 1]['file']) : null,
'line' => $trace[$i - 1]['line'] ?? null, 'line' => $trace[$i - 1]['line'] ?? null,
'function' => $trace[$i]['function'] ?? null, 'function' => $trace[$i]['function'] ?? null,
'request-id' => $this->requestId,
]; ];
} }

View file

@ -33,6 +33,13 @@ interface IHandleUserSessions extends IHandleSessions
*/ */
public function getLocalUserId(); public function getLocalUserId();
/**
* Returns the user nickname of locally logged-in user.
*
* @return string|false User's nickname or false
*/
public function getLocalUserNickname();
/** /**
* Returns the public contact id of logged-in user or false. * Returns the public contact id of logged-in user or false.
* *
@ -79,6 +86,13 @@ interface IHandleUserSessions extends IHandleSessions
*/ */
public function isAuthenticated(): bool; public function isAuthenticated(): bool;
/**
* Check if current user has admin role.
*
* @return bool true if user is an admin
*/
public function isSiteAdmin(): bool;
/** /**
* Returns User ID of the managed user in case it's a different identity * Returns User ID of the managed user in case it's a different identity
* *

View file

@ -24,6 +24,7 @@ namespace Friendica\Core\Session\Model;
use Friendica\Core\Session\Capability\IHandleSessions; use Friendica\Core\Session\Capability\IHandleSessions;
use Friendica\Core\Session\Capability\IHandleUserSessions; use Friendica\Core\Session\Capability\IHandleUserSessions;
use Friendica\Model\Contact; use Friendica\Model\Contact;
use Friendica\Model\User;
/** /**
* This class handles user sessions, which is directly extended from regular session * This class handles user sessions, which is directly extended from regular session
@ -50,6 +51,16 @@ class UserSession implements IHandleUserSessions
return false; return false;
} }
/** {@inheritDoc} */
public function getLocalUserNickname()
{
if ($this->isAuthenticated()) {
return $this->session->get('nickname');
}
return false;
}
/** {@inheritDoc} */ /** {@inheritDoc} */
public function getPublicContactId() public function getPublicContactId()
{ {
@ -122,6 +133,12 @@ class UserSession implements IHandleUserSessions
return $this->session->get('authenticated', false); return $this->session->get('authenticated', false);
} }
/** {@inheritDoc} */
public function isSiteAdmin(): bool
{
return User::isSiteAdmin($this->getLocalUserId());
}
/** {@inheritDoc} */ /** {@inheritDoc} */
public function setVisitorsContacts() public function setVisitorsContacts()
{ {

View file

@ -830,6 +830,22 @@ class User
return DBA::update('user', $fields, ['uid' => $uid]); return DBA::update('user', $fields, ['uid' => $uid]);
} }
/**
* Returns if the given uid is valid and in the admin list
*
* @param int $uid
*
* @return bool
* @throws Exception
*/
public static function isSiteAdmin(int $uid): bool
{
return DBA::exists('user', [
'uid' => $uid,
'email' => self::getAdminEmailList()
]);
}
/** /**
* Checks if a nickname is in the list of the forbidden nicknames * Checks if a nickname is in the list of the forbidden nicknames
* *

View file

@ -25,6 +25,7 @@ use Friendica\Core\System;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\DI; use Friendica\DI;
use Friendica\Module\BaseApi; use Friendica\Module\BaseApi;
use Friendica\Module\Special\HTTPException;
use Friendica\Util\Network; use Friendica\Util\Network;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
@ -33,9 +34,9 @@ use Psr\Http\Message\ResponseInterface;
*/ */
class Apps extends BaseApi 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);
} }
/** /**

View file

@ -33,6 +33,7 @@ use Friendica\Model\Item;
use Friendica\Model\Post; use Friendica\Model\Post;
use Friendica\Model\User; use Friendica\Model\User;
use Friendica\Module\Api\ApiResponse; use Friendica\Module\Api\ApiResponse;
use Friendica\Module\Special\HTTPException as ModuleHTTPException;
use Friendica\Network\HTTPException; use Friendica\Network\HTTPException;
use Friendica\Security\BasicAuth; use Friendica\Security\BasicAuth;
use Friendica\Security\OAuth; use Friendica\Security\OAuth;
@ -80,7 +81,7 @@ class BaseApi extends BaseModule
* *
* @throws HTTPException\ForbiddenException * @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) { if ($scopecheck) {
switch ($this->args->getMethod()) { switch ($this->args->getMethod()) {
@ -97,7 +98,7 @@ class BaseApi extends BaseModule
} }
} }
return parent::run($request); return parent::run($httpException, $request);
} }
/** /**

View file

@ -22,13 +22,12 @@
namespace Friendica\Module\HTTPException; namespace Friendica\Module\HTTPException;
use Friendica\BaseModule; use Friendica\BaseModule;
use Friendica\DI;
use Friendica\Network\HTTPException; use Friendica\Network\HTTPException;
class MethodNotAllowed extends BaseModule class MethodNotAllowed extends BaseModule
{ {
protected function content(array $request = []): string 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.'));
} }
} }

View file

@ -25,8 +25,8 @@ use Friendica\App;
use Friendica\BaseModule; use Friendica\BaseModule;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\DI;
use Friendica\Module\Response; use Friendica\Module\Response;
use Friendica\Module\Special\HTTPException as ModuleHTTPException;
use Friendica\Network\HTTPException; use Friendica\Network\HTTPException;
use Friendica\Util\Profiler; use Friendica\Util\Profiler;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
@ -46,10 +46,10 @@ class PageNotFound extends BaseModule
protected function content(array $request = []): string 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. /* The URL provided does not resolve to a valid module.
* *
@ -77,6 +77,6 @@ class PageNotFound extends BaseModule
'query' => $this->server['QUERY_STRING'] 'query' => $this->server['QUERY_STRING']
]); ]);
return parent::run($request); // TODO: Change the autogenerated stub return parent::run($httpException, $request);
} }
} }

View file

@ -24,6 +24,7 @@ namespace Friendica\Module\OAuth;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\DI; use Friendica\DI;
use Friendica\Module\BaseApi; use Friendica\Module\BaseApi;
use Friendica\Module\Special\HTTPException;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
/** /**
@ -31,9 +32,9 @@ use Psr\Http\Message\ResponseInterface;
*/ */
class Acknowledge extends BaseApi 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 = []) protected function post(array $request = [])

View file

@ -26,6 +26,7 @@ use Friendica\Core\System;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\DI; use Friendica\DI;
use Friendica\Module\BaseApi; use Friendica\Module\BaseApi;
use Friendica\Module\Special\HTTPException;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
/** /**
@ -33,9 +34,9 @@ use Psr\Http\Message\ResponseInterface;
*/ */
class Revoke extends BaseApi 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 = []) protected function post(array $request = [])

View file

@ -26,6 +26,7 @@ use Friendica\Core\System;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\DI; use Friendica\DI;
use Friendica\Module\BaseApi; use Friendica\Module\BaseApi;
use Friendica\Module\Special\HTTPException;
use Friendica\Security\OAuth; use Friendica\Security\OAuth;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
@ -36,9 +37,9 @@ use Psr\Http\Message\ResponseInterface;
*/ */
class Token extends BaseApi 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 = []) protected function post(array $request = [])

View file

@ -21,10 +21,13 @@
namespace Friendica\Module\Special; 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\Renderer;
use Friendica\Core\Session\Model\UserSession;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\DI; use Psr\Log\LoggerInterface;
/** /**
* This special module displays HTTPException when they are thrown in modules. * This special module displays HTTPException when they are thrown in modules.
@ -33,27 +36,52 @@ use Friendica\DI;
*/ */
class HTTPException 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. * Generates the necessary template variables from the caught HTTPException.
* *
* Fills in the blanks if title or descriptions aren't provided by the exception. * Fills in the blanks if title or descriptions aren't provided by the exception.
* *
* @param \Friendica\Network\HTTPException $e * @param \Friendica\Network\HTTPException $e
*
* @return array ['$title' => ..., '$description' => ...] * @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 // Explanations are mostly taken from https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
$vars = [ $vars = [
'$title' => $e->getDescription() ?: 'Error ' . $e->getCode(), '$title' => $e->getDescription() ?: 'Error ' . $e->getCode(),
'$message' => $e->getMessage() ?: $e->getExplanation(), '$message' => $e->getMessage() ?: $e->getExplanation(),
'$back' => DI::l10n()->t('Go back'), '$back' => $this->l10n->t('Go back'),
'$stack_trace' => DI::l10n()->t('Stack trace:'), '$stack_trace' => $this->l10n->t('Stack trace:'),
'$request_id' => $this->requestId,
]; ];
if (DI::app()->isSiteAdmin()) { if ($this->isSiteAdmin) {
$vars['$thrown'] = DI::l10n()->t('Exception thrown in %s:%d', $e->getFile(), $e->getLine()); $vars['$thrown'] = $this->l10n->t('Exception thrown in %s:%d', $e->getFile(), $e->getLine());
$vars['$trace'] = $e->getTraceAsString(); $vars['$trace'] = $e->getTraceAsString();
} }
return $vars; return $vars;
@ -63,6 +91,7 @@ class HTTPException
* Displays a bare message page with no theming at all. * Displays a bare message page with no theming at all.
* *
* @param \Friendica\Network\HTTPException $e * @param \Friendica\Network\HTTPException $e
*
* @throws \Exception * @throws \Exception
*/ */
public function rawContent(\Friendica\Network\HTTPException $e) public function rawContent(\Friendica\Network\HTTPException $e)
@ -70,13 +99,13 @@ class HTTPException
$content = ''; $content = '';
if ($e->getCode() >= 400) { if ($e->getCode() >= 400) {
$vars = self::getVars($e); $vars = $this->getVars($e);
try { try {
$tpl = Renderer::getMarkupTemplate('http_status.tpl'); $tpl = Renderer::getMarkupTemplate('http_status.tpl');
$content = Renderer::replaceMacros($tpl, $vars); $content = Renderer::replaceMacros($tpl, $vars);
} catch (\Exception $e) { } catch (\Exception $e) {
$content = "<h1>{$vars['$title']}</h1><p>{$vars['$message']}</p>"; $content = "<h1>{$vars['$title']}</h1><p>{$vars['$message']}</p>";
if (DI::app()->isSiteAdmin()) { if ($this->isSiteAdmin) {
$content .= "<p>{$vars['$thrown']}</p>"; $content .= "<p>{$vars['$thrown']}</p>";
$content .= "<pre>{$vars['$trace']}</pre>"; $content .= "<pre>{$vars['$trace']}</pre>";
} }
@ -90,19 +119,28 @@ class HTTPException
* Returns a content string that can be integrated in the current theme. * Returns a content string that can be integrated in the current theme.
* *
* @param \Friendica\Network\HTTPException $e * @param \Friendica\Network\HTTPException $e
*
* @return string * @return string
* @throws \Exception * @throws \Exception
*/ */
public function content(\Friendica\Network\HTTPException $e): string 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) { 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'); $tpl = Renderer::getMarkupTemplate('exception.tpl');
return Renderer::replaceMacros($tpl, self::getVars($e)); return Renderer::replaceMacros($tpl, $this->getVars($e));
} }
} }

View file

@ -392,9 +392,6 @@ class Authentication
} }
} }
$a->setLoggedInUserId($user_record['uid']);
$a->setLoggedInUserNickname($user_record['nickname']);
if ($login_initial) { if ($login_initial) {
Hook::callAll('logged_in', $user_record); Hook::callAll('logged_in', $user_record);
} }

View file

@ -176,6 +176,12 @@ return [
['createDev', [], Dice::CHAIN_CALL], ['createDev', [], Dice::CHAIN_CALL],
] ]
], ],
\Friendica\Core\Logger\Capabilities\IHaveCallIntrospections::class => [
'instanceOf' => \Friendica\Core\Logger\Util\Introspection::class,
'constructParams' => [
\Friendica\Core\Logger\Util\Introspection::IGNORE_CLASS_LIST,
],
],
Cache\Capability\ICanCache::class => [ Cache\Capability\ICanCache::class => [
'instanceOf' => Cache\Factory\Cache::class, 'instanceOf' => Cache\Factory\Cache::class,
'call' => [ 'call' => [
@ -267,5 +273,10 @@ return [
], ],
\Psr\Clock\ClockInterface::class => [ \Psr\Clock\ClockInterface::class => [
'instanceOf' => Util\Clock\SystemClock::class 'instanceOf' => Util\Clock\SystemClock::class
] ],
\Friendica\Module\Special\HTTPException::class => [
'constructParams' => [
$_SERVER
],
],
]; ];

View file

@ -27,12 +27,14 @@ use Friendica\Core\Addon;
use Friendica\Core\Hook; use Friendica\Core\Hook;
use Friendica\Database\Database; use Friendica\Database\Database;
use Friendica\DI; use Friendica\DI;
use Friendica\Module\Special\HTTPException;
use Friendica\Security\Authentication; use Friendica\Security\Authentication;
use Friendica\Security\BasicAuth; use Friendica\Security\BasicAuth;
use Friendica\Test\FixtureTest; use Friendica\Test\FixtureTest;
use Friendica\Test\Util\AppDouble; use Friendica\Test\Util\AppDouble;
use Friendica\Test\Util\AuthenticationDouble; use Friendica\Test\Util\AuthenticationDouble;
use Friendica\Test\Util\AuthTestConfig; use Friendica\Test\Util\AuthTestConfig;
use Mockery\MockInterface;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
abstract class ApiTest extends FixtureTest abstract class ApiTest extends FixtureTest
@ -59,6 +61,9 @@ abstract class ApiTest extends FixtureTest
'nurl' => 'http://localhost/profile/othercontact' 'nurl' => 'http://localhost/profile/othercontact'
]; ];
/** @var HTTPException */
protected $httpExceptionMock;
// User ID that we know is not in the database // User ID that we know is not in the database
const WRONG_USER_ID = 666; const WRONG_USER_ID = 666;
@ -175,6 +180,8 @@ abstract class ApiTest extends FixtureTest
// Manual override to bypass API authentication // Manual override to bypass API authentication
DI::app()->setIsLoggedIn(true); DI::app()->setIsLoggedIn(true);
$this->httpExceptionMock = $this->dice->create(HTTPException::class);
AuthTestConfig::$authenticated = true; AuthTestConfig::$authenticated = true;
AuthTestConfig::$user_id = 42; AuthTestConfig::$user_id = 42;

View file

@ -35,7 +35,7 @@ class SearchTest extends ApiTest
$directMessage = new DirectMessage(new NullLogger(), DI::dba(), DI::twitterUser()); $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(), [])) $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); $json = $this->toJson($response);
@ -53,7 +53,7 @@ class SearchTest extends ApiTest
$directMessage = new DirectMessage(new NullLogger(), DI::dba(), DI::twitterUser()); $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(), [])) $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' 'searchstring' => 'item_body'
]); ]);
@ -74,7 +74,7 @@ class SearchTest extends ApiTest
$directMessage = new DirectMessage(new NullLogger(), DI::dba(), DI::twitterUser()); $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(), [])) $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' 'searchstring' => 'test'
]); ]);

View file

@ -67,7 +67,7 @@ class NotificationTest extends ApiTest
XML; XML;
$response = (new Notification(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => '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::assertXmlStringEqualsXmlString($assertXml, (string)$response->getBody());
self::assertEquals([ self::assertEquals([
@ -79,7 +79,7 @@ XML;
public function testWithJsonResult() public function testWithJsonResult()
{ {
$response = (new Notification(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) $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); $json = $this->toJson($response);

View file

@ -39,7 +39,7 @@ class DeleteTest extends ApiTest
public function testEmpty() public function testEmpty()
{ {
$this->expectException(BadRequestException::class); $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() public function testWithoutAuthenticatedUser()
@ -50,7 +50,7 @@ class DeleteTest extends ApiTest
public function testWrong() public function testWrong()
{ {
$this->expectException(BadRequestException::class); $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() public function testValidWithPost()
@ -58,7 +58,7 @@ class DeleteTest extends ApiTest
$this->loadFixture(__DIR__ . '/../../../../../datasets/photo/photo.fixture.php', DI::dba()); $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(), [])) $response = (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'photo_id' => '709057080661a283a6aa598501504178' 'photo_id' => '709057080661a283a6aa598501504178'
]); ]);
@ -73,7 +73,7 @@ class DeleteTest extends ApiTest
$this->loadFixture(__DIR__ . '/../../../../../datasets/photo/photo.fixture.php', DI::dba()); $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(), [])) $response = (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'photo_id' => '709057080661a283a6aa598501504178' 'photo_id' => '709057080661a283a6aa598501504178'
]); ]);

View file

@ -40,7 +40,7 @@ class DeleteTest extends ApiTest
{ {
$this->expectException(BadRequestException::class); $this->expectException(BadRequestException::class);
(new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (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); $this->expectException(BadRequestException::class);
(new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'album' => 'album_name' 'album' => 'album_name'
]); ]);
} }
@ -58,7 +58,7 @@ class DeleteTest extends ApiTest
$this->loadFixture(__DIR__ . '/../../../../../datasets/photo/photo.fixture.php', DI::dba()); $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(), [])) $response = (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'album' => 'test_album'] 'album' => 'test_album']
); );

View file

@ -40,14 +40,14 @@ class UpdateTest extends ApiTest
{ {
$this->expectException(BadRequestException::class); $this->expectException(BadRequestException::class);
(new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run(); ->run($this->httpExceptionMock);
} }
public function testTooFewArgs() public function testTooFewArgs()
{ {
$this->expectException(BadRequestException::class); $this->expectException(BadRequestException::class);
(new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'album' => 'album_name' 'album' => 'album_name'
]); ]);
} }
@ -56,7 +56,7 @@ class UpdateTest extends ApiTest
{ {
$this->expectException(BadRequestException::class); $this->expectException(BadRequestException::class);
(new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'album' => 'album_name', 'album' => 'album_name',
'album_new' => 'album_name' 'album_new' => 'album_name'
]); ]);
@ -72,7 +72,7 @@ class UpdateTest extends ApiTest
$this->loadFixture(__DIR__ . '/../../../../../datasets/photo/photo.fixture.php', DI::dba()); $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(), [])) $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' => 'test_album',
'album_new' => 'test_album_2' 'album_new' => 'test_album_2'
]); ]);

View file

@ -37,7 +37,7 @@ class ConfigTest extends ApiTest
DI::config()->set('system', 'ssl_policy', BaseURL::SSL_POLICY_FULL); 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(), [])) $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); $json = $this->toJson($response);
self::assertEquals('localhost', $json->site->server); self::assertEquals('localhost', $json->site->server);

View file

@ -31,7 +31,7 @@ class VersionTest extends ApiTest
public function test() public function test()
{ {
$response = (new Version(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) $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([ self::assertEquals([
'Content-type' => ['application/json'], 'Content-type' => ['application/json'],

View file

@ -31,7 +31,7 @@ class TestTest extends ApiTest
public function testJson() public function testJson()
{ {
$response = (new Test(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) $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); $json = $this->toJson($response);
@ -45,7 +45,7 @@ class TestTest extends ApiTest
public function testXml() public function testXml()
{ {
$response = (new Test(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'xml'])) $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([ self::assertEquals([
'Content-type' => ['text/xml'], 'Content-type' => ['text/xml'],

View file

@ -36,7 +36,7 @@ class VerifyCredentialsTest extends ApiTest
public function testApiAccountVerifyCredentials() public function testApiAccountVerifyCredentials()
{ {
$response = (new VerifyCredentials(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $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); $json = $this->toJson($response);

View file

@ -32,7 +32,7 @@ class RateLimitStatusTest extends ApiTest
public function testWithJson() public function testWithJson()
{ {
$response = (new RateLimitStatus(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) $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); $result = $this->toJson($response);
@ -48,7 +48,7 @@ class RateLimitStatusTest extends ApiTest
public function testWithXml() public function testWithXml()
{ {
$response = (new RateLimitStatus(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'xml'])) $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([ self::assertEquals([
'Content-type' => ['text/xml'], 'Content-type' => ['text/xml'],

View file

@ -36,7 +36,7 @@ class UpdateProfileTest extends ApiTest
$this->useHttpMethod(Router::POST); $this->useHttpMethod(Router::POST);
$response = (new UpdateProfile(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) $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', 'name' => 'new_name',
'description' => 'new_description' 'description' => 'new_description'
]); ]);

View file

@ -34,7 +34,7 @@ class ListsTest extends ApiTest
public function testApiStatusesFWithBlocks() public function testApiStatusesFWithBlocks()
{ {
$response = (new Lists(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $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); $json = $this->toJson($response);

View file

@ -40,7 +40,7 @@ class AllTest extends ApiTest
$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $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'])) $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); $json = $this->toJson($response);

View file

@ -39,7 +39,7 @@ class ConversationTest extends ApiTest
$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $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'])) $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, 'friendica_verbose' => true,
]); ]);

View file

@ -38,7 +38,7 @@ class DestroyTest extends ApiTest
{ {
$this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); $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'])) (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() public function testApiDirectMessagesDestroyWithVerbose()
{ {
$response = (new Destroy(DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) $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, 'friendica_verbose' => true,
]); ]);
@ -85,7 +85,7 @@ class DestroyTest extends ApiTest
{ {
$this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); $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'])) (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 'id' => 1
]); ]);
} }
@ -98,7 +98,7 @@ class DestroyTest extends ApiTest
public function testApiDirectMessagesDestroyWithIdAndVerbose() public function testApiDirectMessagesDestroyWithIdAndVerbose()
{ {
$response = (new Destroy(DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) $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, 'id' => 1,
'friendica_parenturi' => 'parent_uri', 'friendica_parenturi' => 'parent_uri',
'friendica_verbose' => true, 'friendica_verbose' => true,
@ -122,7 +122,7 @@ class DestroyTest extends ApiTest
$id = $ids[0]['id']; $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'])) $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, 'id' => $id,
'friendica_verbose' => true, 'friendica_verbose' => true,
]); ]);

View file

@ -41,7 +41,7 @@ class InboxTest extends ApiTest
$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $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'])) $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); $json = $this->toJson($response);

View file

@ -39,7 +39,7 @@ class NewDMTest extends ApiTest
$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $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'])) $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()); self::assertEmpty((string)$response->getBody());
} }
@ -71,7 +71,7 @@ class NewDMTest extends ApiTest
$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $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'])) $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', 'text' => 'message_text',
'user_id' => 43 'user_id' => 43
]); ]);
@ -88,12 +88,12 @@ class NewDMTest extends ApiTest
*/ */
public function testApiDirectMessagesNewWithScreenName() public function testApiDirectMessagesNewWithScreenName()
{ {
DI::app()->setLoggedInUserNickname('selfcontact'); DI::session()->set('nickname', 'selfcontact');
$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $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'])) $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', 'text' => 'message_text',
'user_id' => 44 'user_id' => 44
]); ]);
@ -112,12 +112,12 @@ class NewDMTest extends ApiTest
*/ */
public function testApiDirectMessagesNewWithTitle() public function testApiDirectMessagesNewWithTitle()
{ {
DI::app()->setLoggedInUserNickname('selfcontact'); DI::session()->set('nickname', 'selfcontact');
$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $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'])) $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', 'text' => 'message_text',
'user_id' => 44, 'user_id' => 44,
'title' => 'message_title', 'title' => 'message_title',
@ -138,12 +138,12 @@ class NewDMTest extends ApiTest
*/ */
public function testApiDirectMessagesNewWithRss() public function testApiDirectMessagesNewWithRss()
{ {
DI::app()->setLoggedInUserNickname('selfcontact'); DI::session()->set('nickname', 'selfcontact');
$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $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'])) $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', 'text' => 'message_text',
'user_id' => 44, 'user_id' => 44,
'title' => 'message_title', 'title' => 'message_title',

View file

@ -39,7 +39,7 @@ class SentTest extends ApiTest
$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $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'])) $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, 'friendica_verbose' => true,
]); ]);
@ -59,7 +59,7 @@ class SentTest extends ApiTest
$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser()); $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'])) $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'); self::assertXml((string)$response->getBody(), 'direct-messages');
} }

View file

@ -47,7 +47,7 @@ class CreateTest extends ApiTest
$this->expectException(BadRequestException::class); $this->expectException(BadRequestException::class);
(new Create(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (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() public function testApiFavoritesCreateDestroyWithCreateAction()
{ {
$response = (new Create(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new Create(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'id' => 3 'id' => 3
]); ]);
@ -75,7 +75,7 @@ class CreateTest extends ApiTest
public function testApiFavoritesCreateDestroyWithCreateActionAndRss() public function testApiFavoritesCreateDestroyWithCreateActionAndRss()
{ {
$response = (new Create(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => ICanCreateResponses::TYPE_RSS])) $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 'id' => 3
]); ]);

View file

@ -46,7 +46,7 @@ class DestroyTest extends ApiTest
$this->expectException(BadRequestException::class); $this->expectException(BadRequestException::class);
(new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (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() public function testApiFavoritesCreateDestroyWithDestroyAction()
{ {
$response = (new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'id' => 3 'id' => 3
]); ]);

View file

@ -37,7 +37,7 @@ class FavoritesTest extends ApiTest
public function testApiFavorites() public function testApiFavorites()
{ {
$response = (new Favorites(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new Favorites(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'page' => -1, 'page' => -1,
'max_id' => 10, '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(), [], [ $response = (new Favorites(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], [
'extension' => ICanCreateResponses::TYPE_RSS 'extension' => ICanCreateResponses::TYPE_RSS
]))->run(); ]))->run($this->httpExceptionMock);
self::assertEquals(ICanCreateResponses::TYPE_RSS, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); self::assertEquals(ICanCreateResponses::TYPE_RSS, $response->getHeaderLine(ICanCreateResponses::X_HEADER));

View file

@ -34,7 +34,7 @@ class ListsTest extends ApiTest
public function testApiStatusesFWithFollowers() public function testApiStatusesFWithFollowers()
{ {
$response = (new Lists(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $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); $json = $this->toJson($response);

View file

@ -36,7 +36,7 @@ class ListsTest extends ApiTest
public function testApiStatusesFWithFriends() public function testApiStatusesFWithFriends()
{ {
$response = (new Lists(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $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); $json = $this->toJson($response);

View file

@ -36,7 +36,7 @@ class IncomingTest extends ApiTest
public function testApiFriendshipsIncoming() public function testApiFriendshipsIncoming()
{ {
$response = (new Incoming(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $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); $json = $this->toJson($response);

View file

@ -39,7 +39,7 @@ class StatusesTest extends ApiTest
$this->expectException(BadRequestException::class); $this->expectException(BadRequestException::class);
(new Statuses(DI::dba(), DI::twitterStatus(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (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() public function testApiListsStatusesWithListId()
{ {
$response = (new Statuses(DI::dba(), DI::twitterStatus(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $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, 'list_id' => 1,
'page' => -1, 'page' => -1,
'max_id' => 10 'max_id' => 10
@ -68,7 +68,7 @@ class StatusesTest extends ApiTest
public function testApiListsStatusesWithListIdAndRss() 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'])) $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 'list_id' => 1
]); ]);

View file

@ -47,7 +47,7 @@ class UploadTest extends ApiTest
$this->expectException(BadRequestException::class); $this->expectException(BadRequestException::class);
(new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (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; AuthTestConfig::$authenticated = false;
(new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (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(), [])) (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(), [])) $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); $media = $this->toJson($response);

View file

@ -31,7 +31,7 @@ class SavedSearchesTest extends ApiTest
public function test() public function test()
{ {
$response = (new SavedSearches(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json'])) $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); $result = $this->toJson($response);

View file

@ -46,7 +46,7 @@ class DestroyTest extends ApiTest
$this->expectException(BadRequestException::class); $this->expectException(BadRequestException::class);
(new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (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() public function testApiStatusesDestroyWithId()
{ {
$response = (new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new Destroy(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'id' => 1 'id' => 1
]); ]);

View file

@ -37,7 +37,7 @@ class MentionsTest extends ApiTest
public function testApiStatusesMentions() public function testApiStatusesMentions()
{ {
$response = (new Mentions(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new Mentions(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'max_id' => 10 'max_id' => 10
]); ]);
@ -55,7 +55,7 @@ class MentionsTest extends ApiTest
public function testApiStatusesMentionsWithNegativePage() public function testApiStatusesMentionsWithNegativePage()
{ {
$response = (new Mentions(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new Mentions(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'page' => -2 'page' => -2
]); ]);
@ -87,7 +87,7 @@ class MentionsTest extends ApiTest
public function testApiStatusesMentionsWithRss() public function testApiStatusesMentionsWithRss()
{ {
$response = (new Mentions(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => ICanCreateResponses::TYPE_RSS])) $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 'page' => -2
]); ]);

View file

@ -37,7 +37,7 @@ class NetworkPublicTimelineTest extends ApiTest
public function testApiStatusesNetworkpublicTimeline() public function testApiStatusesNetworkpublicTimeline()
{ {
$response = (new NetworkPublicTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new NetworkPublicTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'max_id' => 10 'max_id' => 10
]); ]);
@ -59,7 +59,7 @@ class NetworkPublicTimelineTest extends ApiTest
public function testApiStatusesNetworkpublicTimelineWithNegativePage() public function testApiStatusesNetworkpublicTimelineWithNegativePage()
{ {
$response = (new NetworkPublicTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new NetworkPublicTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'page' => -2 '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(), [], [ $response = (new NetworkPublicTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], [
'extension' => ICanCreateResponses::TYPE_RSS 'extension' => ICanCreateResponses::TYPE_RSS
]))->run([ ]))->run($this->httpExceptionMock, [
'page' => -2 'page' => -2
]); ]);

View file

@ -46,7 +46,7 @@ class RetweetTest extends ApiTest
$this->expectException(BadRequestException::class); $this->expectException(BadRequestException::class);
(new Retweet(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (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() public function testApiStatusesRepeatWithId()
{ {
$response = (new Retweet(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new Retweet(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'id' => 1 'id' => 1
]); ]);
@ -89,7 +89,7 @@ class RetweetTest extends ApiTest
public function testApiStatusesRepeatWithSharedId() public function testApiStatusesRepeatWithSharedId()
{ {
$response = (new Retweet(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new Retweet(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'id' => 5 'id' => 5
]); ]);

View file

@ -40,7 +40,7 @@ class ShowTest extends ApiTest
(new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (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() public function testApiStatusesShowWithId()
{ {
$response = (new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'id' => 1 'id' => 1
]); ]);
@ -69,7 +69,7 @@ class ShowTest extends ApiTest
public function testApiStatusesShowWithConversation() public function testApiStatusesShowWithConversation()
{ {
$response = (new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'id' => 1, 'id' => 1,
'conversation' => 1 'conversation' => 1
]); ]);

View file

@ -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(), [])) $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', 'status' => 'Status content #friendica',
'in_reply_to_status_id' => 0, 'in_reply_to_status_id' => 0,
'lat' => 48, 'lat' => 48,
@ -77,7 +77,7 @@ class UpdateTest extends ApiTest
public function testApiStatusesUpdateWithHtml() public function testApiStatusesUpdateWithHtml()
{ {
$response = (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'htmlstatus' => '<b>Status content</b>', 'htmlstatus' => '<b>Status content</b>',
]); ]);

View file

@ -37,7 +37,7 @@ class UserTimelineTest extends ApiTest
public function testApiStatusesUserTimeline() public function testApiStatusesUserTimeline()
{ {
$response = (new UserTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new UserTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'user_id' => 42, 'user_id' => 42,
'max_id' => 10, 'max_id' => 10,
'exclude_replies' => true, 'exclude_replies' => true,
@ -62,7 +62,7 @@ class UserTimelineTest extends ApiTest
public function testApiStatusesUserTimelineWithNegativePage() public function testApiStatusesUserTimelineWithNegativePage()
{ {
$response = (new UserTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $response = (new UserTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run([ ->run($this->httpExceptionMock, [
'user_id' => 42, 'user_id' => 42,
'page' => -2, '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(), [], [ $response = (new UserTimeline(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], [
'extension' => ICanCreateResponses::TYPE_RSS 'extension' => ICanCreateResponses::TYPE_RSS
]))->run(); ]))->run($this->httpExceptionMock);
self::assertEquals(ICanCreateResponses::TYPE_RSS, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); self::assertEquals(ICanCreateResponses::TYPE_RSS, $response->getHeaderLine(ICanCreateResponses::X_HEADER));

View file

@ -39,7 +39,7 @@ class LookupTest extends ApiTest
$this->expectException(NotFoundException::class); $this->expectException(NotFoundException::class);
(new Lookup(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (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() public function testApiUsersLookupWithUserId()
{ {
$respone = (new Lookup(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $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'] 'user_id' => static::OTHER_USER['id']
]); ]);

View file

@ -38,7 +38,7 @@ class SearchTest extends ApiTest
public function testApiUsersSearch() public function testApiUsersSearch()
{ {
$respone = (new Search(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $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'] '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(), [], [ $respone = (new Search(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], [
'extension' => ICanCreateResponses::TYPE_XML 'extension' => ICanCreateResponses::TYPE_XML
]))->run([ ]))->run($this->httpExceptionMock, [
'q' => static::OTHER_USER['name'] 'q' => static::OTHER_USER['name']
]); ]);
@ -73,6 +73,6 @@ class SearchTest extends ApiTest
$this->expectException(BadRequestException::class); $this->expectException(BadRequestException::class);
(new Search(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) (new Search(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))
->run(); ->run($this->httpExceptionMock);
} }
} }

View file

@ -37,7 +37,7 @@ class ShowTest extends ApiTest
public function testApiUsersShow() public function testApiUsersShow()
{ {
$response = (new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [])) $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); $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(), [], [ $response = (new Show(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], [
'extension' => ICanCreateResponses::TYPE_XML 'extension' => ICanCreateResponses::TYPE_XML
]))->run(); ]))->run($this->httpExceptionMock);
self::assertEquals(ICanCreateResponses::TYPE_XML, $response->getHeaderLine(ICanCreateResponses::X_HEADER)); self::assertEquals(ICanCreateResponses::TYPE_XML, $response->getHeaderLine(ICanCreateResponses::X_HEADER));

View file

@ -27,14 +27,26 @@ use Friendica\DI;
use Friendica\Module\NodeInfo110; use Friendica\Module\NodeInfo110;
use Friendica\Module\NodeInfo120; use Friendica\Module\NodeInfo120;
use Friendica\Module\NodeInfo210; use Friendica\Module\NodeInfo210;
use Friendica\Module\Special\HTTPException;
use Friendica\Test\FixtureTest; use Friendica\Test\FixtureTest;
use Mockery\MockInterface;
class NodeInfoTest extends FixtureTest class NodeInfoTest extends FixtureTest
{ {
/** @var MockInterface|HTTPException */
protected $httpExceptionMock;
protected function setUp(): void
{
parent::setUp();
$this->httpExceptionMock = \Mockery::mock(HTTPException::class);
}
public function testNodeInfo110() public function testNodeInfo110()
{ {
$response = (new NodeInfo110(DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), DI::config(), [])) $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::assertJson($response->getBody());
self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders());
@ -55,7 +67,7 @@ class NodeInfoTest extends FixtureTest
public function testNodeInfo120() public function testNodeInfo120()
{ {
$response = (new NodeInfo120(DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), DI::config(), [])) $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::assertJson($response->getBody());
self::assertEquals(['Content-type' => ['application/json; charset=utf-8'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); 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() public function testNodeInfo210()
{ {
$response = (new NodeInfo210(DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), DI::config(), [])) $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::assertJson($response->getBody());
self::assertEquals(['Content-type' => ['application/json; charset=utf-8'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); self::assertEquals(['Content-type' => ['application/json; charset=utf-8'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders());

View file

@ -24,16 +24,28 @@ namespace Friendica\Test\src\Module\Special;
use Friendica\App\Router; use Friendica\App\Router;
use Friendica\Capabilities\ICanCreateResponses; use Friendica\Capabilities\ICanCreateResponses;
use Friendica\DI; use Friendica\DI;
use Friendica\Module\Special\HTTPException;
use Friendica\Module\Special\Options; use Friendica\Module\Special\Options;
use Friendica\Test\FixtureTest; use Friendica\Test\FixtureTest;
use Mockery\MockInterface;
class OptionsTest extends FixtureTest class OptionsTest extends FixtureTest
{ {
/** @var MockInterface|HTTPException */
protected $httpExceptionMock;
protected function setUp(): void
{
parent::setUp();
$this->httpExceptionMock = \Mockery::mock(HTTPException::class);
}
public function testOptionsAll() public function testOptionsAll()
{ {
$this->useHttpMethod(Router::OPTIONS); $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::assertEmpty((string)$response->getBody());
self::assertEquals(204, $response->getStatusCode()); 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(), [], [ $response = (new Options(DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], [
'AllowedMethods' => [Router::GET, Router::POST], 'AllowedMethods' => [Router::GET, Router::POST],
]))->run(); ]))->run($this->httpExceptionMock);
self::assertEmpty((string)$response->getBody()); self::assertEmpty((string)$response->getBody());
self::assertEquals(204, $response->getStatusCode()); self::assertEquals(204, $response->getStatusCode());

View file

@ -7,6 +7,9 @@
{{$stack_trace}} {{$stack_trace}}
{{$trace}}</pre> {{$trace}}</pre>
{{/if}} {{/if}}
{{if $request_id}}
<pre>Request: {{$request_id}}</pre>
{{/if}}
{{if $back}} {{if $back}}
<p><button type="button" onclick="window.history.back()" class="btn btn-primary">{{$back}}</button></p> <p><button type="button" onclick="window.history.back()" class="btn btn-primary">{{$back}}</button></p>
{{/if}} {{/if}}

View file

@ -8,5 +8,8 @@
{{if $trace}} {{if $trace}}
<pre>{{$trace nofilter}}</pre> <pre>{{$trace nofilter}}</pre>
{{/if}} {{/if}}
{{if $request_id}}
<pre>Request: {{$request_id}}</pre>
{{/if}}
</body> </body>
</html> </html>