From 16e3d006e9e9386001881053f610657525feb188 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 24 Dec 2016 10:30:21 +0100 Subject: REST API: implements getLink by ID service See http://shaarli.github.io/api-documentation/#links-link-get --- application/api/controllers/Links.php | 25 +- .../api/exceptions/ApiLinkNotFoundException.php | 32 ++ index.php | 5 +- tests/api/controllers/GetLinkIdTest.php | 130 +++++++ tests/api/controllers/GetLinksTest.php | 388 +++++++++++++++++++++ tests/api/controllers/LinksTest.php | 387 -------------------- 6 files changed, 576 insertions(+), 391 deletions(-) create mode 100644 application/api/exceptions/ApiLinkNotFoundException.php create mode 100644 tests/api/controllers/GetLinkIdTest.php create mode 100644 tests/api/controllers/GetLinksTest.php delete mode 100644 tests/api/controllers/LinksTest.php diff --git a/application/api/controllers/Links.php b/application/api/controllers/Links.php index 0a7968e3..d4f1a09c 100644 --- a/application/api/controllers/Links.php +++ b/application/api/controllers/Links.php @@ -4,6 +4,7 @@ namespace Shaarli\Api\Controllers; use Shaarli\Api\ApiUtils; use Shaarli\Api\Exceptions\ApiBadParametersException; +use Shaarli\Api\Exceptions\ApiLinkNotFoundException; use Slim\Http\Request; use Slim\Http\Response; @@ -58,8 +59,7 @@ class Links extends ApiController $limit = $request->getParam('limit'); if (empty($limit)) { $limit = self::$DEFAULT_LIMIT; - } - else if (ctype_digit($limit)) { + } else if (ctype_digit($limit)) { $limit = intval($limit); } else if ($limit === 'all') { $limit = count($links); @@ -83,4 +83,25 @@ class Links extends ApiController return $response->withJson($out, 200, $this->jsonStyle); } + + /** + * Return a single formatted link by its ID. + * + * @param Request $request Slim request. + * @param Response $response Slim response. + * @param array $args Path parameters. including the ID. + * + * @return Response containing the link array. + * + * @throws ApiLinkNotFoundException generating a 404 error. + */ + public function getLink($request, $response, $args) + { + if (! isset($this->linkDb[$args['id']])) { + throw new ApiLinkNotFoundException(); + } + $index = index_url($this->ci['environment']); + $out = ApiUtils::formatLink($this->linkDb[$args['id']], $index); + return $response->withJson($out, 200, $this->jsonStyle); + } } diff --git a/application/api/exceptions/ApiLinkNotFoundException.php b/application/api/exceptions/ApiLinkNotFoundException.php new file mode 100644 index 00000000..de7e14f5 --- /dev/null +++ b/application/api/exceptions/ApiLinkNotFoundException.php @@ -0,0 +1,32 @@ +message = 'Link not found'; + } + + /** + * {@inheritdoc} + */ + public function getApiResponse() + { + return $this->buildApiResponse(404); + } +} diff --git a/index.php b/index.php index d1eee098..8eb36d81 100644 --- a/index.php +++ b/index.php @@ -2232,12 +2232,13 @@ $app = new \Slim\App($container); $app->group('/api/v1', function() { $this->get('/info', '\Shaarli\Api\Controllers\Info:getInfo'); $this->get('/links', '\Shaarli\Api\Controllers\Links:getLinks'); + $this->get('/links/{id:[\d]+}', '\Shaarli\Api\Controllers\Links:getLink'); })->add('\Shaarli\Api\ApiMiddleware'); $response = $app->run(true); // Hack to make Slim and Shaarli router work together: -// If a Slim route isn't found, we call renderPage(). -if ($response->getStatusCode() == 404) { +// If a Slim route isn't found and NOT API call, we call renderPage(). +if ($response->getStatusCode() == 404 && strpos($_SERVER['REQUEST_URI'], '/api/v1') === false) { // We use UTF-8 for proper international characters handling. header('Content-Type: text/html; charset=utf-8'); renderPage($conf, $pluginManager, $linkDb); diff --git a/tests/api/controllers/GetLinkIdTest.php b/tests/api/controllers/GetLinkIdTest.php new file mode 100644 index 00000000..1b020505 --- /dev/null +++ b/tests/api/controllers/GetLinkIdTest.php @@ -0,0 +1,130 @@ +conf = new \ConfigManager('tests/utils/config/configJson'); + $this->refDB = new \ReferenceLinkDB(); + $this->refDB->write(self::$testDatastore); + + $this->container = new Container(); + $this->container['conf'] = $this->conf; + $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + + $this->controller = new Links($this->container); + } + + /** + * After each test, remove the test datastore. + */ + public function tearDown() + { + @unlink(self::$testDatastore); + } + + /** + * Test basic getLink service: return link ID=41. + */ + public function testGetLinkId() + { + // Used by index_url(). + $_SERVER['SERVER_NAME'] = 'domain.tld'; + $_SERVER['SERVER_PORT'] = 80; + $_SERVER['SCRIPT_NAME'] = '/'; + + $id = 41; + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + ]); + $request = Request::createFromEnvironment($env); + + $response = $this->controller->getLink($request, new Response(), ['id' => $id]); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(self::NB_FIELDS_LINK, count($data)); + $this->assertEquals($id, $data['id']); + + // Check link elements + $this->assertEquals('http://domain.tld/?WDWyig', $data['url']); + $this->assertEquals('WDWyig', $data['shorturl']); + $this->assertEquals('Link title: @website', $data['title']); + $this->assertEquals( + 'Stallman has a beard and is part of the Free Software Foundation (or not). Seriously, read this. #hashtag', + $data['description'] + ); + $this->assertEquals('sTuff', $data['tags'][0]); + $this->assertEquals(false, $data['private']); + $this->assertEquals( + \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM), + $data['created'] + ); + $this->assertEmpty($data['updated']); + } + + /** + * Test basic getLink service: get non existent link => ApiLinkNotFoundException. + * + * @expectedException Shaarli\Api\Exceptions\ApiLinkNotFoundException + * @expectedExceptionMessage Link not found + */ + public function testGetLink404() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + ]); + $request = Request::createFromEnvironment($env); + + $this->controller->getLink($request, new Response(), ['id' => -1]); + } +} diff --git a/tests/api/controllers/GetLinksTest.php b/tests/api/controllers/GetLinksTest.php new file mode 100644 index 00000000..da54fcf1 --- /dev/null +++ b/tests/api/controllers/GetLinksTest.php @@ -0,0 +1,388 @@ +conf = new \ConfigManager('tests/utils/config/configJson'); + $this->refDB = new \ReferenceLinkDB(); + $this->refDB->write(self::$testDatastore); + + $this->container = new Container(); + $this->container['conf'] = $this->conf; + $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); + + $this->controller = new Links($this->container); + } + + /** + * After every test, remove the test datastore. + */ + public function tearDown() + { + @unlink(self::$testDatastore); + } + + /** + * Test basic getLinks service: returns all links. + */ + public function testGetLinks() + { + // Used by index_url(). + $_SERVER['SERVER_NAME'] = 'domain.tld'; + $_SERVER['SERVER_PORT'] = 80; + $_SERVER['SCRIPT_NAME'] = '/'; + + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + ]); + $request = Request::createFromEnvironment($env); + + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals($this->refDB->countLinks(), count($data)); + + // Check order + $order = [41, 8, 6, 7, 0, 1, 4, 42]; + $cpt = 0; + foreach ($data as $link) { + $this->assertEquals(self::NB_FIELDS_LINK, count($link)); + $this->assertEquals($order[$cpt++], $link['id']); + } + + // Check first element fields + $first = $data[0]; + $this->assertEquals('http://domain.tld/?WDWyig', $first['url']); + $this->assertEquals('WDWyig', $first['shorturl']); + $this->assertEquals('Link title: @website', $first['title']); + $this->assertEquals( + 'Stallman has a beard and is part of the Free Software Foundation (or not). Seriously, read this. #hashtag', + $first['description'] + ); + $this->assertEquals('sTuff', $first['tags'][0]); + $this->assertEquals(false, $first['private']); + $this->assertEquals( + \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM), + $first['created'] + ); + $this->assertEmpty($first['updated']); + + // Multi tags + $link = $data[1]; + $this->assertEquals(7, count($link['tags'])); + + // Update date + $this->assertEquals( + \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20160803_093033')->format(\DateTime::ATOM), + $link['updated'] + ); + } + + /** + * Test getLinks service with offset and limit parameter: + * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). + */ + public function testGetLinksOffsetLimit() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'offset=1&limit=1' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(8, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks with limit=all (return all link). + */ + public function testGetLinksLimitAll() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'limit=all' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals($this->refDB->countLinks(), count($data)); + // Check order + $order = [41, 8, 6, 7, 0, 1, 4, 42]; + $cpt = 0; + foreach ($data as $link) { + $this->assertEquals(self::NB_FIELDS_LINK, count($link)); + $this->assertEquals($order[$cpt++], $link['id']); + } + } + + /** + * Test getLinks service with offset and limit parameter: + * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). + */ + public function testGetLinksOffsetTooHigh() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'offset=100' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEmpty(count($data)); + } + + /** + * Test getLinks with visibility parameter set to all + */ + public function testGetLinksVisibilityAll() + { + $env = Environment::mock( + [ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'visibility=all' + ] + ); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string)$response->getBody(), true); + $this->assertEquals($this->refDB->countLinks(), count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks with visibility parameter set to private + */ + public function testGetLinksVisibilityPrivate() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'visibility=private' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals($this->refDB->countPrivateLinks(), count($data)); + $this->assertEquals(6, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks with visibility parameter set to public + */ + public function testGetLinksVisibilityPublic() + { + $env = Environment::mock( + [ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'visibility=public' + ] + ); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string)$response->getBody(), true); + $this->assertEquals($this->refDB->countPublicLinks(), count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks service with offset and limit parameter: + * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). + */ + public function testGetLinksSearchTerm() + { + // Only in description - 1 result + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=Tropical' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(1, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + + // Only in tags - 1 result + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=tag3' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(0, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + + // Multiple results (2) + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=stallman' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(2, count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + $this->assertEquals(8, $data[1]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); + + // Multiword - 2 results + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=stallman+software' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(2, count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + $this->assertEquals(8, $data[1]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); + + // URL encoding + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm='. urlencode('@web') + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(2, count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + $this->assertEquals(8, $data[1]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); + } + + public function testGetLinksSearchTermNoResult() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=nope' + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(0, count($data)); + } + + public function testGetLinksSearchTags() + { + // Single tag + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchtags=dev', + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(2, count($data)); + $this->assertEquals(0, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + $this->assertEquals(4, $data[1]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); + + // Multitag + exclude + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchtags=stuff+-gnu', + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } + + /** + * Test getLinks service with search tags+terms. + */ + public function testGetLinksSearchTermsAndTags() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'searchterm=poke&searchtags=dev', + ]); + $request = Request::createFromEnvironment($env); + $response = $this->controller->getLinks($request, new Response()); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(1, count($data)); + $this->assertEquals(0, $data[0]['id']); + $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); + } +} diff --git a/tests/api/controllers/LinksTest.php b/tests/api/controllers/LinksTest.php deleted file mode 100644 index 284c3a9d..00000000 --- a/tests/api/controllers/LinksTest.php +++ /dev/null @@ -1,387 +0,0 @@ -conf = new \ConfigManager('tests/utils/config/configJson.json.php'); - $this->refDB = new \ReferenceLinkDB(); - $this->refDB->write(self::$testDatastore); - - $this->container = new Container(); - $this->container['conf'] = $this->conf; - $this->container['db'] = new \LinkDB(self::$testDatastore, true, false); - - $this->controller = new Links($this->container); - } - - /** - * After every test, remove the test datastore. - */ - public function tearDown() - { - @unlink(self::$testDatastore); - } - - /** - * Test basic getLinks service: returns all links. - */ - public function testGetLinks() - { - // Used by index_url(). - $_SERVER['SERVER_NAME'] = 'domain.tld'; - $_SERVER['SERVER_PORT'] = 80; - $_SERVER['SCRIPT_NAME'] = '/'; - - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - ]); - $request = Request::createFromEnvironment($env); - - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals($this->refDB->countLinks(), count($data)); - - // Check order - $order = [41, 8, 6, 7, 0, 1, 4, 42]; - $cpt = 0; - foreach ($data as $link) { - $this->assertEquals(self::NB_FIELDS_LINK, count($link)); - $this->assertEquals($order[$cpt++], $link['id']); - } - - // Check first element fields\ - $first = $data[0]; - $this->assertEquals('http://domain.tld/?WDWyig', $first['url']); - $this->assertEquals('WDWyig', $first['shorturl']); - $this->assertEquals('Link title: @website', $first['title']); - $this->assertEquals( - 'Stallman has a beard and is part of the Free Software Foundation (or not). Seriously, read this. #hashtag', - $first['description'] - ); - $this->assertEquals('sTuff', $first['tags'][0]); - $this->assertEquals(false, $first['private']); - $this->assertEquals( - \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM), - $first['created'] - ); - $this->assertEmpty($first['updated']); - - // Multi tags - $link = $data[1]; - $this->assertEquals(7, count($link['tags'])); - - // Update date - $this->assertEquals( - \DateTime::createFromFormat(\LinkDB::LINK_DATE_FORMAT, '20160803_093033')->format(\DateTime::ATOM), - $link['updated'] - ); - } - - /** - * Test getLinks service with offset and limit parameter: - * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). - */ - public function testGetLinksOffsetLimit() - { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'offset=1&limit=1' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(1, count($data)); - $this->assertEquals(8, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - } - - /** - * Test getLinks with limit=all (return all link). - */ - public function testGetLinksLimitAll() - { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'limit=all' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals($this->refDB->countLinks(), count($data)); - // Check order - $order = [41, 8, 6, 7, 0, 1, 4, 42]; - $cpt = 0; - foreach ($data as $link) { - $this->assertEquals(self::NB_FIELDS_LINK, count($link)); - $this->assertEquals($order[$cpt++], $link['id']); - } - } - - /** - * Test getLinks service with offset and limit parameter: - * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). - */ - public function testGetLinksOffsetTooHigh() - { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'offset=100' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEmpty(count($data)); - } - - /** - * Test getLinks with visibility parameter set to all - */ - public function testGetLinksVisibilityAll() - { - $env = Environment::mock( - [ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'visibility=all' - ] - ); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string)$response->getBody(), true); - $this->assertEquals($this->refDB->countLinks(), count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - } - - /** - * Test getLinks with visibility parameter set to private - */ - public function testGetLinksVisibilityPrivate() - { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'visibility=private' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals($this->refDB->countPrivateLinks(), count($data)); - $this->assertEquals(6, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - } - - /** - * Test getLinks with visibility parameter set to public - */ - public function testGetLinksVisibilityPublic() - { - $env = Environment::mock( - [ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'visibility=public' - ] - ); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string)$response->getBody(), true); - $this->assertEquals($this->refDB->countPublicLinks(), count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - } - - /** - * Test getLinks service with offset and limit parameter: - * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC). - */ - public function testGetLinksSearchTerm() - { - // Only in description - 1 result - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm=Tropical' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(1, count($data)); - $this->assertEquals(1, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - - // Only in tags - 1 result - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm=tag3' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(1, count($data)); - $this->assertEquals(0, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - - // Multiple results (2) - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm=stallman' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(2, count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - $this->assertEquals(8, $data[1]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); - - // Multiword - 2 results - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm=stallman+software' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(2, count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - $this->assertEquals(8, $data[1]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); - - // URL encoding - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm='. urlencode('@web') - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(2, count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - $this->assertEquals(8, $data[1]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); - } - - public function testGetLinksSearchTermNoResult() - { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm=nope' - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(0, count($data)); - } - - public function testGetLinksSearchTags() - { - // Single tag - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchtags=dev', - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(2, count($data)); - $this->assertEquals(0, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - $this->assertEquals(4, $data[1]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[1])); - - // Multitag + exclude - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchtags=stuff+-gnu', - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(1, count($data)); - $this->assertEquals(41, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - } - - /** - * Test getLinks service with search tags+terms. - */ - public function testGetLinksSearchTermsAndTags() - { - $env = Environment::mock([ - 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'searchterm=poke&searchtags=dev', - ]); - $request = Request::createFromEnvironment($env); - $response = $this->controller->getLinks($request, new Response()); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(1, count($data)); - $this->assertEquals(0, $data[0]['id']); - $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); - } -} -- cgit v1.2.3