From 782c31ccdc6f332cac750997181a3d12cf3e178f Mon Sep 17 00:00:00 2001 From: Meritoo Date: Fri, 27 Oct 2017 11:58:17 +0200 Subject: [PATCH] Fetch all participants of survey (instead of first 10 only - default behaviour) --- src/Common/Collection/Collection.php | 2 + .../MissingSurveySummaryException.php | 33 ++ .../Result/Collection/SurveysSummaries.php | 118 ++++++ src/LimeSurvey/Result/Item/SurveySummary.php | 198 ++++++++++ .../Result/Processor/ResultProcessor.php | 5 + src/LimeSurvey/Service/ParticipantService.php | 128 ------- src/LimeSurvey/Service/SurveyService.php | 232 +++++++++++- src/LimeSurvey/Type/MethodType.php | 7 + .../MissingSurveySummaryExceptionTest.php | 73 ++++ .../Collection/SurveysSummariesTest.php | 194 ++++++++++ tests/Result/Item/SurveySummaryTest.php | 138 +++++++ tests/Service/ParticipantServiceTest.php | 251 ++++--------- tests/Service/SurveyServiceTest.php | 355 +++++++++++++++++- tests/Type/MethodTypeTest.php | 1 + 14 files changed, 1420 insertions(+), 315 deletions(-) create mode 100644 src/LimeSurvey/Exception/MissingSurveySummaryException.php create mode 100644 src/LimeSurvey/Result/Collection/SurveysSummaries.php create mode 100644 src/LimeSurvey/Result/Item/SurveySummary.php create mode 100644 tests/Exception/MissingSurveySummaryExceptionTest.php create mode 100644 tests/Result/Collection/SurveysSummariesTest.php create mode 100644 tests/Result/Item/SurveySummaryTest.php diff --git a/src/Common/Collection/Collection.php b/src/Common/Collection/Collection.php index 75770c2..8d8818b 100644 --- a/src/Common/Collection/Collection.php +++ b/src/Common/Collection/Collection.php @@ -23,6 +23,8 @@ use Meritoo\Common\Utilities\Arrays; */ class Collection implements Countable, ArrayAccess, IteratorAggregate { + const className = 'Meritoo\Common\Collection\Collection'; + /** * The elements of collection * diff --git a/src/LimeSurvey/Exception/MissingSurveySummaryException.php b/src/LimeSurvey/Exception/MissingSurveySummaryException.php new file mode 100644 index 0000000..a8b40f8 --- /dev/null +++ b/src/LimeSurvey/Exception/MissingSurveySummaryException.php @@ -0,0 +1,33 @@ + + * @copyright Meritoo.pl + */ +class MissingSurveySummaryException extends \Exception +{ + const className = 'Meritoo\LimeSurvey\ApiClient\Exception\MissingSurveySummaryException'; + + /** + * Class constructor + * + * @param int $surveyId ID of survey + */ + public function __construct($surveyId) + { + $template = 'Summary of survey with ID %d is missing. Does the survey exist?'; + $message = sprintf($template, $surveyId); + + parent::__construct($message); + } +} diff --git a/src/LimeSurvey/Result/Collection/SurveysSummaries.php b/src/LimeSurvey/Result/Collection/SurveysSummaries.php new file mode 100644 index 0000000..c14b9aa --- /dev/null +++ b/src/LimeSurvey/Result/Collection/SurveysSummaries.php @@ -0,0 +1,118 @@ + + * @copyright Meritoo.pl + */ +class SurveysSummaries extends Collection +{ + const className = 'Meritoo\LimeSurvey\ApiClient\Result\Collection\SurveysSummaries'; + + /** + * {@inheritdoc} + */ + public function add($element, $index = null) + { + throw new DisabledMethodException(__METHOD__, 'addSurveySummary'); + } + + /** + * {@inheritdoc} + */ + public function addMultiple($elements, $useIndexes = false) + { + throw new DisabledMethodException(__METHOD__, 'addSurveysSummaries'); + } + + /** + * {@inheritdoc} + */ + public function has($element) + { + throw new DisabledMethodException(__METHOD__, 'hasSurveySummary'); + } + + /** + * Adds survey's summary + * + * @param SurveySummary $summary Survey's summary + * @param int $surveyId ID of survey + * @return $this + */ + public function addSurveySummary(SurveySummary $summary, $surveyId) + { + $this[$surveyId] = $summary; + + return $this; + } + + /** + * Adds surveys' summaries + * + * @param array $summaries Surveys' summaries to add + * @return $this + */ + public function addSurveysSummaries(array $summaries) + { + /* + * No summaries? + * Nothing to do + */ + if (empty($summaries)) { + return $this; + } + + foreach ($summaries as $surveyId => $summary) { + $this->addSurveySummary($summary, $surveyId); + } + + return $this; + } + + /** + * Returns information if there is summary of survey with given ID + * + * @param int $surveyId ID of survey + * @return bool + */ + public function hasSurveySummary($surveyId) + { + /* + * There are no surveys' summaries or there is no summary of survey with given ID? + */ + if ($this->isEmpty() || !isset($this[$surveyId])) { + return false; + } + + return true; + } + + /** + * Returns summary of survey with given ID + * + * @param int $surveyId ID of survey + * @return SurveySummary|null + */ + public function getSurveySummary($surveyId) + { + if ($this->hasSurveySummary($surveyId)) { + return $this[$surveyId]; + } + + return null; + } +} diff --git a/src/LimeSurvey/Result/Item/SurveySummary.php b/src/LimeSurvey/Result/Item/SurveySummary.php new file mode 100644 index 0000000..e2367c0 --- /dev/null +++ b/src/LimeSurvey/Result/Item/SurveySummary.php @@ -0,0 +1,198 @@ + + * @copyright Meritoo.pl + */ +class SurveySummary extends BaseItem +{ + const className = 'Meritoo\LimeSurvey\ApiClient\Result\Item\SurveySummary'; + + /** + * Count/Amount of tokens + * + * @var int + */ + private $tokenCount; + + /** + * Count/Amount of invalid tokens + * + * @var int + */ + private $tokenInvalidCount; + + /** + * Count/Amount of sent tokens + * + * @var int + */ + private $tokenSentCount; + + /** + * Count/Amount of opted out tokens + * + * @var int + */ + private $tokenOptedOutCount; + + /** + * Count/Amount of completed tokens + * + * @var int + */ + private $tokenCompletedCount; + + /** + * Count/Amount of complete responses + * + * @var int + */ + private $completeResponsesCount; + + /** + * Count/Amount of incomplete responses + * + * @var int + */ + private $incompleteResponsesCount; + + /** + * Count/Amount of full responses + * + * @var int + */ + private $fullResponsesCount; + + /** + * {@inheritdoc} + */ + public function setValue($property, $value) + { + switch ($property) { + case 'token_count': + $this->tokenCount = (int)$value; + break; + + case 'token_invalid': + $this->tokenInvalidCount = (int)$value; + break; + + case 'token_sent': + $this->tokenSentCount = (int)$value; + break; + + case 'token_opted_out': + $this->tokenOptedOutCount = (int)$value; + break; + + case 'token_completed': + $this->tokenCompletedCount = (int)$value; + break; + + case 'completed_responses': + $this->completeResponsesCount = (int)$value; + break; + + case 'incomplete_responses': + $this->incompleteResponsesCount = (int)$value; + break; + + case 'full_responses': + $this->fullResponsesCount = (int)$value; + break; + } + } + + /** + * Returns count/amount of tokens + * + * @return int + */ + public function getTokenCount() + { + return $this->tokenCount; + } + + /** + * Returns count/amount of invalid tokens + * + * @return int + */ + public function getTokenInvalidCount() + { + return $this->tokenInvalidCount; + } + + /** + * Returns count/amount of sent tokens + * + * @return int + */ + public function getTokenSentCount() + { + return $this->tokenSentCount; + } + + /** + * Returns count/amount of opted out tokens + * + * @return int + */ + public function getTokenOptedOutCount() + { + return $this->tokenOptedOutCount; + } + + /** + * Returns count/amount of completed tokens + * + * @return int + */ + public function getTokenCompletedCount() + { + return $this->tokenCompletedCount; + } + + /** + * Returns count/amount of complete responses + * + * @return int + */ + public function getCompleteResponsesCount() + { + return $this->completeResponsesCount; + } + + /** + * Returns count/amount of incomplete responses + * + * @return int + */ + public function getIncompleteResponsesCount() + { + return $this->incompleteResponsesCount; + } + + /** + * Returns count/amount of full responses + * + * @return int + */ + public function getFullResponsesCount() + { + return $this->fullResponsesCount; + } +} diff --git a/src/LimeSurvey/Result/Processor/ResultProcessor.php b/src/LimeSurvey/Result/Processor/ResultProcessor.php index 7a082f6..50af62c 100644 --- a/src/LimeSurvey/Result/Processor/ResultProcessor.php +++ b/src/LimeSurvey/Result/Processor/ResultProcessor.php @@ -17,6 +17,7 @@ use Meritoo\LimeSurvey\ApiClient\Result\Item\ParticipantShort; use Meritoo\LimeSurvey\ApiClient\Result\Item\Question; use Meritoo\LimeSurvey\ApiClient\Result\Item\QuestionShort; use Meritoo\LimeSurvey\ApiClient\Result\Item\Survey; +use Meritoo\LimeSurvey\ApiClient\Result\Item\SurveySummary; use Meritoo\LimeSurvey\ApiClient\Type\MethodType; /** @@ -97,6 +98,10 @@ class ResultProcessor $className = Question::className; break; + case MethodType::GET_SUMMARY: + $className = SurveySummary::className; + break; + case MethodType::LIST_PARTICIPANTS: $className = ParticipantShort::className; break; diff --git a/src/LimeSurvey/Service/ParticipantService.php b/src/LimeSurvey/Service/ParticipantService.php index 0bd3a1b..a250de9 100644 --- a/src/LimeSurvey/Service/ParticipantService.php +++ b/src/LimeSurvey/Service/ParticipantService.php @@ -8,14 +8,12 @@ namespace Meritoo\LimeSurvey\ApiClient\Service; -use Meritoo\Common\Collection\Collection; use Meritoo\LimeSurvey\ApiClient\Client\Client; use Meritoo\LimeSurvey\ApiClient\Exception\CannotProcessDataException; use Meritoo\LimeSurvey\ApiClient\Exception\MissingParticipantOfSurveyException; use Meritoo\LimeSurvey\ApiClient\Result\Collection\Participants; use Meritoo\LimeSurvey\ApiClient\Result\Collection\ParticipantsDetails; use Meritoo\LimeSurvey\ApiClient\Result\Item\Participant; -use Meritoo\LimeSurvey\ApiClient\Result\Item\ParticipantShort; use Meritoo\LimeSurvey\ApiClient\Type\MethodType; use Meritoo\LimeSurvey\ApiClient\Type\ReasonType; @@ -36,14 +34,6 @@ class ParticipantService */ private $client; - /** - * Collection of participants' short data. - * All participants grouped per survey. - * - * @var Participants - */ - private $allParticipants; - /** * Collection of participants' full data. * All participants grouped per survey. @@ -56,26 +46,18 @@ class ParticipantService * Class constructor * * @param Client $client Client of the LimeSurvey's API - * @param Participants $allParticipants (optional) Collection of participants' short data. All participants - * grouped per survey. * @param ParticipantsDetails $participantsDetails (optional) Collection of participants' full data. All * participants grouped per survey. */ public function __construct( Client $client, - Participants $allParticipants = null, ParticipantsDetails $participantsDetails = null ) { - if (null === $allParticipants) { - $allParticipants = new Participants(); - } - if (null === $participantsDetails) { $participantsDetails = new ParticipantsDetails(); } $this->client = $client; - $this->allParticipants = $allParticipants; $this->participantsDetails = $participantsDetails; } @@ -89,51 +71,6 @@ class ParticipantService return $this->client; } - /** - * Returns participants of given survey - * - * @param int $surveyId ID of survey - * @return Collection - * - * @throws CannotProcessDataException - */ - public function getSurveyParticipants($surveyId) - { - $hasSurvey = $this - ->allParticipants - ->hasParticipantsOfSurvey($surveyId); - - if (!$hasSurvey) { - $arguments = [ - $surveyId, - ]; - - try { - $participants = $this - ->client - ->run(MethodType::LIST_PARTICIPANTS, $arguments) - ->getData(); - } catch (CannotProcessDataException $exception) { - /* - * Oops, something is broken, because the reason is different than "there are no participants" - */ - if (ReasonType::NO_PARTICIPANTS_FOUND !== $exception->getReason()) { - throw $exception; - } - - $participants = new Collection(); - } - - $this - ->allParticipants - ->addParticipants($participants, $surveyId); - } - - return $this - ->allParticipants - ->getBySurvey($surveyId); - } - /** * Returns information if given survey has participant with given e-mail * @@ -146,71 +83,6 @@ class ParticipantService return null !== $this->getParticipantDetails($surveyId, $email); } - /** - * Adds participant with given data to survey with given ID - * - * @param int $surveyId ID of survey - * @param string $firstName First name of the participant to add - * @param string $lastName Last ame of the participant to add - * @param string $email E-mail address of the participant to add - * @return Participant - */ - public function addParticipant($surveyId, $firstName, $lastName, $email) - { - $participantsData = [ - [ - 'firstname' => $firstName, - 'lastname' => $lastName, - 'email' => $email, - ], - ]; - - $arguments = [ - $surveyId, - $participantsData, - ]; - - $participantCollection = $this - ->client - ->run(MethodType::ADD_PARTICIPANTS, $arguments) - ->getData(); - - /* @var Participant $addedParticipant */ - $addedParticipant = $participantCollection->getFirst(); - - $participants = new Collection([ - ParticipantShort::fromParticipant($addedParticipant), - ]); - - $this - ->allParticipants - ->addParticipants($participants, $surveyId); - - return $participantCollection->getFirst(); - } - - /** - * Returns short data of one participant with given e-mail (participant of given survey) - * - * @param int $surveyId ID of survey - * @param string $email E-mail address of the participant - * @return ParticipantShort|null - */ - public function getParticipant($surveyId, $email) - { - /* - * I have to get all participants of survey to avoid problem when participants exist but are not loaded - */ - $this->getSurveyParticipants($surveyId); - - $participant = $this - ->allParticipants - ->getParticipantOfSurvey($surveyId, $email); - - /* @var ParticipantShort $participant */ - return $participant; - } - /** * Returns full data of participant with given e-mail (participant of given survey) * diff --git a/src/LimeSurvey/Service/SurveyService.php b/src/LimeSurvey/Service/SurveyService.php index 51c3429..58c0db0 100644 --- a/src/LimeSurvey/Service/SurveyService.php +++ b/src/LimeSurvey/Service/SurveyService.php @@ -11,14 +11,19 @@ namespace Meritoo\LimeSurvey\ApiClient\Service; use Meritoo\Common\Collection\Collection; use Meritoo\LimeSurvey\ApiClient\Client\Client; use Meritoo\LimeSurvey\ApiClient\Exception\CannotProcessDataException; +use Meritoo\LimeSurvey\ApiClient\Exception\MissingSurveySummaryException; +use Meritoo\LimeSurvey\ApiClient\Result\Collection\Participants; use Meritoo\LimeSurvey\ApiClient\Result\Collection\Surveys; +use Meritoo\LimeSurvey\ApiClient\Result\Collection\SurveysSummaries; use Meritoo\LimeSurvey\ApiClient\Result\Item\Participant; +use Meritoo\LimeSurvey\ApiClient\Result\Item\ParticipantShort; use Meritoo\LimeSurvey\ApiClient\Result\Item\Survey; +use Meritoo\LimeSurvey\ApiClient\Result\Item\SurveySummary; use Meritoo\LimeSurvey\ApiClient\Type\MethodType; use Meritoo\LimeSurvey\ApiClient\Type\ReasonType; /** - * Service that serves surveys + * Service that serves surveys and participants of surveys * * @author Krzysztof Niziol * @copyright Meritoo.pl @@ -42,6 +47,21 @@ class SurveyService */ private $allSurveys; + /** + * Collection of participants' short data. + * All participants grouped per survey. + * + * @var Participants + */ + private $allParticipants; + + /** + * Collection of surveys' summaries (the SurveySummary class instances) + * + * @var SurveysSummaries + */ + private $surveySummaries; + /** * Template of the url used to start survey * @@ -58,17 +78,36 @@ class SurveyService /** * Class constructor * - * @param Client $client Client of the LimeSurvey's API - * @param Surveys $allSurveys (optional) All surveys. Collection of surveys (the Survey class instances). + * @param Client $client Client of the LimeSurvey's API + * @param Surveys $allSurveys (optional) All surveys. Collection of surveys (the Survey class + * instances). + * @param Participants $allParticipants (optional) Collection of participants' short data. All participants + * grouped per survey. + * @param SurveysSummaries $surveysSummaries (optional) Collection of surveys' summaries (the SurveySummary class + * instances) */ - public function __construct(Client $client, Surveys $allSurveys = null) - { + public function __construct( + Client $client, + Surveys $allSurveys = null, + Participants $allParticipants = null, + SurveysSummaries $surveysSummaries = null + ) { if (null === $allSurveys) { $allSurveys = new Surveys(); } + if (null === $allParticipants) { + $allParticipants = new Participants(); + } + + if (null === $surveysSummaries) { + $surveysSummaries = new SurveysSummaries(); + } + $this->client = $client; $this->allSurveys = $allSurveys; + $this->allParticipants = $allParticipants; + $this->surveySummaries = $surveysSummaries; } /** @@ -84,7 +123,8 @@ class SurveyService /** * Returns all surveys * - * @param bool $onlyActive (optional) If is set to true, active surveys are returned only. Otherwise - all. + * @param bool $onlyActive (optional) If is set to true, active surveys are returned only. Otherwise - all (default + * behaviour). * @return Surveys * * @throws CannotProcessDataException @@ -124,7 +164,7 @@ class SurveyService * * @param int $surveyId ID of survey to verify * @param bool $shouldBeActive (optional) If is set to true, survey should be active. If it's not, it shouldn't - * be returned, even if exists. Otherwise - it doesn't matter. + * be returned, even if exists. Otherwise - it doesn't matter (default behaviour). * @return bool */ public function isExistingSurvey($surveyId, $shouldBeActive = false) @@ -167,4 +207,182 @@ class SurveyService return sprintf($this->startSurveyUrlTemplate, $baseUrl, $surveyId, $participant->getToken()); } + + /** + * Returns participants of given survey + * + * @param int $surveyId ID of survey + * @param bool $onlyCompleted (optional) If is set to true, participants who completed survey are returned only. + * Otherwise - all (default behaviour). + * @return Collection + * + * @throws CannotProcessDataException + */ + public function getSurveyParticipants($surveyId, $onlyCompleted = false) + { + $hasSurvey = $this + ->allParticipants + ->hasParticipantsOfSurvey($surveyId); + + if (!$hasSurvey) { + $offset = 0; + $limit = $this->getSurveyTokenCount($surveyId); + $includeUnused = !$onlyCompleted; + + $arguments = [ + $surveyId, + $offset, + $limit, + $includeUnused, + ]; + + try { + $participants = $this + ->client + ->run(MethodType::LIST_PARTICIPANTS, $arguments) + ->getData(); + } catch (CannotProcessDataException $exception) { + /* + * Oops, something is broken, because the reason is different than "there are no participants" + */ + if (ReasonType::NO_PARTICIPANTS_FOUND !== $exception->getReason()) { + throw $exception; + } + + $participants = new Collection(); + } + + $this + ->allParticipants + ->addParticipants($participants, $surveyId); + } + + return $this + ->allParticipants + ->getBySurvey($surveyId); + } + + /** + * Adds participant with given data to survey with given ID + * + * @param int $surveyId ID of survey + * @param string $firstName First name of the participant to add + * @param string $lastName Last ame of the participant to add + * @param string $email E-mail address of the participant to add + * @return Participant + */ + public function addParticipant($surveyId, $firstName, $lastName, $email) + { + $participantsData = [ + [ + 'firstname' => $firstName, + 'lastname' => $lastName, + 'email' => $email, + ], + ]; + + $arguments = [ + $surveyId, + $participantsData, + ]; + + $participantCollection = $this + ->client + ->run(MethodType::ADD_PARTICIPANTS, $arguments) + ->getData(); + + /* @var Participant $addedParticipant */ + $addedParticipant = $participantCollection->getFirst(); + + $participants = new Collection([ + ParticipantShort::fromParticipant($addedParticipant), + ]); + + $this + ->allParticipants + ->addParticipants($participants, $surveyId); + + return $participantCollection->getFirst(); + } + + /** + * Returns short data of one participant with given e-mail (participant of given survey) + * + * @param int $surveyId ID of survey + * @param string $email E-mail address of the participant + * @return ParticipantShort|null + */ + public function getParticipant($surveyId, $email) + { + /* + * I have to get all participants of survey to avoid problem when participants exist but are not loaded + */ + $this->getSurveyParticipants($surveyId); + + $participant = $this + ->allParticipants + ->getParticipantOfSurvey($surveyId, $email); + + /* @var ParticipantShort $participant */ + return $participant; + } + + /** + * Returns count/amount of tokens of survey with given ID + * + * @param int $surveyId ID of survey + * @return int + * + * @throws MissingSurveySummaryException + */ + public function getSurveyTokenCount($surveyId) + { + $surveySummary = $this + ->surveySummaries + ->getSurveySummary($surveyId); + + /* + * Unknown survey's summary? + * Let's fetch it + */ + if (null === $surveySummary) { + $surveySummary = $this->getSurveySummary($surveyId); + } + + /* + * Oops, survey's summary is missing + */ + if (null === $surveySummary) { + throw new MissingSurveySummaryException($surveyId); + } + + return $surveySummary->getTokenCount(); + } + + /** + * Returns summary of survey with given ID + * + * @param int $surveyId ID of survey + * @return SurveySummary|null + */ + private function getSurveySummary($surveyId) + { + $arguments = [ + $surveyId, + ]; + + /* @var SurveySummary $surveySummary */ + $surveySummary = $this + ->client + ->run(MethodType::GET_SUMMARY, $arguments) + ->getData(); + + if (null !== $surveySummary) { + $this + ->surveySummaries + ->addSurveySummary($surveySummary, $surveyId); + } + + return $surveySummary; + } } diff --git a/src/LimeSurvey/Type/MethodType.php b/src/LimeSurvey/Type/MethodType.php index aba402b..57bf07a 100644 --- a/src/LimeSurvey/Type/MethodType.php +++ b/src/LimeSurvey/Type/MethodType.php @@ -60,6 +60,13 @@ class MethodType extends BaseType */ const GET_QUESTION_PROPERTIES = 'get_question_properties'; + /** + * Get survey summary, regarding token usage and survey participation + * + * @var string + */ + const GET_SUMMARY = 'get_summary'; + /** * Return the IDs and properties of token/participants of a survey * diff --git a/tests/Exception/MissingSurveySummaryExceptionTest.php b/tests/Exception/MissingSurveySummaryExceptionTest.php new file mode 100644 index 0000000..01288bc --- /dev/null +++ b/tests/Exception/MissingSurveySummaryExceptionTest.php @@ -0,0 +1,73 @@ + + * @copyright Meritoo.pl + */ +class MissingSurveySummaryExceptionTest extends BaseTestCase +{ + public function testConstructorVisibilityAndArguments() + { + static::assertConstructorVisibilityAndArguments(MissingSurveySummaryException::className, OopVisibilityType::IS_PUBLIC, 1, 1); + } + + /** + * @param int $surveyId ID of survey + * @param string $expectedMessage Expected exception's message + * + * @dataProvider provideSurveyId + */ + public function testConstructorMessage($surveyId, $expectedMessage) + { + $exception = new MissingSurveySummaryException($surveyId); + static::assertEquals($expectedMessage, $exception->getMessage()); + } + + /** + * Provides ID of survey + * + * @return array + * //return Generator + */ + public function provideSurveyId() + { + $template = 'Summary of survey with ID %d is missing. Does the survey exist?'; + + return [ + [ + 1, + sprintf($template, 1), + ], + [ + '123', + sprintf($template, '123'), + ], + ]; + + /* + yield[ + 1, + sprintf($template, 1), + ]; + + yield[ + '123', + sprintf($template, '123'), + ]; + */ + } +} diff --git a/tests/Result/Collection/SurveysSummariesTest.php b/tests/Result/Collection/SurveysSummariesTest.php new file mode 100644 index 0000000..ca722e3 --- /dev/null +++ b/tests/Result/Collection/SurveysSummariesTest.php @@ -0,0 +1,194 @@ + + * @copyright Meritoo.pl + */ +class SurveysSummariesTest extends BaseTestCase +{ + /** + * Empty collection of surveys' summaries + * + * @var SurveysSummaries + */ + private $emptySurveysSummaries; + + /** + * Non-empty collection of surveys' summaries + * + * @var SurveysSummaries + */ + private $nonEmptySurveysSummaries; + + public function testConstructorVisibilityAndArguments() + { + static::assertConstructorVisibilityAndArguments(SurveysSummaries::className, OopVisibilityType::IS_PUBLIC, 1, 0); + } + + public function testAdd() + { + $this->setExpectedException(DisabledMethodException::className); + (new SurveysSummaries())->add(''); + } + + public function testAddMultiple() + { + $this->setExpectedException(DisabledMethodException::className); + (new SurveysSummaries())->addMultiple([]); + } + + public function testHas() + { + $this->setExpectedException(DisabledMethodException::className); + (new SurveysSummaries())->has(new SurveySummary()); + } + + /** + * @param array $summaries Surveys' summaries to add + * @dataProvider provideSurveysSummaries + */ + public function testAddSurveysSummaries(array $summaries) + { + $existingSummariesCount = $this->nonEmptySurveysSummaries->count(); + + $this->emptySurveysSummaries->addSurveysSummaries($summaries); + $this->nonEmptySurveysSummaries->addSurveysSummaries($summaries); + + static::assertCount(count($summaries), $this->emptySurveysSummaries); + static::assertCount(count($summaries) + $existingSummariesCount, $this->nonEmptySurveysSummaries); + } + + public function testHasSurveySummaryUsingNonExistingSurvey() + { + static::assertFalse($this->emptySurveysSummaries->hasSurveySummary(1)); + static::assertFalse($this->emptySurveysSummaries->hasSurveySummary(2)); + + static::assertFalse($this->nonEmptySurveysSummaries->hasSurveySummary(3)); + static::assertFalse($this->nonEmptySurveysSummaries->hasSurveySummary(4)); + } + + public function testHasSurveySummaryUsingExistingSurvey() + { + static::assertTrue($this->nonEmptySurveysSummaries->hasSurveySummary(1)); + static::assertTrue($this->nonEmptySurveysSummaries->hasSurveySummary(2)); + } + + public function testGetSurveySummaryUsingNonExistingSurvey() + { + static::assertNull($this->emptySurveysSummaries->getSurveySummary(1)); + static::assertNull($this->emptySurveysSummaries->getSurveySummary(2)); + + static::assertNull($this->nonEmptySurveysSummaries->getSurveySummary(3)); + static::assertNull($this->nonEmptySurveysSummaries->getSurveySummary(4)); + } + + public function testGetSurveySummaryUsingExistingSurvey() + { + $surveySummary1 = $this->nonEmptySurveysSummaries->getSurveySummary(1); + $surveySummary2 = $this->nonEmptySurveysSummaries->getSurveySummary(2); + + static::assertInstanceOf(SurveySummary::className, $surveySummary1); + static::assertInstanceOf(SurveySummary::className, $surveySummary2); + + static::assertEquals(0, $surveySummary1->getTokenCount()); + static::assertEquals(5, $surveySummary2->getTokenCount()); + + static::assertEquals(0, $surveySummary1->getFullResponsesCount()); + static::assertEquals(3, $surveySummary2->getFullResponsesCount()); + } + + /** + * Provides surveys' summaries + * + * @return array + * //return Generator + */ + public function provideSurveysSummaries() + { + return [ + [ + [], + ], + [ + [ + 123 => new SurveySummary(), + ], + ], + [ + [ + 100 => new SurveySummary(), + 500 => new SurveySummary(), + 800 => new SurveySummary(), + ], + ], + ]; + + /* + yield[ + [], + ]; + + yield[ + [ + 123 => new SurveySummary(), + ], + ]; + + yield[ + [ + 100 => new SurveySummary(), + 500 => new SurveySummary(), + 800 => new SurveySummary(), + ], + ]; + */ + } + + /** + * {@inheritdoc} + */ + protected function setUp() + { + parent::setUp(); + $this->emptySurveysSummaries = new SurveysSummaries(); + + $this->nonEmptySurveysSummaries = new SurveysSummaries([ + 1 => new SurveySummary([ + 'token_count' => '0', + 'token_invalid' => '0', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '0', + 'completed_responses' => '0', + 'incomplete_responses' => '0', + 'full_responses' => '0', + ]), + 2 => new SurveySummary([ + 'token_count' => '5', + 'token_invalid' => '2', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '2', + 'completed_responses' => '1', + 'incomplete_responses' => '2', + 'full_responses' => '3', + ]), + ]); + } +} diff --git a/tests/Result/Item/SurveySummaryTest.php b/tests/Result/Item/SurveySummaryTest.php new file mode 100644 index 0000000..4035cf9 --- /dev/null +++ b/tests/Result/Item/SurveySummaryTest.php @@ -0,0 +1,138 @@ + + * @copyright Meritoo.pl + */ +class SurveySummaryTest extends BaseTestCase +{ + public function testConstructorVisibilityAndArguments() + { + static::assertConstructorVisibilityAndArguments(SurveySummary::className, OopVisibilityType::IS_PUBLIC, 1, 0); + } + + /** + * @param array $rawData Raw data of survey's summary + * @dataProvider provideRawData + */ + public function testCreateOfTheSurveySummary(array $rawData) + { + $processor = new ResultProcessor(); + $processed = $processor->process(MethodType::GET_SUMMARY, $rawData); + + /* @var SurveySummary $processed */ + static::assertEquals($rawData['token_count'], $processed->getTokenCount()); + static::assertEquals($rawData['token_invalid'], $processed->getTokenInvalidCount()); + static::assertEquals($rawData['token_sent'], $processed->getTokenSentCount()); + static::assertEquals($rawData['token_opted_out'], $processed->getTokenOptedOutCount()); + static::assertEquals($rawData['token_completed'], $processed->getTokenCompletedCount()); + static::assertEquals($rawData['completed_responses'], $processed->getCompleteResponsesCount()); + static::assertEquals($rawData['incomplete_responses'], $processed->getIncompleteResponsesCount()); + static::assertEquals($rawData['full_responses'], $processed->getFullResponsesCount()); + } + + /** + * Provides raw data of survey's summary + * + * @return array + * //return Generator + */ + public function provideRawData() + { + return [ + [ + [ + 'token_count' => '0', + 'token_invalid' => '0', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '0', + 'completed_responses' => '0', + 'incomplete_responses' => '0', + 'full_responses' => '0', + ], + ], + [ + [ + 'token_count' => '28', + 'token_invalid' => '0', + 'token_sent' => '5', + 'token_opted_out' => '0', + 'token_completed' => '6', + 'completed_responses' => '6', + 'incomplete_responses' => '10', + 'full_responses' => '16', + ], + ], + [ + [ + 'token_count' => '28', + 'token_invalid' => '0', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '2', + 'completed_responses' => '2', + 'incomplete_responses' => '12', + 'full_responses' => '14', + ], + ], + ]; + + /* + yield[ + [ + 'token_count' => '0', + 'token_invalid' => '0', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '0', + 'completed_responses' => '0', + 'incomplete_responses' => '0', + 'full_responses' => '0', + ], + ]; + + yield[ + [ + 'token_count' => '28', + 'token_invalid' => '0', + 'token_sent' => '5', + 'token_opted_out' => '0', + 'token_completed' => '6', + 'completed_responses' => '6', + 'incomplete_responses' => '10', + 'full_responses' => '16', + ], + ]; + + yield[ + [ + 'token_count' => '28', + 'token_invalid' => '0', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '2', + 'completed_responses' => '2', + 'incomplete_responses' => '12', + 'full_responses' => '14', + ], + ]; + */ + } +} diff --git a/tests/Service/ParticipantServiceTest.php b/tests/Service/ParticipantServiceTest.php index 6bf70b1..cfe969c 100644 --- a/tests/Service/ParticipantServiceTest.php +++ b/tests/Service/ParticipantServiceTest.php @@ -19,9 +19,8 @@ use Meritoo\LimeSurvey\ApiClient\Exception\CannotProcessDataException; use Meritoo\LimeSurvey\ApiClient\Exception\MissingParticipantOfSurveyException; use Meritoo\LimeSurvey\ApiClient\Manager\JsonRpcClientManager; use Meritoo\LimeSurvey\ApiClient\Manager\SessionManager; -use Meritoo\LimeSurvey\ApiClient\Result\Collection\Participants; +use Meritoo\LimeSurvey\ApiClient\Result\Collection\ParticipantsDetails; use Meritoo\LimeSurvey\ApiClient\Result\Item\Participant; -use Meritoo\LimeSurvey\ApiClient\Result\Item\ParticipantShort; use Meritoo\LimeSurvey\ApiClient\Service\ParticipantService; use Meritoo\LimeSurvey\ApiClient\Type\ReasonType; use PHPUnit_Framework_MockObject_MockObject; @@ -34,6 +33,13 @@ use PHPUnit_Framework_MockObject_MockObject; */ class ParticipantServiceTest extends BaseTestCase { + /** + * Raw data of participants + * + * @var array + */ + private $participantsRawData; + /** * Service that serves participants. * Without participants. @@ -52,7 +58,7 @@ class ParticipantServiceTest extends BaseTestCase public function testConstructorVisibilityAndArguments() { - static::assertConstructorVisibilityAndArguments(ParticipantService::className, OopVisibilityType::IS_PUBLIC, 3, 1); + static::assertConstructorVisibilityAndArguments(ParticipantService::className, OopVisibilityType::IS_PUBLIC, 2, 1); } public function testGetClient() @@ -73,45 +79,6 @@ class ParticipantServiceTest extends BaseTestCase static::assertEquals($client, $participantService->getClient()); } - public function testGetSurveyParticipants() - { - $rpcClientManager = $this->getJsonRpcClientManager(3); - $sessionManager = $this->getSessionManager(); - - $this->createServiceWithoutParticipants($rpcClientManager, $sessionManager); - $this->createServiceWithParticipants($rpcClientManager, $sessionManager); - - static::assertCount(0, $this->serviceWithoutParticipants->getSurveyParticipants(1)); - static::assertCount(0, $this->serviceWithoutParticipants->getSurveyParticipants(2)); - - static::assertCount(2, $this->serviceWithParticipants->getSurveyParticipants(1)); - static::assertCount(1, $this->serviceWithParticipants->getSurveyParticipants(2)); - static::assertCount(0, $this->serviceWithParticipants->getSurveyParticipants(3)); - } - - public function testGetSurveyParticipantsWithImportantException() - { - $this->setExpectedException(CannotProcessDataException::className); - $exception = new CannotProcessDataException(ReasonType::NO_TOKEN_TABLE); - - $rpcClientManager = $this->getJsonRpcClientManagerWithException(1, $exception); - $sessionManager = $this->getSessionManager(); - - $this->createServiceWithParticipants($rpcClientManager, $sessionManager); - $this->serviceWithParticipants->getSurveyParticipants(3); - } - - public function testGetSurveyParticipantsWithNoParticipantsException() - { - $exception = new CannotProcessDataException(ReasonType::NO_PARTICIPANTS_FOUND); - - $rpcClientManager = $this->getJsonRpcClientManagerWithException(1, $exception); - $sessionManager = $this->getSessionManager(); - - $this->createServiceWithParticipants($rpcClientManager, $sessionManager); - static::assertCount(0, $this->serviceWithParticipants->getSurveyParticipants(3)); - } - public function testHasParticipantUsingServiceWithoutParticipants() { $rpcClientManager = $this->getJsonRpcClientManager(2); @@ -125,25 +92,6 @@ class ParticipantServiceTest extends BaseTestCase public function testHasParticipant() { $runMethodCallResults = [ - [ - 'tid' => '123', - 'participant_id' => null, - 'mpid' => null, - 'firstname' => 'John', - 'lastname' => 'Scott', - 'email' => 'john@scott.com', - 'emailstatus' => 'OK', - 'token' => uniqid(), - 'language' => 'pl', - 'blacklisted' => 'N', - 'sent' => 'Y', - 'remindersent' => 'N', - 'remindercount' => 0, - 'completed' => 'N', - 'usesleft' => 10, - 'validfrom' => null, - 'validuntil' => (new DateTime())->format('Y-m-d H:i:s'), - ], [ null, ], @@ -152,7 +100,7 @@ class ParticipantServiceTest extends BaseTestCase ], ]; - $rpcClientManager = $this->getJsonRpcClientManager(3, $runMethodCallResults); + $rpcClientManager = $this->getJsonRpcClientManager(2, $runMethodCallResults); $sessionManager = $this->getSessionManager(); $this->createServiceWithParticipants($rpcClientManager, $sessionManager); @@ -161,72 +109,16 @@ class ParticipantServiceTest extends BaseTestCase static::assertFalse($this->serviceWithParticipants->hasParticipant(3, 'john@scott.com')); } - public function testAddParticipantForNotExistingSurvey() + public function testGetParticipantDetailsWithException() { - $this->setExpectedException(CannotProcessDataException::className); $exception = new CannotProcessDataException(ReasonType::NOT_EXISTING_SURVEY_ID); + $this->setExpectedException(CannotProcessDataException::className, $exception->getMessage()); $rpcClientManager = $this->getJsonRpcClientManagerWithException(1, $exception); $sessionManager = $this->getSessionManager(); - - $this->createServiceWithoutParticipants($rpcClientManager, $sessionManager); $this->createServiceWithParticipants($rpcClientManager, $sessionManager); - $surveyId = 1; - $firstName = 'John'; - $lastName = 'Scott'; - $email = 'john@scott.com'; - - $this->serviceWithoutParticipants->addParticipant($surveyId, $firstName, $lastName, $email); - $this->serviceWithParticipants->addParticipant($surveyId, $firstName, $lastName, $email); - } - - public function testAddParticipant() - { - $surveyId = 1; - $firstName = 'John'; - $lastName = 'Scott'; - $email = 'john@scott.com'; - $runMethodCallCount = 1; - - $runMethodCallResults = [ - [ - [ - 'firstname' => $firstName, - 'lastname' => $lastName, - 'email' => $email, - ], - ], - ]; - - $rpcClientManager = $this->getJsonRpcClientManager($runMethodCallCount, $runMethodCallResults); - $sessionManager = $this->getSessionManager(); - - $this->createServiceWithoutParticipants($rpcClientManager, $sessionManager); - $result = $this->serviceWithoutParticipants->addParticipant($surveyId, $firstName, $lastName, $email); - - static::assertInstanceOf(Participant::className, $result); - static::assertEquals($firstName, $result->getFirstName()); - static::assertEquals($lastName, $result->getLastName()); - static::assertEquals($email, $result->getEmail()); - } - - public function testGetParticipant() - { - $rpcClientManager = $this->getJsonRpcClientManager(1); - $sessionManager = $this->getSessionManager(); - - $this->createServiceWithoutParticipants($rpcClientManager, $sessionManager); - $this->createServiceWithParticipants($rpcClientManager, $sessionManager); - - $participant1 = $this->serviceWithoutParticipants->getParticipant(1, 'john@scott.com'); - $participant2 = $this->serviceWithParticipants->getParticipant(1, 'john@scott.com'); - - static::assertNull($participant1); - static::assertInstanceOf(ParticipantShort::className, $participant2); - static::assertEquals('John', $participant2->getFirstName()); - static::assertEquals('Scott', $participant2->getLastName()); - static::assertEquals('john@scott.com', $participant2->getEmail()); + $this->serviceWithParticipants->getParticipantDetails(1, 'lorem@ipsum.com'); } public function testGetParticipantDetails() @@ -236,30 +128,19 @@ class ParticipantServiceTest extends BaseTestCase $rpcClientManager = $this->getJsonRpcClientManager(1); $this->createServiceWithoutParticipants($rpcClientManager, $sessionManager); - $id = 1; - $firstName = 'John'; - $lastName = 'Scott'; - $email = 'john@scott.com'; - $token = uniqid(); - - $runMethodCallResults = [ - [ - 'tid' => $id, - 'firstname' => $firstName, - 'lastname' => $lastName, - 'email' => $email, - 'token' => $token, - 'sent' => 'N', - 'completed' => 'N', - ], - ]; - - $rpcClientManager = $this->getJsonRpcClientManager(1, $runMethodCallResults); + $rpcClientManager = $this->getJsonRpcClientManager(0); $this->createServiceWithParticipants($rpcClientManager, $sessionManager); $participant1 = $this->serviceWithoutParticipants->getParticipantDetails(1, 'john@scott.com'); $participant2 = $this->serviceWithParticipants->getParticipantDetails(1, 'john@scott.com'); + $rawData = $this->participantsRawData[0]; + $id = $rawData['tid']; + $firstName = $rawData['firstname']; + $lastName = $rawData['lastname']; + $email = $rawData['email']; + $token = $rawData['token']; + static::assertNull($participant1); static::assertInstanceOf(Participant::className, $participant2); static::assertEquals($id, $participant2->getId()); @@ -267,9 +148,9 @@ class ParticipantServiceTest extends BaseTestCase static::assertEquals($lastName, $participant2->getLastName()); static::assertEquals($email, $participant2->getEmail()); static::assertEquals($token, $participant2->getToken()); - static::assertFalse($participant2->isSent()); - static::assertFalse($participant2->isCompleted()); - static::assertNull($participant2->isBlacklisted()); + static::assertTrue($participant2->isSent()); + static::assertTrue($participant2->isCompleted()); + static::assertFalse($participant2->isBlacklisted()); static::assertNull($participant2->getValidFrom()); } @@ -286,16 +167,7 @@ class ParticipantServiceTest extends BaseTestCase public function testHasParticipantFilledSurveyUsingExistingParticipant() { - $runMethodCallResults = [ - [ - 'firstname' => 'John', - 'lastname' => 'Scott', - 'email' => 'john@scott.com', - 'completed' => (new DateTime())->format('Y-m-d H:i'), - ], - ]; - - $rpcClientManager = $this->getJsonRpcClientManager(1, $runMethodCallResults); + $rpcClientManager = $this->getJsonRpcClientManager(0); $sessionManager = $this->getSessionManager(); $this->createServiceWithParticipants($rpcClientManager, $sessionManager); @@ -313,6 +185,55 @@ class ParticipantServiceTest extends BaseTestCase $this->serviceWithParticipants->hasParticipantFilledSurvey(3, 'mary@jane.com'); } + /** + * {@inheritdoc} + */ + protected function setUp() + { + parent::setUp(); + + $this->participantsRawData = [ + [ + 'tid' => 1, + 'participant_id' => null, + 'mpid' => null, + 'firstname' => 'John', + 'lastname' => 'Scott', + 'email' => 'john@scott.com', + 'emailstatus' => 'OK', + 'token' => uniqid(), + 'language' => 'pl', + 'blacklisted' => 'N', + 'sent' => 'Y', + 'remindersent' => 'N', + 'remindercount' => 0, + 'completed' => (new DateTime())->format('Y-m-d H:i:s'), + 'usesleft' => 10, + 'validfrom' => null, + 'validuntil' => (new DateTime())->format('Y-m-d H:i:s'), + ], + [ + 'tid' => 2, + 'participant_id' => null, + 'mpid' => null, + 'firstname' => 'Mary', + 'lastname' => 'Jane', + 'email' => 'mary@jane.com', + 'emailstatus' => 'OK', + 'token' => uniqid(), + 'language' => 'pl', + 'blacklisted' => 'N', + 'sent' => 'Y', + 'remindersent' => 'N', + 'remindercount' => 0, + 'completed' => 'N', + 'usesleft' => 10, + 'validfrom' => null, + 'validuntil' => (new DateTime())->format('Y-m-d H:i:s'), + ], + ]; + } + /** * Returns configuration used while connecting to LimeSurvey's API * @@ -408,30 +329,16 @@ class ParticipantServiceTest extends BaseTestCase $configuration = $this->getConnectionConfiguration(); $client = new Client($configuration, $rpcClientManager, $sessionManager); - $allParticipants = new Participants([ + $participantsDetails = new ParticipantsDetails([ 1 => new Collection([ - new ParticipantShort([ - 'tid' => 1, - 'participant_info' => [ - 'firstname' => 'John', - 'lastname' => 'Scott', - 'email' => 'john@scott.com', - ], - ]), - new ParticipantShort([ - 'tid' => 2, - 'participant_info' => [ - 'firstname' => 'Mary', - 'lastname' => 'Jane', - 'email' => 'mary@jane.com', - ], - ]), + new Participant($this->participantsRawData[0]), + new Participant($this->participantsRawData[1]), ]), 2 => new Collection([ - new ParticipantShort(), + new Participant(), ]), ]); - $this->serviceWithParticipants = new ParticipantService($client, $allParticipants); + $this->serviceWithParticipants = new ParticipantService($client, $participantsDetails); } } diff --git a/tests/Service/SurveyServiceTest.php b/tests/Service/SurveyServiceTest.php index 7e71161..7b87b66 100644 --- a/tests/Service/SurveyServiceTest.php +++ b/tests/Service/SurveyServiceTest.php @@ -9,22 +9,26 @@ namespace Meritoo\LimeSurvey\Test\ApiClient\Service; use Exception; +use Meritoo\Common\Collection\Collection; use Meritoo\Common\Test\Base\BaseTestCase; use Meritoo\Common\Type\OopVisibilityType; use Meritoo\LimeSurvey\ApiClient\Client\Client; use Meritoo\LimeSurvey\ApiClient\Configuration\ConnectionConfiguration; use Meritoo\LimeSurvey\ApiClient\Exception\CannotProcessDataException; +use Meritoo\LimeSurvey\ApiClient\Exception\MissingSurveySummaryException; use Meritoo\LimeSurvey\ApiClient\Manager\JsonRpcClientManager; use Meritoo\LimeSurvey\ApiClient\Manager\SessionManager; +use Meritoo\LimeSurvey\ApiClient\Result\Collection\Participants; use Meritoo\LimeSurvey\ApiClient\Result\Collection\Surveys; use Meritoo\LimeSurvey\ApiClient\Result\Item\Participant; +use Meritoo\LimeSurvey\ApiClient\Result\Item\ParticipantShort; use Meritoo\LimeSurvey\ApiClient\Result\Item\Survey; use Meritoo\LimeSurvey\ApiClient\Service\SurveyService; use Meritoo\LimeSurvey\ApiClient\Type\ReasonType; use PHPUnit_Framework_MockObject_MockObject; /** - * Test case of the service that serves surveys + * Test case of the service that serves surveys and participants of surveys * * @author Krzysztof Niziol * @copyright Meritoo.pl @@ -32,7 +36,7 @@ use PHPUnit_Framework_MockObject_MockObject; class SurveyServiceTest extends BaseTestCase { /** - * Service that serves surveys. + * Service that serves surveys and participants of surveys. * Without surveys. * * @var SurveyService @@ -40,13 +44,29 @@ class SurveyServiceTest extends BaseTestCase private $serviceWithoutSurveys; /** - * Service that serves surveys. + * Service that serves surveys and participants of surveys. * With surveys. * * @var SurveyService */ private $serviceWithSurveys; + /** + * Service that serves surveys and participants of surveys. + * Without participants. + * + * @var SurveyService + */ + private $serviceWithoutParticipants; + + /** + * Service that serves surveys and participants of surveys. + * With participants. + * + * @var SurveyService + */ + private $serviceWithParticipants; + /** * Base url of LimeSurvey's instance. * Used to prepare configuration of connection. @@ -57,7 +77,7 @@ class SurveyServiceTest extends BaseTestCase public function testConstructorVisibilityAndArguments() { - static::assertConstructorVisibilityAndArguments(SurveyService::className, OopVisibilityType::IS_PUBLIC, 2, 1); + static::assertConstructorVisibilityAndArguments(SurveyService::className, OopVisibilityType::IS_PUBLIC, 4, 1); } public function testGetClient() @@ -78,7 +98,7 @@ class SurveyServiceTest extends BaseTestCase static::assertEquals($client, $surveyService->getClient()); } - public function testGetAllSurveysWithImportantException() + public function testGetAllSurveysWithNoTableException() { $this->setExpectedException(CannotProcessDataException::className); $exception = new CannotProcessDataException(ReasonType::NO_TOKEN_TABLE); @@ -185,6 +205,262 @@ class SurveyServiceTest extends BaseTestCase static::assertEquals($expectedUrl, $this->serviceWithSurveys->getStartSurveyUrl($surveyId, $participant)); } + public function testGetSurveyParticipantsWithNotExistingSurveyException() + { + $exception = new CannotProcessDataException(ReasonType::NOT_EXISTING_SURVEY_ID); + $this->setExpectedException(CannotProcessDataException::className, $exception->getMessage()); + + $runMethodCallResults = [ + [ + 'token_count' => '0', + 'token_invalid' => '0', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '0', + 'completed_responses' => '0', + 'incomplete_responses' => '0', + 'full_responses' => '0', + ], + [ + 'status' => ReasonType::NOT_EXISTING_SURVEY_ID, + ], + ]; + + $rpcClientManager = $this->getJsonRpcClientManager(2, $runMethodCallResults); + $sessionManager = $this->getSessionManager(); + $this->createServiceWithParticipants($rpcClientManager, $sessionManager); + + $this->serviceWithParticipants->getSurveyParticipants(3); + } + + public function testGetSurveyParticipantsWithNoParticipantsFoundException() + { + $runMethodCallResults = [ + [ + 'token_count' => '0', + 'token_invalid' => '0', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '0', + 'completed_responses' => '0', + 'incomplete_responses' => '0', + 'full_responses' => '0', + ], + [ + 'status' => ReasonType::NO_PARTICIPANTS_FOUND, + ], + ]; + + $rpcClientManager = $this->getJsonRpcClientManager(2, $runMethodCallResults); + $sessionManager = $this->getSessionManager(); + + $this->createServiceWithParticipants($rpcClientManager, $sessionManager); + $participants = $this->serviceWithParticipants->getSurveyParticipants(3); + + static::assertInstanceOf(Collection::className, $participants); + static::assertCount(0, $participants); + } + + public function testGetSurveyParticipants() + { + $runMethodCallResults = [ + [ + 'token_count' => '0', + 'token_invalid' => '0', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '0', + 'completed_responses' => '0', + 'incomplete_responses' => '0', + 'full_responses' => '0', + ], + null, + [ + 'token_count' => '0', + 'token_invalid' => '0', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '0', + 'completed_responses' => '0', + 'incomplete_responses' => '0', + 'full_responses' => '0', + ], + null, + [ + 'token_count' => '2', + 'token_invalid' => '0', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '0', + 'completed_responses' => '0', + 'incomplete_responses' => '0', + 'full_responses' => '0', + ], + ]; + + $rpcClientManager = $this->getJsonRpcClientManager(6, $runMethodCallResults); + $sessionManager = $this->getSessionManager(); + + $this->createServiceWithoutParticipants($rpcClientManager, $sessionManager); + $this->createServiceWithParticipants($rpcClientManager, $sessionManager); + + static::assertCount(0, $this->serviceWithoutParticipants->getSurveyParticipants(1)); + static::assertCount(0, $this->serviceWithoutParticipants->getSurveyParticipants(2)); + + static::assertCount(2, $this->serviceWithParticipants->getSurveyParticipants(1)); + static::assertCount(1, $this->serviceWithParticipants->getSurveyParticipants(2)); + static::assertCount(0, $this->serviceWithParticipants->getSurveyParticipants(3)); + } + + public function testGetSurveyParticipantsWithNoTableException() + { + $this->setExpectedException(CannotProcessDataException::className); + $exception = new CannotProcessDataException(ReasonType::NO_TOKEN_TABLE); + + $rpcClientManager = $this->getJsonRpcClientManagerWithException(1, $exception); + $sessionManager = $this->getSessionManager(); + + $this->createServiceWithParticipants($rpcClientManager, $sessionManager); + $this->serviceWithParticipants->getSurveyParticipants(3); + } + + public function testGetSurveyParticipantsWithNoParticipantsException() + { + $this->setExpectedException(CannotProcessDataException::className); + $exception = new CannotProcessDataException(ReasonType::NO_PARTICIPANTS_FOUND); + + $rpcClientManager = $this->getJsonRpcClientManagerWithException(1, $exception); + $sessionManager = $this->getSessionManager(); + + $this->createServiceWithParticipants($rpcClientManager, $sessionManager); + static::assertCount(0, $this->serviceWithParticipants->getSurveyParticipants(3)); + } + + public function testAddParticipantForNotExistingSurvey() + { + $this->setExpectedException(CannotProcessDataException::className); + $exception = new CannotProcessDataException(ReasonType::NOT_EXISTING_SURVEY_ID); + + $rpcClientManager = $this->getJsonRpcClientManagerWithException(1, $exception); + $sessionManager = $this->getSessionManager(); + + $this->createServiceWithoutParticipants($rpcClientManager, $sessionManager); + $this->createServiceWithParticipants($rpcClientManager, $sessionManager); + + $surveyId = 1; + $firstName = 'John'; + $lastName = 'Scott'; + $email = 'john@scott.com'; + + $this->serviceWithoutParticipants->addParticipant($surveyId, $firstName, $lastName, $email); + $this->serviceWithParticipants->addParticipant($surveyId, $firstName, $lastName, $email); + } + + public function testAddParticipant() + { + $surveyId = 1; + $firstName = 'John'; + $lastName = 'Scott'; + $email = 'john@scott.com'; + $runMethodCallCount = 1; + + $runMethodCallResults = [ + [ + [ + 'firstname' => $firstName, + 'lastname' => $lastName, + 'email' => $email, + ], + ], + ]; + + $rpcClientManager = $this->getJsonRpcClientManager($runMethodCallCount, $runMethodCallResults); + $sessionManager = $this->getSessionManager(); + + $this->createServiceWithoutParticipants($rpcClientManager, $sessionManager); + $result = $this->serviceWithoutParticipants->addParticipant($surveyId, $firstName, $lastName, $email); + + static::assertInstanceOf(Participant::className, $result); + static::assertEquals($firstName, $result->getFirstName()); + static::assertEquals($lastName, $result->getLastName()); + static::assertEquals($email, $result->getEmail()); + } + + public function testGetParticipant() + { + $runMethodCallResults = [ + [ + 'token_count' => '0', + 'token_invalid' => '0', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '0', + 'completed_responses' => '0', + 'incomplete_responses' => '0', + 'full_responses' => '0', + ], + null, + [ + [ + 'tid' => 1, + 'participant_info' => [ + 'firstname' => 'John', + 'lastname' => 'Scott', + 'email' => 'john@scott.com', + ], + ], + [ + 'tid' => 2, + 'participant_info' => [ + 'firstname' => 'Mary', + 'lastname' => 'Jane', + 'email' => 'mary@jane.com', + ], + ], + ], + [ + 'token_count' => '2', + 'token_invalid' => '0', + 'token_sent' => '0', + 'token_opted_out' => '0', + 'token_completed' => '0', + 'completed_responses' => '0', + 'incomplete_responses' => '0', + 'full_responses' => '0', + ], + ]; + + $rpcClientManager = $this->getJsonRpcClientManager(2, $runMethodCallResults); + $sessionManager = $this->getSessionManager(); + + $this->createServiceWithoutParticipants($rpcClientManager, $sessionManager); + $this->createServiceWithParticipants($rpcClientManager, $sessionManager); + + $participant1 = $this->serviceWithoutParticipants->getParticipant(1, 'john@scott.com'); + $participant2 = $this->serviceWithParticipants->getParticipant(1, 'john@scott.com'); + + static::assertNull($participant1); + static::assertInstanceOf(ParticipantShort::className, $participant2); + static::assertEquals('John', $participant2->getFirstName()); + static::assertEquals('Scott', $participant2->getLastName()); + static::assertEquals('john@scott.com', $participant2->getEmail()); + } + + public function testGetSurveyTokenCountWithException() + { + $this->setExpectedException(MissingSurveySummaryException::className); + + $runMethodCallResults = [ + null, + ]; + + $rpcClientManager = $this->getJsonRpcClientManager(1, $runMethodCallResults); + $sessionManager = $this->getSessionManager(); + $this->createServiceWithoutSurveys($rpcClientManager, $sessionManager); + + $this->serviceWithoutSurveys->getSurveyTokenCount(1); + } + /** * Returns configuration used while connecting to LimeSurvey's API * @@ -216,10 +492,22 @@ class SurveyServiceTest extends BaseTestCase { $rpcClientManager = $this->createMock(JsonRpcClientManager::className); - $rpcClientManager + $mocker = $rpcClientManager ->expects(static::exactly($runMethodCallCount)) - ->method('runMethod') - ->will(static::returnValue($runMethodCallResults)); + ->method('runMethod'); + + if (!empty($runMethodCallResults)) { + $function = [ + $mocker, + 'willReturnOnConsecutiveCalls', + ]; + + /* + * I have to use the call_user_func_array() function to pass elements of $runMethodCallResults array as + * arguments of the willReturnOnConsecutiveCalls() method + */ + call_user_func_array($function, $runMethodCallResults); + } return $rpcClientManager; } @@ -287,4 +575,55 @@ class SurveyServiceTest extends BaseTestCase $this->serviceWithSurveys = new SurveyService($client, $allSurveys); } + + /** + * Creates instance of the tested service without participants + * + * @param PHPUnit_Framework_MockObject_MockObject $rpcClientManager Manager of the JsonRPC client used while connecting to LimeSurvey's API + * @param PHPUnit_Framework_MockObject_MockObject $sessionManager Manager of session started while connecting to LimeSurvey's API + */ + private function createServiceWithoutParticipants(PHPUnit_Framework_MockObject_MockObject $rpcClientManager, PHPUnit_Framework_MockObject_MockObject $sessionManager) + { + $configuration = $this->getConnectionConfiguration(); + $client = new Client($configuration, $rpcClientManager, $sessionManager); + $this->serviceWithoutParticipants = new SurveyService($client); + } + + /** + * Creates instance of the tested service with participants + * + * @param PHPUnit_Framework_MockObject_MockObject $rpcClientManager Manager of the JsonRPC client used while connecting to LimeSurvey's API + * @param PHPUnit_Framework_MockObject_MockObject $sessionManager Manager of session started while connecting to LimeSurvey's API + */ + private function createServiceWithParticipants(PHPUnit_Framework_MockObject_MockObject $rpcClientManager, PHPUnit_Framework_MockObject_MockObject $sessionManager) + { + $configuration = $this->getConnectionConfiguration(); + $client = new Client($configuration, $rpcClientManager, $sessionManager); + + $allParticipants = new Participants([ + 1 => new Collection([ + new ParticipantShort([ + 'tid' => 1, + 'participant_info' => [ + 'firstname' => 'John', + 'lastname' => 'Scott', + 'email' => 'john@scott.com', + ], + ]), + new ParticipantShort([ + 'tid' => 2, + 'participant_info' => [ + 'firstname' => 'Mary', + 'lastname' => 'Jane', + 'email' => 'mary@jane.com', + ], + ]), + ]), + 2 => new Collection([ + new ParticipantShort(), + ]), + ]); + + $this->serviceWithParticipants = new SurveyService($client, null, $allParticipants); + } } diff --git a/tests/Type/MethodTypeTest.php b/tests/Type/MethodTypeTest.php index 0b6d9cc..fd0ef7e 100644 --- a/tests/Type/MethodTypeTest.php +++ b/tests/Type/MethodTypeTest.php @@ -250,6 +250,7 @@ class MethodTypeTest extends BaseTypeTestCase 'EXPORT_STATISTICS' => MethodType::EXPORT_STATISTICS, 'GET_PARTICIPANT_PROPERTIES' => MethodType::GET_PARTICIPANT_PROPERTIES, 'GET_QUESTION_PROPERTIES' => MethodType::GET_QUESTION_PROPERTIES, + 'GET_SUMMARY' => MethodType::GET_SUMMARY, 'LIST_PARTICIPANTS' => MethodType::LIST_PARTICIPANTS, 'LIST_QUESTIONS' => MethodType::LIST_QUESTIONS, 'LIST_SURVEYS' => MethodType::LIST_SURVEYS,