From 41156ed058da79cfb69d33e39337b97fcaf34f67 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sun, 1 Oct 2017 11:46:59 +0200 Subject: [PATCH] Participants collection - store instances of ParticipantShort instead of Participant Required to fix bug "Call to undefined method Meritoo\LimeSurvey\ApiClient\Result\Item\ParticipantShort::isCompleted() in /src/Service/ParticipantService.php on line 206" --- src/Result/Collection/Participants.php | 12 +++++----- src/Result/Result.php | 6 ++++- src/Service/ParticipantService.php | 17 +++++++++---- tests/Result/Collection/ParticipantsTest.php | 25 ++++++++++++-------- tests/Service/ParticipantServiceTest.php | 23 +++++++++++++++--- 5 files changed, 59 insertions(+), 24 deletions(-) diff --git a/src/Result/Collection/Participants.php b/src/Result/Collection/Participants.php index f236f4e..6d0921b 100644 --- a/src/Result/Collection/Participants.php +++ b/src/Result/Collection/Participants.php @@ -10,7 +10,7 @@ namespace Meritoo\LimeSurvey\ApiClient\Result\Collection; use Meritoo\Common\Collection\Collection; use Meritoo\Common\Exception\Method\DisabledMethodException; -use Meritoo\LimeSurvey\ApiClient\Result\Item\Participant; +use Meritoo\LimeSurvey\ApiClient\Result\Item\ParticipantShort; /** * Collection of participants (of surveys). @@ -75,11 +75,11 @@ class Participants extends Collection /** * Adds participant of given survey * - * @param Participant $participant Participant to add - * @param int $surveyId ID of survey + * @param ParticipantShort $participant Participant to add + * @param int $surveyId ID of survey * @return $this */ - public function addParticipant(Participant $participant, $surveyId) + public function addParticipant(ParticipantShort $participant, $surveyId) { $this ->getBySurvey($surveyId) @@ -128,7 +128,7 @@ class Participants extends Collection * * @param int $surveyId ID of survey * @param string $participantEmail E-mail of searched participant - * @return Participant|null + * @return ParticipantShort|null */ public function getParticipantOfSurvey($surveyId, $participantEmail) { @@ -139,7 +139,7 @@ class Participants extends Collection return null; } - /* @var Participant $participant */ + /* @var ParticipantShort $participant */ foreach ($participants as $participant) { if ($participant->getEmail() == $participantEmail) { return $participant; diff --git a/src/Result/Result.php b/src/Result/Result.php index fd2b616..a7cc8b9 100644 --- a/src/Result/Result.php +++ b/src/Result/Result.php @@ -128,7 +128,11 @@ class Result ->getResultProcessor() ->process($this->method, $rawData); - if (null === $processed || is_array($processed)) { + /* + * Result is unknown and it should be iterable the result is an array? + * Let's prepare and return collection + */ + if ((null === $processed && MethodType::isResultIterable($this->method)) || is_array($processed)) { $collection = new Collection(); if (is_array($processed)) { diff --git a/src/Service/ParticipantService.php b/src/Service/ParticipantService.php index 3c27bcb..873a59d 100644 --- a/src/Service/ParticipantService.php +++ b/src/Service/ParticipantService.php @@ -14,6 +14,7 @@ use Meritoo\LimeSurvey\ApiClient\Exception\CannotProcessDataException; use Meritoo\LimeSurvey\ApiClient\Exception\MissingParticipantOfSurveyException; use Meritoo\LimeSurvey\ApiClient\Result\Collection\Participants; 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; @@ -175,7 +176,7 @@ class ParticipantService * * @param int $surveyId ID of survey * @param string $email E-mail address of the participant - * @return Participant|null + * @return ParticipantShort|null */ public function getParticipant($surveyId, $email) { @@ -201,9 +202,17 @@ class ParticipantService public function hasParticipantFilledSurvey($surveyId, $email) { if ($this->hasParticipant($surveyId, $email)) { - return true === $this - ->getParticipant($surveyId, $email) - ->isCompleted(); + $arguments = [ + 'email' => $email, + ]; + + /* @var Participant $participant */ + $participant = $this + ->client + ->run(MethodType::GET_PARTICIPANT_PROPERTIES, $arguments) + ->getData(); + + return true === $participant->isCompleted(); } throw new MissingParticipantOfSurveyException($surveyId, $email); diff --git a/tests/Result/Collection/ParticipantsTest.php b/tests/Result/Collection/ParticipantsTest.php index 4ccbba7..131c982 100644 --- a/tests/Result/Collection/ParticipantsTest.php +++ b/tests/Result/Collection/ParticipantsTest.php @@ -14,6 +14,7 @@ use Meritoo\Common\Test\Base\BaseTestCase; use Meritoo\Common\Type\OopVisibilityType; use Meritoo\LimeSurvey\ApiClient\Result\Collection\Participants; use Meritoo\LimeSurvey\ApiClient\Result\Item\Participant; +use Meritoo\LimeSurvey\ApiClient\Result\Item\ParticipantShort; /** * Test case of the collection of participants (of surveys) @@ -126,11 +127,13 @@ class ParticipantsTest extends BaseTestCase $surveyId = 1; $email = 'john@scott.com'; - $participant = new Participant([ - 'firstname' => 'John', - 'lastname' => 'Scott', - 'email' => $email, - 'completed' => 'Y', + $participant = new ParticipantShort([ + 'tid' => 1, + 'participant_info' => [ + 'firstname' => 'John', + 'lastname' => 'Scott', + 'email' => $email, + ], ]); $participants = new Participants(); @@ -148,11 +151,13 @@ class ParticipantsTest extends BaseTestCase $surveyId = 1; $email = 'john@scott.com'; - $participant = new Participant([ - 'firstname' => 'John', - 'lastname' => 'Scott', - 'email' => $email, - 'completed' => 'Y', + $participant = new ParticipantShort([ + 'tid' => 1, + 'participant_info' => [ + 'firstname' => 'John', + 'lastname' => 'Scott', + 'email' => $email, + ], ]); $result = $this diff --git a/tests/Service/ParticipantServiceTest.php b/tests/Service/ParticipantServiceTest.php index 6a78d39..13bde6c 100644 --- a/tests/Service/ParticipantServiceTest.php +++ b/tests/Service/ParticipantServiceTest.php @@ -202,14 +202,31 @@ class ParticipantServiceTest extends BaseTestCase $this->serviceWithoutParticipants->hasParticipantFilledSurvey(1, 'john@scott.com'); } - public function testHasParticipantFilledSurvey() + public function testHasParticipantFilledSurveyUsingExistingParticipant() { - $rpcClientManager = $this->getJsonRpcClientManager(0); + $runMethodCallResults = [ + 'firstname' => 'John', + 'lastname' => 'Scott', + 'email' => 'john@scott.com', + 'completed' => 'Y', + ]; + + $rpcClientManager = $this->getJsonRpcClientManager(1, $runMethodCallResults); $sessionManager = $this->getSessionManager(); $this->createServiceWithParticipants($rpcClientManager, $sessionManager); static::assertTrue($this->serviceWithParticipants->hasParticipantFilledSurvey(1, 'john@scott.com')); - static::assertFalse($this->serviceWithParticipants->hasParticipantFilledSurvey(1, 'mary@jane.com')); + } + + public function testHasParticipantFilledSurveyUsingNotExistingParticipant() + { + $this->expectException(MissingParticipantOfSurveyException::class); + + $rpcClientManager = $this->getJsonRpcClientManager(1); + $sessionManager = $this->getSessionManager(); + $this->createServiceWithParticipants($rpcClientManager, $sessionManager); + + $this->serviceWithParticipants->hasParticipantFilledSurvey(3, 'mary@jane.com'); } /**