From edd4f06ad0084353ba81ba917464bb26e1368a34 Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Mon, 8 Apr 2019 23:12:34 +0200 Subject: [PATCH] Adding tests --- src/App.php | 13 +- src/Util/BasePath.php | 2 +- src/Util/BaseURL.php | 69 ++-- src/Util/Network.php | 12 +- tests/include/ApiTest.php | 4 +- tests/src/Database/DBATest.php | 4 +- tests/src/Database/DBStructureTest.php | 4 +- tests/src/Util/BaseURLTest.php | 455 +++++++++++++++++++++++++ 8 files changed, 520 insertions(+), 43 deletions(-) create mode 100644 tests/src/Util/BaseURLTest.php diff --git a/src/App.php b/src/App.php index 3e1dc147f..21675b9dc 100644 --- a/src/App.php +++ b/src/App.php @@ -196,7 +196,6 @@ class App * @see initHead() * * @param string $path - * @throws InternalServerErrorException */ public function registerStylesheet($path) { @@ -215,7 +214,6 @@ class App * @see initFooter() * * @param string $path - * @throws InternalServerErrorException */ public function registerFooterScript($path) { @@ -835,7 +833,7 @@ class App { $sender_email = $this->config->get('config', 'sender_email'); if (empty($sender_email)) { - $hostname = $this->getHostName(); + $hostname = $this->baseURL->getHostname(); if (strpos($hostname, ':')) { $hostname = substr($hostname, 0, strpos($hostname, ':')); } @@ -980,7 +978,7 @@ class App // and www.example.com vs example.com. // We will only change the url to an ip address if there is no existing setting - if (empty($url) || (!Util\Strings::compareLink($url, $this->getBaseURL())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $this->getHostName()))) { + if (empty($url) || (!Util\Strings::compareLink($url, $this->getBaseURL())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $this->baseURL->getHostname()))) { $this->config->set('system', 'url', $this->getBaseURL()); } } @@ -1014,10 +1012,7 @@ class App if (!$this->getMode()->isInstall()) { // Force SSL redirection - if ($this->config->get('system', 'force_ssl') && ($this->getScheme() == "http") - && intval($this->config->get('system', 'ssl_policy')) == BaseURL::SSL_POLICY_FULL - && strpos($this->getBaseURL(), 'https://') === 0 - && $_SERVER['REQUEST_METHOD'] == 'GET') { + if ($this->baseURL->checkRedirectHttps()) { header('HTTP/1.1 302 Moved Temporarily'); header('Location: ' . $this->getBaseURL() . '/' . $this->query_string); exit(); @@ -1353,7 +1348,7 @@ class App header("X-Friendica-Version: " . FRIENDICA_VERSION); header("Content-type: text/html; charset=utf-8"); - if ($this->config->get('system', 'hsts') && ($this->config->get('system', 'ssl_policy') == BaseUrl::SSL_POLICY_FULL)) { + if ($this->config->get('system', 'hsts') && ($this->baseURL->getSSLPolicy() == BaseUrl::SSL_POLICY_FULL)) { header("Strict-Transport-Security: max-age=31536000"); } diff --git a/src/Util/BasePath.php b/src/Util/BasePath.php index a2849831e..fc9c3b593 100644 --- a/src/Util/BasePath.php +++ b/src/Util/BasePath.php @@ -17,7 +17,7 @@ class BasePath * * @throws \Exception if directory isn't usable */ - public static function create($basePath, $server = []) + public static function create($basePath, array $server = []) { if (!$basePath && !empty($server['DOCUMENT_ROOT'])) { $basePath = $server['DOCUMENT_ROOT']; diff --git a/src/Util/BaseURL.php b/src/Util/BaseURL.php index a9bed2b5e..c4f6e991b 100644 --- a/src/Util/BaseURL.php +++ b/src/Util/BaseURL.php @@ -6,7 +6,7 @@ use Friendica\Core\Config\Configuration; /** * A class which checks and contains the basic - * environment for the BaseURL (url, urlpath, ssl_policy, hostname) + * environment for the BaseURL (url, urlpath, ssl_policy, hostname, scheme) */ class BaseURL { @@ -25,6 +25,11 @@ class BaseURL */ const SSL_POLICY_SELFSIGN = 2; + /** + * Define the Default SSL scheme + */ + const DEFAULT_SSL_SCHEME = self::SSL_POLICY_SELFSIGN; + /** * The Friendica Config * @var Configuration @@ -114,7 +119,11 @@ class BaseURL */ public function get($ssl = false) { - return (!$ssl ? $this->url : $this->returnBaseURL($ssl)); + if ($this->sslPolicy === self::SSL_POLICY_SELFSIGN && $ssl) { + return Network::switchScheme($this->url); + } + + return $this->url; } /** @@ -184,7 +193,29 @@ class BaseURL $urlPath = trim($parsed['path'], '\\/'); } - return $this->save($hostname, null, $urlPath); + $sslPolicy = null; + if (!empty($parsed['scheme'])) { + if ($parsed['scheme'] == 'https') { + $sslPolicy = BaseURL::SSL_POLICY_FULL; + } + } + + return $this->save($hostname, $sslPolicy, $urlPath); + } + + /** + * Checks, if a redirect to the HTTPS site would be necessary + * + * @return bool + */ + public function checkRedirectHttps() + { + return $this->config->get('system', 'force_ssl') + && ($this->getScheme() == "http") + && intval($this->getSSLPolicy()) == BaseURL::SSL_POLICY_FULL + && strpos($this->get(), 'https://') === 0 + && !empty($this->server['REQUEST_METHOD']) + && $this->server['REQUEST_METHOD'] === 'GET'; } /** @@ -196,8 +227,8 @@ class BaseURL $this->config = $config; $this->server = $server; - $this->checkConfig(); $this->determineSchema(); + $this->checkConfig(); } /** @@ -205,10 +236,10 @@ class BaseURL */ public function checkConfig() { - $this->hostname = $this->config->get('config', 'hostname', null); - $this->urlPath = $this->config->get('system', 'urlpath', null); - $this->sslPolicy = $this->config->get('system', 'ssl_policy', null); - $this->url = $this->config->get('system', 'url', null); + $this->hostname = $this->config->get('config', 'hostname'); + $this->urlPath = $this->config->get('system', 'urlpath'); + $this->sslPolicy = $this->config->get('system', 'ssl_policy'); + $this->url = $this->config->get('system', 'url'); if (empty($this->hostname)) { $this->determineHostname(); @@ -224,7 +255,11 @@ class BaseURL } if (!isset($this->sslPolicy)) { - $this->sslPolicy = self::SSL_POLICY_NONE; + if ($this->scheme == 'https') { + $this->sslPolicy = self::SSL_POLICY_FULL; + } else { + $this->sslPolicy = self::DEFAULT_SSL_SCHEME; + } $this->config->set('system', 'ssl_policy', $this->sslPolicy); } @@ -325,20 +360,4 @@ class BaseURL $this->scheme = 'https'; } } - - /** - * Returns the URL based on the current used ssl setting - * - * @param bool $ssl true, if ssl should be used - * - * @return string - */ - private function returnBaseURL($ssl) - { - if ($this->sslPolicy == self::SSL_POLICY_SELFSIGN && $ssl) { - return Network::switchScheme($this->url); - } - - return $this->url; - } } diff --git a/src/Util/Network.php b/src/Util/Network.php index b534a5505..e4e9c5af5 100644 --- a/src/Util/Network.php +++ b/src/Util/Network.php @@ -838,7 +838,7 @@ class Network /** - * @brief Switch the scheme of an url between http and https + * Switch the scheme of an url between http and https * * @param string $url URL * @@ -846,15 +846,17 @@ class Network */ public static function switchScheme($url) { - $parts = parse_url($url, PHP_URL_SCHEME); - if (!isset($parts['scheme'])) { + $scheme = parse_url($url, PHP_URL_SCHEME); + if (empty($scheme)) { return $url; } - if ($parts['scheme'] == 'http') { + + if ($scheme === 'http') { $url = str_replace('http://', 'https://', $url); - } elseif ($parts['scheme'] == 'https') { + } elseif ($scheme === 'https') { $url = str_replace('https://', 'http://', $url); } + return $url; } } diff --git a/tests/include/ApiTest.php b/tests/include/ApiTest.php index ecfe3e962..933b9a45a 100644 --- a/tests/include/ApiTest.php +++ b/tests/include/ApiTest.php @@ -13,6 +13,7 @@ use Friendica\Core\System; use Friendica\Factory; use Friendica\Network\HTTPException; use Friendica\Util\BasePath; +use Friendica\Util\BaseURL; use Friendica\Util\Config\ConfigFileLoader; use Monolog\Handler\TestHandler; @@ -58,7 +59,8 @@ class ApiTest extends DatabaseTest $config = Factory\ConfigFactory::createConfig($configCache); Factory\ConfigFactory::createPConfig($configCache); $logger = Factory\LoggerFactory::create('test', $config, $profiler); - $this->app = new App($config, $mode, $router, $logger, $profiler, false); + $baseUrl = new BaseURL($config, $_SERVER); + $this->app = new App($config, $mode, $router, $baseUrl, $logger, $profiler, false); parent::setUp(); diff --git a/tests/src/Database/DBATest.php b/tests/src/Database/DBATest.php index 889ae6af0..21ccd1df1 100644 --- a/tests/src/Database/DBATest.php +++ b/tests/src/Database/DBATest.php @@ -7,6 +7,7 @@ use Friendica\Database\DBA; use Friendica\Factory; use Friendica\Test\DatabaseTest; use Friendica\Util\BasePath; +use Friendica\Util\BaseURL; use Friendica\Util\Config\ConfigFileLoader; class DBATest extends DatabaseTest @@ -23,7 +24,8 @@ class DBATest extends DatabaseTest $config = Factory\ConfigFactory::createConfig($configCache); Factory\ConfigFactory::createPConfig($configCache); $logger = Factory\LoggerFactory::create('test', $config, $profiler); - $this->app = new App($config, $mode, $router, $logger, $profiler, false); + $baseUrl = new BaseURL($config, $_SERVER); + $this->app = new App($config, $mode, $router, $baseUrl, $logger, $profiler, false); parent::setUp(); diff --git a/tests/src/Database/DBStructureTest.php b/tests/src/Database/DBStructureTest.php index ec1531783..4bf4ed51c 100644 --- a/tests/src/Database/DBStructureTest.php +++ b/tests/src/Database/DBStructureTest.php @@ -7,6 +7,7 @@ use Friendica\Database\DBStructure; use Friendica\Factory; use Friendica\Test\DatabaseTest; use Friendica\Util\BasePath; +use Friendica\Util\BaseURL; use Friendica\Util\Config\ConfigFileLoader; class DBStructureTest extends DatabaseTest @@ -23,7 +24,8 @@ class DBStructureTest extends DatabaseTest $config = Factory\ConfigFactory::createConfig($configCache); Factory\ConfigFactory::createPConfig($configCache); $logger = Factory\LoggerFactory::create('test', $config, $profiler); - $this->app = new App($config, $mode, $router, $logger, $profiler, false); + $baseUrl = new BaseURL($config, $_SERVER); + $this->app = new App($config, $mode, $router, $baseUrl, $logger, $profiler, false); parent::setUp(); } diff --git a/tests/src/Util/BaseURLTest.php b/tests/src/Util/BaseURLTest.php new file mode 100644 index 000000000..330a4eebe --- /dev/null +++ b/tests/src/Util/BaseURLTest.php @@ -0,0 +1,455 @@ + [ + 'server' => [], + 'input' => [ + 'hostname' => null, + 'urlPath' => null, + 'sslPolicy' => null, + 'url' => null, + ], + 'assert' => [ + 'hostname' => '', + 'urlPath' => '', + 'sslPolicy' => BaseURL::DEFAULT_SSL_SCHEME, + 'url' => 'http://', + 'scheme' => 'http', + ], + ], + 'WithSubDirectory' => [ + 'server' => [ + 'SERVER_NAME' => 'friendica.local', + 'REDIRECT_URI' => 'test/module/more', + 'QUERY_STRING' => 'module/more', + ], + 'input' => [ + 'hostname' => null, + 'urlPath' => null, + 'sslPolicy' => null, + 'url' => null, + ], + 'assert' => [ + 'hostname' => 'friendica.local', + 'urlPath' => 'test', + 'sslPolicy' => BaseURL::DEFAULT_SSL_SCHEME, + 'url' => 'http://friendica.local/test', + 'scheme' => 'http', + ], + ], + 'input' => [ + 'server' => [], + 'input' => [ + 'hostname' => 'friendica.local', + 'urlPath' => 'test', + 'sslPolicy' => BaseURL::SSL_POLICY_FULL, + 'url' => 'http://friendica.local/test', + ], + 'assert' => [ + 'hostname' => 'friendica.local', + 'urlPath' => 'test', + 'sslPolicy' => BaseURL::SSL_POLICY_FULL, + 'url' => 'http://friendica.local/test', + 'scheme' => 'http', + ], + ], + 'WithHttpsScheme' => [ + 'server' => [ + 'SERVER_NAME' => 'friendica.local', + 'REDIRECT_URI' => 'test/module/more', + 'QUERY_STRING' => 'module/more', + 'HTTPS' => true, + ], + 'input' => [ + 'hostname' => null, + 'urlPath' => null, + 'sslPolicy' => null, + 'url' => null, + ], + 'assert' => [ + 'hostname' => 'friendica.local', + 'urlPath' => 'test', + 'sslPolicy' => BaseURL::SSL_POLICY_FULL, + 'url' => 'https://friendica.local/test', + 'scheme' => 'https', + ], + ], + 'WithoutQueryString' => [ + 'server' => [ + 'SERVER_NAME' => 'friendica.local', + 'REDIRECT_URI' => 'test/more', + 'HTTPS' => true, + ], + 'input' => [ + 'hostname' => null, + 'urlPath' => null, + 'sslPolicy' => null, + 'url' => null, + ], + 'assert' => [ + 'hostname' => 'friendica.local', + 'urlPath' => 'test/more', + 'sslPolicy' => BaseURL::SSL_POLICY_FULL, + 'url' => 'https://friendica.local/test/more', + 'scheme' => 'https', + ], + ], + 'WithPort' => [ + 'server' => [ + 'SERVER_NAME' => 'friendica.local', + 'SERVER_PORT' => '1234', + 'REDIRECT_URI' => 'test/more', + 'HTTPS' => true, + ], + 'input' => [ + 'hostname' => null, + 'urlPath' => null, + 'sslPolicy' => null, + 'url' => null, + ], + 'assert' => [ + 'hostname' => 'friendica.local:1234', + 'urlPath' => 'test/more', + 'sslPolicy' => BaseURL::SSL_POLICY_FULL, + 'url' => 'https://friendica.local:1234/test/more', + 'scheme' => 'https', + ], + ], + 'With443Port' => [ + 'server' => [ + 'SERVER_NAME' => 'friendica.local', + 'SERVER_PORT' => '443', + 'REDIRECT_URI' => 'test/more', + ], + 'input' => [ + 'hostname' => null, + 'urlPath' => null, + 'sslPolicy' => null, + 'url' => null, + ], + 'assert' => [ + 'hostname' => 'friendica.local', + 'urlPath' => 'test/more', + 'sslPolicy' => BaseURL::SSL_POLICY_FULL, + 'url' => 'https://friendica.local/test/more', + 'scheme' => 'https', + ], + ], + 'With80Port' => [ + 'server' => [ + 'SERVER_NAME' => 'friendica.local', + 'SERVER_PORT' => '80', + 'REDIRECT_URI' => 'test/more', + ], + 'input' => [ + 'hostname' => null, + 'urlPath' => null, + 'sslPolicy' => null, + 'url' => null, + ], + 'assert' => [ + 'hostname' => 'friendica.local', + 'urlPath' => 'test/more', + 'sslPolicy' => BaseURL::DEFAULT_SSL_SCHEME, + 'url' => 'http://friendica.local/test/more', + 'scheme' => 'http', + ], + ], + ]; + } + + /** + * Test the default config determination + * @dataProvider dataDefault + */ + public function testCheck($server, $input, $assert) + { + $configMock = \Mockery::mock(Configuration::class); + $configMock->shouldReceive('get')->with('config', 'hostname')->andReturn($input['hostname']); + $configMock->shouldReceive('get')->with('system', 'urlpath')->andReturn($input['urlPath']); + $configMock->shouldReceive('get')->with('system', 'ssl_policy')->andReturn($input['sslPolicy']); + $configMock->shouldReceive('get')->with('system', 'url')->andReturn($input['url']); + + if (!isset($input['urlPath']) && isset($assert['urlPath'])) { + $configMock->shouldReceive('set')->with('system', 'urlpath', $assert['urlPath'])->once(); + } + + if (!isset($input['sslPolicy']) && isset($assert['sslPolicy'])) { + $configMock->shouldReceive('set')->with('system', 'ssl_policy', $assert['sslPolicy'])->once(); + } + + if (!isset($input['hostname']) && !empty($assert['hostname'])) { + $configMock->shouldReceive('set')->with('config', 'hostname', $assert['hostname'])->once(); + } + + $baseUrl = new BaseURL($configMock, $server); + + $this->assertEquals($assert['hostname'], $baseUrl->getHostname()); + $this->assertEquals($assert['urlPath'], $baseUrl->getUrlPath()); + $this->assertEquals($assert['sslPolicy'], $baseUrl->getSSLPolicy()); + $this->assertEquals($assert['scheme'], $baseUrl->getScheme()); + $this->assertEquals($assert['url'], $baseUrl->get()); + } + + public function dataSave() + { + return [ + 'default' => [ + 'input' => [ + 'hostname' => 'friendica.old', + 'urlPath' => 'is/old/path', + 'sslPolicy' => BaseURL::DEFAULT_SSL_SCHEME, + 'url' => 'http://friendica.old/is/old/path', + 'force_ssl' => true, + ], + 'save' => [ + 'hostname' => 'friendica.local', + 'urlPath' => 'new/path', + 'sslPolicy' => BaseURL::SSL_POLICY_FULL, + ], + 'url' => 'https://friendica.local/new/path', + ], + 'null' => [ + 'input' => [ + 'hostname' => 'friendica.old', + 'urlPath' => 'is/old/path', + 'sslPolicy' => BaseURL::DEFAULT_SSL_SCHEME, + 'url' => 'http://friendica.old/is/old/path', + 'force_ssl' => true, + ], + 'save' => [ + 'hostname' => null, + 'urlPath' => null, + 'sslPolicy' => null, + ], + 'url' => 'http://friendica.old/is/old/path', + ], + 'changeHostname' => [ + 'input' => [ + 'hostname' => 'friendica.old', + 'urlPath' => 'is/old/path', + 'sslPolicy' => BaseURL::DEFAULT_SSL_SCHEME, + 'url' => 'http://friendica.old/is/old/path', + 'force_ssl' => true, + ], + 'save' => [ + 'hostname' => 'friendica.local', + 'urlPath' => null, + 'sslPolicy' => null, + ], + 'url' => 'http://friendica.local/is/old/path', + ], + 'changeUrlPath' => [ + 'input' => [ + 'hostname' => 'friendica.old', + 'urlPath' => 'is/old/path', + 'sslPolicy' => BaseURL::DEFAULT_SSL_SCHEME, + 'url' => 'http://friendica.old/is/old/path', + 'force_ssl' => true, + ], + 'save' => [ + 'hostname' => null, + 'urlPath' => 'new/path', + 'sslPolicy' => null, + ], + 'url' => 'http://friendica.old/new/path', + ], + 'changeSSLPolicy' => [ + 'input' => [ + 'hostname' => 'friendica.old', + 'urlPath' => 'is/old/path', + 'sslPolicy' => BaseURL::DEFAULT_SSL_SCHEME, + 'url' => 'http://friendica.old/is/old/path', + 'force_ssl' => true, + ], + 'save' => [ + 'hostname' => null, + 'urlPath' => null, + 'sslPolicy' => BaseURL::SSL_POLICY_FULL, + ], + 'url' => 'https://friendica.old/is/old/path', + ], + ]; + } + + /** + * Test the save() method + * @dataProvider dataSave + */ + public function testSave($input, $save, $url) + { + $configMock = \Mockery::mock(Configuration::class); + $configMock->shouldReceive('get')->with('config', 'hostname')->andReturn($input['hostname']); + $configMock->shouldReceive('get')->with('system', 'urlpath')->andReturn($input['urlPath']); + $configMock->shouldReceive('get')->with('system', 'ssl_policy')->andReturn($input['sslPolicy']); + $configMock->shouldReceive('get')->with('system', 'url')->andReturn($input['url']); + $configMock->shouldReceive('get')->with('system', 'force_ssl')->andReturn($input['force_ssl']); + + $baseUrl = new BaseURL($configMock, []); + + $configMock->shouldReceive('set')->with('config', 'hostname', $save['hostname'])->andReturn(true)->once(); + $configMock->shouldReceive('set')->with('system', 'urlpath', $save['urlPath'])->andReturn(true)->once(); + $configMock->shouldReceive('set')->with('system', 'ssl_policy', $save['sslPolicy'])->andReturn(true)->once(); + $configMock->shouldReceive('set')->with('system', 'url', $url)->andReturn(true)->once(); + + $baseUrl->save($save['hostname'], $save['sslPolicy'], $save['urlPath']); + + $this->assertEquals($url, $baseUrl->get()); + } + + /** + * Test the saveByUrl() method + * @dataProvider dataSave + * + * @param $input + * @param $save + * @param $url + */ + public function testSaveByUrl($input, $save, $url) + { + $configMock = \Mockery::mock(Configuration::class); + $configMock->shouldReceive('get')->with('config', 'hostname')->andReturn($input['hostname']); + $configMock->shouldReceive('get')->with('system', 'urlpath')->andReturn($input['urlPath']); + $configMock->shouldReceive('get')->with('system', 'ssl_policy')->andReturn($input['sslPolicy']); + $configMock->shouldReceive('get')->with('system', 'url')->andReturn($input['url']); + $configMock->shouldReceive('get')->with('system', 'force_ssl')->andReturn($input['force_ssl']); + + $baseUrl = new BaseURL($configMock, []); + + $configMock->shouldReceive('set')->with('config', 'hostname', (!empty($save['hostname']) ? $save['hostname'] : $input['hostname']))->andReturn(true)->once(); + $configMock->shouldReceive('set')->with('system', 'urlpath', (!empty($save['urlPath']) ? $save['urlPath'] : $input['urlPath']))->andReturn(true)->once(); + $configMock->shouldReceive('set')->with('system', 'ssl_policy', (!empty($save['sslPolicy']) ? $save['sslPolicy'] : $input['sslPolicy']))->andReturn(true)->once(); + $configMock->shouldReceive('set')->with('system', 'url', $url)->andReturn(true)->once(); + + $baseUrl->saveByURL($url); + + $this->assertEquals($url, $baseUrl->get()); + } + + public function dataGetBaseUrl() + { + return [ + 'default' => [ + 'sslPolicy' => BaseURL::DEFAULT_SSL_SCHEME, + 'ssl' => false, + 'url' => 'http://friendica.local/new/test', + 'assert' => 'http://friendica.local/new/test', + ], + 'DefaultWithSSL' => [ + 'sslPolicy' => BaseURL::DEFAULT_SSL_SCHEME, + 'ssl' => true, + 'url' => 'http://friendica.local/new/test', + 'assert' => 'https://friendica.local/new/test', + ], + 'SSLFullWithSSL' => [ + 'sslPolicy' => BaseURL::SSL_POLICY_FULL, + 'ssl' => true, + 'url' => 'http://friendica.local/new/test', + 'assert' => 'http://friendica.local/new/test', + ], + 'SSLFullWithoutSSL' => [ + 'sslPolicy' => BaseURL::SSL_POLICY_FULL, + 'ssl' => false, + 'url' => 'https://friendica.local/new/test', + 'assert' => 'https://friendica.local/new/test', + ], + 'NoSSLWithSSL' => [ + 'sslPolicy' => BaseURL::SSL_POLICY_NONE, + 'ssl' => true, + 'url' => 'http://friendica.local/new/test', + 'assert' => 'http://friendica.local/new/test', + ], + 'NoSSLWithoutSSL' => [ + 'sslPolicy' => BaseURL::SSL_POLICY_NONE, + 'ssl' => false, + 'url' => 'http://friendica.local/new/test', + 'assert' => 'http://friendica.local/new/test', + ], + ]; + } + + /** + * Test the get() method + * @dataProvider dataGetBaseUrl + */ + public function testGetURL($sslPolicy, $ssl, $url, $assert) + { + $configMock = \Mockery::mock(Configuration::class); + $configMock->shouldReceive('get')->with('config', 'hostname')->andReturn('friendica.local'); + $configMock->shouldReceive('get')->with('system', 'urlpath')->andReturn('new/test'); + $configMock->shouldReceive('get')->with('system', 'ssl_policy')->andReturn($sslPolicy); + $configMock->shouldReceive('get')->with('system', 'url')->andReturn($url); + + $baseUrl = new BaseURL($configMock, []); + + $this->assertEquals($assert, $baseUrl->get($ssl)); + } + + public function dataCheckRedirectHTTPS() + { + return [ + 'default' => [ + 'server' => [ + 'REQUEST_METHOD' => 'GET', + 'HTTPS' => true, + ], + 'forceSSL' => false, + 'sslPolicy' => BaseURL::DEFAULT_SSL_SCHEME, + 'url' => 'https://friendica.local', + 'redirect' => false, + ], + 'forceSSL' => [ + 'server' => [ + 'REQUEST_METHOD' => 'GET', + ], + 'forceSSL' => true, + 'sslPolicy' => BaseURL::DEFAULT_SSL_SCHEME, + 'url' => 'https://friendica.local', + 'redirect' => false, + ], + 'forceSSLWithSSLPolicy' => [ + 'server' => [], + 'forceSSL' => true, + 'sslPolicy' => BaseURL::SSL_POLICY_FULL, + 'url' => 'https://friendica.local', + 'redirect' => false, + ], + 'forceSSLWithSSLPolicyAndGet' => [ + 'server' => [ + 'REQUEST_METHOD' => 'GET', + ], + 'forceSSL' => true, + 'sslPolicy' => BaseURL::SSL_POLICY_FULL, + 'url' => 'https://friendica.local', + 'redirect' => true, + ], + ]; + } + + /** + * Test the checkRedirectHTTPS() method + * @dataProvider dataCheckRedirectHTTPS + */ + public function testCheckRedirectHTTPS($server, $forceSSL, $sslPolicy, $url, $redirect) + { + $configMock = \Mockery::mock(Configuration::class); + $configMock->shouldReceive('get')->with('config', 'hostname')->andReturn('friendica.local'); + $configMock->shouldReceive('get')->with('system', 'urlpath')->andReturn('new/test'); + $configMock->shouldReceive('get')->with('system', 'ssl_policy')->andReturn($sslPolicy); + $configMock->shouldReceive('get')->with('system', 'url')->andReturn($url); + $configMock->shouldReceive('get')->with('system', 'force_ssl')->andReturn($forceSSL); + + $baseUrl = new BaseURL($configMock, $server); + + $this->assertEquals($redirect, $baseUrl->checkRedirectHttps()); + } +}