From 30fde0d0ca44c3c7673384451adeb93eac655f16 Mon Sep 17 00:00:00 2001 From: Xheni Myrtaj Date: Fri, 31 May 2019 17:18:25 +0200 Subject: [PATCH] [FEATURE] Get the number of subscribers of list and added tests (#116) Closes #115 --- src/Controller/ListController.php | 16 ++++ .../Controller/AbstractControllerTest.php | 10 ++ .../Controller/Fixtures/SubscriberList.csv | 1 + .../Controller/ListControllerTest.php | 92 ++++++++++++++++++- 4 files changed, 118 insertions(+), 1 deletion(-) diff --git a/src/Controller/ListController.php b/src/Controller/ListController.php index f54006f..d73bb00 100644 --- a/src/Controller/ListController.php +++ b/src/Controller/ListController.php @@ -16,6 +16,7 @@ * This controller provides REST API access to subscriber lists. * * @author Oliver Klee + * @author Xheni Myrtaj */ class ListController extends FOSRestController implements ClassResourceInterface { @@ -96,4 +97,19 @@ public function getMembersAction(Request $request, SubscriberList $list): View return View::create()->setData($list->getSubscribers()); } + + /** + * Gets the total number of subscribers of a list. + * + * @param Request $request + * @param SubscriberList $list + * + * @return View + */ + public function getSubscribersCountAction(Request $request, SubscriberList $list): View + { + $this->requireAuthentication($request); + + return View::create()->setData(count($list->getSubscribers())); + } } diff --git a/tests/Integration/Controller/AbstractControllerTest.php b/tests/Integration/Controller/AbstractControllerTest.php index bcf3857..169ece2 100644 --- a/tests/Integration/Controller/AbstractControllerTest.php +++ b/tests/Integration/Controller/AbstractControllerTest.php @@ -102,6 +102,16 @@ protected function getDecodedJsonResponseContent(): array return json_decode($this->client->getResponse()->getContent(), true); } + /** + * Returns the response content as int. + * + * @return int + */ + protected function getResponseContentAsInt(): int + { + return json_decode($this->client->getResponse()->getContent(), true); + } + /** * Asserts that the (decoded) JSON response content is the same as the expected array. * diff --git a/tests/Integration/Controller/Fixtures/SubscriberList.csv b/tests/Integration/Controller/Fixtures/SubscriberList.csv index 0213ea1..59f6e18 100644 --- a/tests/Integration/Controller/Fixtures/SubscriberList.csv +++ b/tests/Integration/Controller/Fixtures/SubscriberList.csv @@ -1,3 +1,4 @@ id,name,description,entered,modified,listorder,prefix,active,category,owner 1,"News","News (and some fun stuff)","2016-06-22 15:01:17","2016-06-23 19:50:43",12,"phpList",1,"news",1 2,"More news","","2016-06-22 15:01:17","2016-06-23 19:50:43",12,"",1,"",1 +3,"Tech news","","2019-02-11 15:01:15","2019-02-11 19:50:43",12,"",1,"",1 diff --git a/tests/Integration/Controller/ListControllerTest.php b/tests/Integration/Controller/ListControllerTest.php index ff19769..4b449e4 100644 --- a/tests/Integration/Controller/ListControllerTest.php +++ b/tests/Integration/Controller/ListControllerTest.php @@ -10,6 +10,7 @@ * Testcase. * * @author Oliver Klee + * @author Xheni Myrtaj */ class ListControllerTest extends AbstractControllerTest { @@ -107,7 +108,17 @@ public function getListsWithCurrentSessionKeyReturnsListData() 'public' => true, 'category' => '', 'id' => 2, - ] + ], + [ + 'name' => 'Tech news', + 'description' => '', + 'creation_date' => '2019-02-11T15:01:15+00:00', + 'list_position' => 12, + 'subject_prefix' => '', + 'public' => true, + 'category' => '', + 'id' => 3, + ], ] ); } @@ -320,4 +331,83 @@ public function getListMembersWithCurrentSessionKeyForExistingListWithSubscriber ] ); } + + /** + * @test + */ + public function getListSubscribersCountForExistingListWithoutSessionKeyReturnsForbiddenStatus() + { + $this->getDataSet()->addTable(static::LISTS_TABLE_NAME, __DIR__ . '/Fixtures/SubscriberList.csv'); + $this->applyDatabaseChanges(); + + $this->client->request('get', '/api/v2/lists/1/subscribers/count'); + + $this->assertHttpForbidden(); + } + + /** + * @test + */ + public function getListSubscribersCountForExistingListWithExpiredSessionKeyReturnsForbiddenStatus() + { + $this->getDataSet()->addTable(static::LISTS_TABLE_NAME, __DIR__ . '/Fixtures/SubscriberList.csv'); + $this->getDataSet()->addTable(static::ADMINISTRATOR_TABLE_NAME, __DIR__ . '/Fixtures/Administrator.csv'); + $this->getDataSet()->addTable(static::TOKEN_TABLE_NAME, __DIR__ . '/Fixtures/AdministratorToken.csv'); + $this->applyDatabaseChanges(); + + $this->client->request( + 'get', + '/api/v2/lists/1/subscribers/count', + [], + [], + ['PHP_AUTH_USER' => 'unused', 'PHP_AUTH_PW' => 'cfdf64eecbbf336628b0f3071adba763'] + ); + + $this->assertHttpForbidden(); + } + + /** + * @test + */ + public function getListSubscribersCountWithCurrentSessionKeyForExistingListReturnsOkayStatus() + { + $this->getDataSet()->addTable(static::LISTS_TABLE_NAME, __DIR__ . '/Fixtures/SubscriberList.csv'); + $this->applyDatabaseChanges(); + + $this->authenticatedJsonRequest('get', '/api/v2/lists/1/subscribers/count'); + + $this->assertHttpOkay(); + } + + /** + * @test + */ + public function getListSubscribersCountWithCurrentSessionKeyForExistingListWithNoSubscribersReturnsZero() + { + $this->getDataSet()->addTable(static::LISTS_TABLE_NAME, __DIR__ . '/Fixtures/SubscriberList.csv'); + $this->getDataSet()->addTable(static::SUBSCRIBER_TABLE_NAME, __DIR__ . '/Fixtures/Subscriber.csv'); + $this->getDataSet()->addTable(static::SUBSCRIPTION_TABLE_NAME, __DIR__ . '/Fixtures/Subscription.csv'); + $this->applyDatabaseChanges(); + + $this->authenticatedJsonRequest('get', '/api/v2/lists/3/subscribers/count'); + $responseContent = $this->getResponseContentAsInt(); + + static::assertSame(0, $responseContent); + } + + /** + * @test + */ + public function getListSubscribersCountWithCurrentSessionKeyForExistingListWithSubscribersReturnsSubscribersCount() + { + $this->getDataSet()->addTable(static::LISTS_TABLE_NAME, __DIR__ . '/Fixtures/SubscriberList.csv'); + $this->getDataSet()->addTable(static::SUBSCRIBER_TABLE_NAME, __DIR__ . '/Fixtures/Subscriber.csv'); + $this->getDataSet()->addTable(static::SUBSCRIPTION_TABLE_NAME, __DIR__ . '/Fixtures/Subscription.csv'); + $this->applyDatabaseChanges(); + + $this->authenticatedJsonRequest('get', '/api/v2/lists/2/subscribers/count'); + $responseContent = $this->getResponseContentAsInt(); + + static::assertSame(1, $responseContent); + } }