diff --git a/tst/JsonApiTest.php b/tst/JsonApiTest.php index bbb1cc62..c3236b05 100644 --- a/tst/JsonApiTest.php +++ b/tst/JsonApiTest.php @@ -313,6 +313,60 @@ class JsonApiTest extends TestCase $this->assertStringContainsString('id="pasteurl" href="https://example.com/1"', $content, "'{$baseUri}' outputs shortened URL correctly"); } + /** + * @runInSeparateProcess + * @dataProvider baseShlinkUriProvider + */ + public function testShortenViaShlink($baseUri) + { + $mock_shlink_service = $this->_path . DIRECTORY_SEPARATOR . 'shlink.json'; + $options = parse_ini_file(CONF, true); + $options['main']['basepath'] = 'https://example.com/path'; // missing slash gets added by Configuration constructor + $options['main']['urlshortener'] = 'https://example.com' . $baseUri . 'link='; + $options['shlink']['apiurl'] = $mock_shlink_service; + Helper::createIniFile(CONF, $options); + + // the real service answer is more complex, but we only look for the shorturl & statusCode + file_put_contents($mock_shlink_service, '{"shortUrl":"https:\/\/example.com\/1"}'); + + $_SERVER['REQUEST_URI'] = $baseUri . 'link=https%3A%2F%2Fexample.com%2Fpath%2F%3Ffoo%23bar'; + $_GET['link'] = 'https://example.com/path/?foo#bar'; + if (str_contains($baseUri, '?shortenviashlink')) { + $_GET['shortenviashlink'] = null; + } + ob_start(); + new Controller; + $content = ob_get_contents(); + ob_end_clean(); + $this->assertStringContainsString('id="pasteurl" href="https://example.com/1"', $content, "'{$baseUri}' outputs shortened URL correctly"); + } + + /** + * @runInSeparateProcess + * @dataProvider baseShlinkUriProvider + */ + public function testShortenViaShlinkFailureHttp($baseUri) + { + $mock_shlink_service = 'https://httpbin.org/status/403'; + $options = parse_ini_file(CONF, true); + $options['main']['basepath'] = 'https://example.com/path'; // missing slash gets added by Configuration constructor + $options['main']['urlshortener'] = 'https://example.com' . $baseUri . 'link='; + $options['shlink']['apiurl'] = $mock_shlink_service; + Helper::createIniFile(CONF, $options); + + $_SERVER['REQUEST_URI'] = $baseUri . 'link=https%3A%2F%2Fexample.com%2Fpath%2F%3Ffoo%23bar'; + $_GET['link'] = 'https://example.com/path/?foo#bar'; + if (str_contains($baseUri, '?shortenviashlink')) { + $_GET['shortenviashlink'] = null; + } + ob_start(); + // Use @ to ignore the http warning for the 403. It will be handled appropriately by AbstractProxy + @new Controller; + $content = ob_get_contents(); + ob_end_clean(); + $this->assertStringContainsString('Error calling proxy.', $content, 'outputs error correctly'); + } + public function baseUriProvider() { return array( @@ -322,6 +376,15 @@ class JsonApiTest extends TestCase ); } + public function baseShlinkUriProvider() + { + return array( + array('/path/shortenviashlink?'), + array('/path/index.php/shortenviashlink?'), + array('/path?shortenviashlink&'), + ); + } + /** * @runInSeparateProcess */ @@ -338,4 +401,21 @@ class JsonApiTest extends TestCase ob_end_clean(); $this->assertStringContainsString('Error calling proxy.', $content, 'outputs error correctly'); } + + /** + * @runInSeparateProcess + */ + public function testShortenViaShlinkFailure() + { + $options = parse_ini_file(CONF, true); + $options['main']['basepath'] = 'https://example.com/path'; // missing slash gets added by Configuration constructor + Helper::createIniFile(CONF, $options); + $_SERVER['REQUEST_URI'] = '/path/shortenviashlink?link=https%3A%2F%2Fexample.com%2Fpath%2F%3Ffoo%23bar'; + $_GET['link'] = 'https://example.com/path/?foo#bar'; + ob_start(); + new Controller; + $content = ob_get_contents(); + ob_end_clean(); + $this->assertStringContainsString('Error calling proxy.', $content, 'outputs error correctly'); + } }