From d3f42ca487287447efb81061609644108044a038 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 19 May 2018 15:04:04 +0200 Subject: Implements Tags endpoints for Shaarli's REST API Endpoints: * List All Tags [GET] * Get a tag [GET] * Update a tag [PUT] * Delete a tag [DELETE] Fixes #904 References shaarli/api-documentation#34 --- tests/api/controllers/tags/PutTagTest.php | 209 ++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 tests/api/controllers/tags/PutTagTest.php (limited to 'tests/api/controllers/tags/PutTagTest.php') diff --git a/tests/api/controllers/tags/PutTagTest.php b/tests/api/controllers/tags/PutTagTest.php new file mode 100644 index 00000000..6f7dec22 --- /dev/null +++ b/tests/api/controllers/tags/PutTagTest.php @@ -0,0 +1,209 @@ +conf = new ConfigManager('tests/utils/config/configJson.json.php'); + $this->refDB = new \ReferenceLinkDB(); + $this->refDB->write(self::$testDatastore); + + $refHistory = new \ReferenceHistory(); + $refHistory->write(self::$testHistory); + $this->history = new \History(self::$testHistory); + + $this->container = new Container(); + $this->container['conf'] = $this->conf; + $this->linkDB = new \LinkDB(self::$testDatastore, true, false); + $this->container['db'] = $this->linkDB; + $this->container['history'] = $this->history; + + $this->controller = new Tags($this->container); + } + + /** + * After every test, remove the test datastore. + */ + public function tearDown() + { + @unlink(self::$testDatastore); + @unlink(self::$testHistory); + } + + /** + * Test tags update + */ + public function testPutLinkValid() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'PUT', + ]); + $tagName = 'gnu'; + $update = ['name' => $newName = 'newtag']; + $request = Request::createFromEnvironment($env); + $request = $request->withParsedBody($update); + + $response = $this->controller->putTag($request, new Response(), ['tagName' => $tagName]); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(self::NB_FIELDS_TAG, count($data)); + $this->assertEquals($newName, $data['name']); + $this->assertEquals(2, $data['occurrences']); + + $tags = $this->linkDB->linksCountPerTag(); + $this->assertNotTrue(isset($tags[$tagName])); + $this->assertEquals(2, $tags[$newName]); + + $historyEntry = $this->history->getHistory()[0]; + $this->assertEquals(\History::UPDATED, $historyEntry['event']); + $this->assertTrue( + (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime'] + ); + $historyEntry = $this->history->getHistory()[1]; + $this->assertEquals(\History::UPDATED, $historyEntry['event']); + $this->assertTrue( + (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime'] + ); + } + + /** + * Test tag update with an existing tag: they should be merged + */ + public function testPutTagMerge() + { + $tagName = 'gnu'; + $newName = 'w3c'; + + $tags = $this->linkDB->linksCountPerTag(); + $this->assertEquals(1, $tags[$newName]); + $this->assertEquals(2, $tags[$tagName]); + + $env = Environment::mock([ + 'REQUEST_METHOD' => 'PUT', + ]); + $update = ['name' => $newName]; + $request = Request::createFromEnvironment($env); + $request = $request->withParsedBody($update); + + $response = $this->controller->putTag($request, new Response(), ['tagName' => $tagName]); + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode((string) $response->getBody(), true); + $this->assertEquals(self::NB_FIELDS_TAG, count($data)); + $this->assertEquals($newName, $data['name']); + $this->assertEquals(3, $data['occurrences']); + + $tags = $this->linkDB->linksCountPerTag(); + $this->assertNotTrue(isset($tags[$tagName])); + $this->assertEquals(3, $tags[$newName]); + } + + /** + * Test tag update with an empty new tag name => ApiBadParametersException + * + * @expectedException Shaarli\Api\Exceptions\ApiBadParametersException + * @expectedExceptionMessage New tag name is required in the request body + */ + public function testPutTagEmpty() + { + $tagName = 'gnu'; + $newName = ''; + + $tags = $this->linkDB->linksCountPerTag(); + $this->assertEquals(2, $tags[$tagName]); + + $env = Environment::mock([ + 'REQUEST_METHOD' => 'PUT', + ]); + $request = Request::createFromEnvironment($env); + + $env = Environment::mock([ + 'REQUEST_METHOD' => 'PUT', + ]); + $update = ['name' => $newName]; + $request = Request::createFromEnvironment($env); + $request = $request->withParsedBody($update); + + try { + $this->controller->putTag($request, new Response(), ['tagName' => $tagName]); + } catch (ApiBadParametersException $e) { + $tags = $this->linkDB->linksCountPerTag(); + $this->assertEquals(2, $tags[$tagName]); + throw $e; + } + } + + /** + * Test tag update on non existent tag => ApiTagNotFoundException. + * + * @expectedException Shaarli\Api\Exceptions\ApiTagNotFoundException + * @expectedExceptionMessage Tag not found + */ + public function testPutTag404() + { + $env = Environment::mock([ + 'REQUEST_METHOD' => 'PUT', + ]); + $request = Request::createFromEnvironment($env); + + $this->controller->putTag($request, new Response(), ['tagName' => 'nopenope']); + } +} -- cgit v1.2.3 From 067c2dd8f5f6eb6cc808ddc4bd30aec104caf73d Mon Sep 17 00:00:00 2001 From: VirtualTam Date: Sat, 13 Oct 2018 00:35:47 +0200 Subject: lint: apply phpcbf to tests/ Signed-off-by: VirtualTam --- tests/api/controllers/tags/PutTagTest.php | 1 - 1 file changed, 1 deletion(-) (limited to 'tests/api/controllers/tags/PutTagTest.php') diff --git a/tests/api/controllers/tags/PutTagTest.php b/tests/api/controllers/tags/PutTagTest.php index 6f7dec22..38017243 100644 --- a/tests/api/controllers/tags/PutTagTest.php +++ b/tests/api/controllers/tags/PutTagTest.php @@ -3,7 +3,6 @@ namespace Shaarli\Api\Controllers; - use Shaarli\Api\Exceptions\ApiBadParametersException; use Shaarli\Config\ConfigManager; use Slim\Container; -- cgit v1.2.3