diff --git a/src/Service/SurveyService.php b/src/Service/SurveyService.php index 4fdea6c..aca16c5 100644 --- a/src/Service/SurveyService.php +++ b/src/Service/SurveyService.php @@ -12,6 +12,7 @@ use Meritoo\Common\Collection\Collection; use Meritoo\LimeSurvey\ApiClient\Client\Client; use Meritoo\LimeSurvey\ApiClient\Exception\CannotProcessDataException; use Meritoo\LimeSurvey\ApiClient\Result\Collection\Surveys; +use Meritoo\LimeSurvey\ApiClient\Result\Item\Participant; use Meritoo\LimeSurvey\ApiClient\Result\Item\Survey; use Meritoo\LimeSurvey\ApiClient\Type\MethodType; use Meritoo\LimeSurvey\ApiClient\Type\ReasonType; @@ -39,6 +40,19 @@ class SurveyService */ private $allSurveys; + /** + * Template of the url used to start survey + * + * Example: + * - url: https://your.limesurvey.instance/12345?token=q1w2e3r4t5y6 + * - LimeSurvey frontend: https://your.limesurvey.instance + * - survey ID: 12345 + * - token: q1w2e3r4t5y6 + * + * @var string + */ + private $startSurveyUrlTemplate = '%s/%d?token=%s'; + /** * Class constructor * @@ -134,4 +148,21 @@ class SurveyService return false; } + + /** + * Returns url used to start survey for given survey and participant + * + * @param int $surveyId ID of survey to start + * @param Participant $participant Participant who would like to start survey + * @return string + */ + public function getStartSurveyUrl($surveyId, Participant $participant) + { + $baseUrl = $this + ->client + ->getConfiguration() + ->getBaseUrl(); + + return sprintf($this->startSurveyUrlTemplate, $baseUrl, $surveyId, $participant->getToken()); + } } diff --git a/tests/Service/SurveyServiceTest.php b/tests/Service/SurveyServiceTest.php index e3517b8..b370bc1 100644 --- a/tests/Service/SurveyServiceTest.php +++ b/tests/Service/SurveyServiceTest.php @@ -17,6 +17,7 @@ use Meritoo\LimeSurvey\ApiClient\Exception\CannotProcessDataException; use Meritoo\LimeSurvey\ApiClient\Manager\JsonRpcClientManager; use Meritoo\LimeSurvey\ApiClient\Manager\SessionManager; use Meritoo\LimeSurvey\ApiClient\Result\Collection\Surveys; +use Meritoo\LimeSurvey\ApiClient\Result\Item\Participant; use Meritoo\LimeSurvey\ApiClient\Result\Item\Survey; use Meritoo\LimeSurvey\ApiClient\Service\SurveyService; use Meritoo\LimeSurvey\ApiClient\Type\ReasonType; @@ -46,6 +47,14 @@ class SurveyServiceTest extends BaseTestCase */ private $serviceWithSurveys; + /** + * Base url of LimeSurvey's instance. + * Used to prepare configuration of connection. + * + * @var string + */ + private $connectionBaseUrl = 'http://test.com'; + public function testConstructorVisibilityAndArguments() { static::assertConstructorVisibilityAndArguments(SurveyService::class, OopVisibilityType::IS_PUBLIC, 2, 1); @@ -152,6 +161,30 @@ class SurveyServiceTest extends BaseTestCase static::assertFalse($this->serviceWithSurveys->isExistingSurvey(4, true)); } + public function testGetStartSurveyUrl() + { + $rpcClientManager = $this->getJsonRpcClientManager(0); + $sessionManager = $this->getSessionManager(); + + $this->createServiceWithoutSurveys($rpcClientManager, $sessionManager); + $this->createServiceWithSurveys($rpcClientManager, $sessionManager); + + $surveyId = 123; + $token = 'djf28b47dha0mo83'; + $expectedUrl = sprintf('%s/%d?token=%s', $this->connectionBaseUrl, $surveyId, $token); + + $participant = new Participant([ + 'tid' => 1, + 'firstname' => 'John', + 'lastname' => 'Scott', + 'email' => 'john@scott.com', + 'token' => $token, + ]); + + static::assertEquals($expectedUrl, $this->serviceWithoutSurveys->getStartSurveyUrl($surveyId, $participant)); + static::assertEquals($expectedUrl, $this->serviceWithSurveys->getStartSurveyUrl($surveyId, $participant)); + } + /** * Returns configuration used while connecting to LimeSurvey's API * @@ -159,7 +192,7 @@ class SurveyServiceTest extends BaseTestCase */ private function getConnectionConfiguration() { - return new ConnectionConfiguration('http://test.com', 'test', 'test'); + return new ConnectionConfiguration($this->connectionBaseUrl, 'test', 'test'); } /**