diff --git a/src/DocScan/Constants.php b/src/DocScan/Constants.php index 8551c6ba..15e80d20 100644 --- a/src/DocScan/Constants.php +++ b/src/DocScan/Constants.php @@ -33,6 +33,7 @@ class Constants public const ID_DOCUMENT_TEXT_DATA_EXTRACTION = 'ID_DOCUMENT_TEXT_DATA_EXTRACTION'; public const SUPPLEMENTARY_DOCUMENT_TEXT_DATA_EXTRACTION = 'SUPPLEMENTARY_DOCUMENT_TEXT_DATA_EXTRACTION'; + public const VERIFY_SHARE_CODE_TASK = 'VERIFY_SHARE_CODE_TASK'; public const ID_DOCUMENT = 'ID_DOCUMENT'; public const SUPPLEMENTARY_DOCUMENT = 'SUPPLEMENTARY_DOCUMENT'; diff --git a/src/DocScan/Session/Create/Filters/RequiredShareCode.php b/src/DocScan/Session/Create/Filters/RequiredShareCode.php new file mode 100644 index 00000000..1db36264 --- /dev/null +++ b/src/DocScan/Session/Create/Filters/RequiredShareCode.php @@ -0,0 +1,59 @@ +issuer = $issuer; + $this->scheme = $scheme; + } + + /** + * @return stdClass + */ + public function jsonSerialize(): stdClass + { + return (object) Json::withoutNullValues([ + 'issuer' => $this->issuer, + 'scheme' => $this->scheme, + ]); + } + + /** + * @return string|null + */ + public function getIssuer(): ?string + { + return $this->issuer; + } + + /** + * @return string|null + */ + public function getScheme(): ?string + { + return $this->scheme; + } +} diff --git a/src/DocScan/Session/Create/Filters/RequiredShareCodeBuilder.php b/src/DocScan/Session/Create/Filters/RequiredShareCodeBuilder.php new file mode 100644 index 00000000..31df43cb --- /dev/null +++ b/src/DocScan/Session/Create/Filters/RequiredShareCodeBuilder.php @@ -0,0 +1,48 @@ +issuer = $issuer; + return $this; + } + + /** + * @param string $scheme + * + * @return $this + */ + public function withScheme(string $scheme): self + { + $this->scheme = $scheme; + return $this; + } + + /** + * @return RequiredShareCode + */ + public function build(): RequiredShareCode + { + return new RequiredShareCode($this->issuer, $this->scheme); + } +} diff --git a/src/DocScan/Session/Create/SessionSpecification.php b/src/DocScan/Session/Create/SessionSpecification.php index 46ab1f4a..b0e53a80 100644 --- a/src/DocScan/Session/Create/SessionSpecification.php +++ b/src/DocScan/Session/Create/SessionSpecification.php @@ -8,6 +8,7 @@ use stdClass; use Yoti\DocScan\Session\Create\Check\RequestedCheck; use Yoti\DocScan\Session\Create\Filters\RequiredDocument; +use Yoti\DocScan\Session\Create\Filters\RequiredShareCode; use Yoti\DocScan\Session\Create\Task\RequestedTask; use Yoti\Util\Json; @@ -85,6 +86,11 @@ class SessionSpecification implements JsonSerializable */ private $importToken; + /** + * @var RequiredShareCode[] + */ + private $requiredShareCodes; + /** * @param int|null $clientSessionTokenTtl * @param string|null $sessionDeadline @@ -101,6 +107,7 @@ class SessionSpecification implements JsonSerializable * @param object|null $identityProfileRequirements * @param bool|null $createIdentityProfilePreview * @param ImportToken|null $importToken + * @param RequiredShareCode[] $requiredShareCodes */ public function __construct( ?int $clientSessionTokenTtl, @@ -117,7 +124,8 @@ public function __construct( ?object $subject = null, ?object $identityProfileRequirements = null, ?bool $createIdentityProfilePreview = null, - ?ImportToken $importToken = null + ?ImportToken $importToken = null, + array $requiredShareCodes = [] ) { $this->clientSessionTokenTtl = $clientSessionTokenTtl; $this->sessionDeadline = $sessionDeadline; @@ -134,6 +142,7 @@ public function __construct( $this->identityProfileRequirements = $identityProfileRequirements; $this->createIdentityProfilePreview = $createIdentityProfilePreview; $this->importToken = $importToken; + $this->requiredShareCodes = $requiredShareCodes; } /** @@ -157,6 +166,7 @@ public function jsonSerialize(): stdClass 'identity_profile_requirements' => $this->getIdentityProfileRequirements(), 'create_identity_profile_preview' => $this->getCreateIdentityProfilePreview(), 'import_token' => $this->getImportToken(), + 'required_share_codes' => $this->getRequiredShareCodes(), ]); } @@ -278,4 +288,12 @@ public function getImportToken(): ?ImportToken { return $this->importToken; } + + /** + * @return RequiredShareCode[] + */ + public function getRequiredShareCodes(): array + { + return $this->requiredShareCodes; + } } diff --git a/src/DocScan/Session/Create/SessionSpecificationBuilder.php b/src/DocScan/Session/Create/SessionSpecificationBuilder.php index bb54de9e..89cd7932 100644 --- a/src/DocScan/Session/Create/SessionSpecificationBuilder.php +++ b/src/DocScan/Session/Create/SessionSpecificationBuilder.php @@ -7,6 +7,7 @@ use DateTimeImmutable; use Yoti\DocScan\Session\Create\Check\RequestedCheck; use Yoti\DocScan\Session\Create\Filters\RequiredDocument; +use Yoti\DocScan\Session\Create\Filters\RequiredShareCode; use Yoti\DocScan\Session\Create\Task\RequestedTask; class SessionSpecificationBuilder @@ -88,6 +89,11 @@ class SessionSpecificationBuilder */ private bool $createIdentityProfilePreview = false; + /** + * @var RequiredShareCode[] + */ + private $requiredShareCodes = []; + /** * @param int $clientSessionTokenTtl * @return $this @@ -274,6 +280,32 @@ public function withImportToken($importToken): self return $this; } + /** + * Adds a RequiredShareCode to the list of share codes required from the client + * + * @param RequiredShareCode $requiredShareCode + * + * @return $this + */ + public function withRequiredShareCode(RequiredShareCode $requiredShareCode): self + { + $this->requiredShareCodes[] = $requiredShareCode; + return $this; + } + + /** + * Sets the list of share codes required from the client + * + * @param RequiredShareCode[] $requiredShareCodes + * + * @return $this + */ + public function withRequiredShareCodes(array $requiredShareCodes): self + { + $this->requiredShareCodes = $requiredShareCodes; + return $this; + } + /** * @return SessionSpecification */ @@ -295,6 +327,7 @@ public function build(): SessionSpecification $this->identityProfileRequirements, $this->createIdentityProfilePreview, $this->importToken, + $this->requiredShareCodes, ); } } diff --git a/src/DocScan/Session/Retrieve/ResourceContainer.php b/src/DocScan/Session/Retrieve/ResourceContainer.php index 99b730d5..38ee886e 100644 --- a/src/DocScan/Session/Retrieve/ResourceContainer.php +++ b/src/DocScan/Session/Retrieve/ResourceContainer.php @@ -26,6 +26,11 @@ class ResourceContainer */ private $faceCapture = []; + /** + * @var ShareCodeResourceResponse[] + */ + private $shareCodes = []; + /** * ResourceContainer constructor. * @param array $resources @@ -47,6 +52,10 @@ public function __construct(array $resources) if (isset($resources['face_capture'])) { $this->faceCapture = $this->parseFaceCapture($resources['face_capture']); } + + if (isset($resources['share_codes'])) { + $this->shareCodes = $this->parseShareCodes($resources['share_codes']); + } } /** @@ -113,6 +122,19 @@ private function parseFaceCapture(array $faceCaptures): array return $parsedFaceCaptures; } + /** + * @param array> $shareCodes + * @return ShareCodeResourceResponse[] + */ + private function parseShareCodes(array $shareCodes): array + { + $parsedShareCodes = []; + foreach ($shareCodes as $shareCode) { + $parsedShareCodes[] = new ShareCodeResourceResponse($shareCode); + } + return $parsedShareCodes; + } + /** * @return IdDocumentResourceResponse[] */ @@ -161,6 +183,14 @@ public function getFaceCapture(): array return $this->faceCapture; } + /** + * @return ShareCodeResourceResponse[] + */ + public function getShareCodes(): array + { + return $this->shareCodes; + } + /** * @param string $class * @return mixed[] diff --git a/src/DocScan/Session/Retrieve/ResourceResponse.php b/src/DocScan/Session/Retrieve/ResourceResponse.php index aa7de1f3..973e0918 100644 --- a/src/DocScan/Session/Retrieve/ResourceResponse.php +++ b/src/DocScan/Session/Retrieve/ResourceResponse.php @@ -104,6 +104,8 @@ private function createTaskFromArray(array $task): TaskResponse return new TextExtractionTaskResponse($task); case Constants::SUPPLEMENTARY_DOCUMENT_TEXT_DATA_EXTRACTION: return new SupplementaryDocTextExtractionTaskResponse($task); + case Constants::VERIFY_SHARE_CODE_TASK: + return new VerifyShareCodeTaskResponse($task); default: return new TaskResponse($task); } diff --git a/src/DocScan/Session/Retrieve/ShareCodeResourceResponse.php b/src/DocScan/Session/Retrieve/ShareCodeResourceResponse.php new file mode 100644 index 00000000..9e617101 --- /dev/null +++ b/src/DocScan/Session/Retrieve/ShareCodeResourceResponse.php @@ -0,0 +1,129 @@ + $shareCode + */ + public function __construct(array $shareCode) + { + parent::__construct($shareCode); + + $this->createdAt = isset($shareCode['created_at']) + ? DateTime::stringToDateTime($shareCode['created_at']) + : null; + + $this->lastUpdated = isset($shareCode['last_updated']) + ? DateTime::stringToDateTime($shareCode['last_updated']) + : null; + + $this->lookupProfileMedia = isset($shareCode['lookup_profile']['media']) + ? new MediaResponse($shareCode['lookup_profile']['media']) + : null; + + $this->returnedProfileMedia = isset($shareCode['returned_profile']['media']) + ? new MediaResponse($shareCode['returned_profile']['media']) + : null; + + $this->idPhotoMedia = isset($shareCode['id_photo']['media']) + ? new MediaResponse($shareCode['id_photo']['media']) + : null; + + $this->fileMedia = isset($shareCode['file']['media']) + ? new MediaResponse($shareCode['file']['media']) + : null; + } + + /** + * @return \DateTime|null + */ + public function getCreatedAt(): ?\DateTime + { + return $this->createdAt; + } + + /** + * @return \DateTime|null + */ + public function getLastUpdated(): ?\DateTime + { + return $this->lastUpdated; + } + + /** + * @return MediaResponse|null + */ + public function getLookupProfileMedia(): ?MediaResponse + { + return $this->lookupProfileMedia; + } + + /** + * @return MediaResponse|null + */ + public function getReturnedProfileMedia(): ?MediaResponse + { + return $this->returnedProfileMedia; + } + + /** + * @return MediaResponse|null + */ + public function getIdPhotoMedia(): ?MediaResponse + { + return $this->idPhotoMedia; + } + + /** + * @return MediaResponse|null + */ + public function getFileMedia(): ?MediaResponse + { + return $this->fileMedia; + } + + /** + * @return VerifyShareCodeTaskResponse[] + */ + public function getVerifyShareCodeTasks(): array + { + return $this->filterTasksByType(VerifyShareCodeTaskResponse::class); + } +} diff --git a/src/DocScan/Session/Retrieve/VerifyShareCodeTaskResponse.php b/src/DocScan/Session/Retrieve/VerifyShareCodeTaskResponse.php new file mode 100644 index 00000000..db943272 --- /dev/null +++ b/src/DocScan/Session/Retrieve/VerifyShareCodeTaskResponse.php @@ -0,0 +1,17 @@ + $task + */ + public function __construct(array $task) + { + parent::__construct($task); + } +} diff --git a/tests/DocScan/Session/Create/Filters/RequiredShareCodeBuilderTest.php b/tests/DocScan/Session/Create/Filters/RequiredShareCodeBuilderTest.php new file mode 100644 index 00000000..dc1b77c0 --- /dev/null +++ b/tests/DocScan/Session/Create/Filters/RequiredShareCodeBuilderTest.php @@ -0,0 +1,88 @@ +withIssuer(self::SOME_ISSUER) + ->withScheme(self::SOME_SCHEME) + ->build(); + + $this->assertEquals(self::SOME_ISSUER, $requiredShareCode->getIssuer()); + $this->assertEquals(self::SOME_SCHEME, $requiredShareCode->getScheme()); + } + + /** + * @test + * @covers ::withIssuer + * @covers ::build + * @covers \Yoti\DocScan\Session\Create\Filters\RequiredShareCode::__construct + * @covers \Yoti\DocScan\Session\Create\Filters\RequiredShareCode::getIssuer + * @covers \Yoti\DocScan\Session\Create\Filters\RequiredShareCode::getScheme + */ + public function shouldBuildWithOnlyIssuer() + { + $requiredShareCode = (new RequiredShareCodeBuilder()) + ->withIssuer(self::SOME_ISSUER) + ->build(); + + $this->assertEquals(self::SOME_ISSUER, $requiredShareCode->getIssuer()); + $this->assertNull($requiredShareCode->getScheme()); + } + + /** + * @test + * @covers ::withScheme + * @covers ::build + * @covers \Yoti\DocScan\Session\Create\Filters\RequiredShareCode::__construct + * @covers \Yoti\DocScan\Session\Create\Filters\RequiredShareCode::getIssuer + * @covers \Yoti\DocScan\Session\Create\Filters\RequiredShareCode::getScheme + */ + public function shouldBuildWithOnlyScheme() + { + $requiredShareCode = (new RequiredShareCodeBuilder()) + ->withScheme(self::SOME_SCHEME) + ->build(); + + $this->assertNull($requiredShareCode->getIssuer()); + $this->assertEquals(self::SOME_SCHEME, $requiredShareCode->getScheme()); + } + + /** + * @test + * @covers ::build + * @covers \Yoti\DocScan\Session\Create\Filters\RequiredShareCode::__construct + * @covers \Yoti\DocScan\Session\Create\Filters\RequiredShareCode::getIssuer + * @covers \Yoti\DocScan\Session\Create\Filters\RequiredShareCode::getScheme + */ + public function shouldBuildWithNoFields() + { + $requiredShareCode = (new RequiredShareCodeBuilder())->build(); + + $this->assertNull($requiredShareCode->getIssuer()); + $this->assertNull($requiredShareCode->getScheme()); + } +} diff --git a/tests/DocScan/Session/Create/Filters/RequiredShareCodeTest.php b/tests/DocScan/Session/Create/Filters/RequiredShareCodeTest.php new file mode 100644 index 00000000..8d557b3a --- /dev/null +++ b/tests/DocScan/Session/Create/Filters/RequiredShareCodeTest.php @@ -0,0 +1,108 @@ +assertEquals(self::SOME_ISSUER, $requiredShareCode->getIssuer()); + $this->assertEquals(self::SOME_SCHEME, $requiredShareCode->getScheme()); + } + + /** + * @test + * @covers ::__construct + * @covers ::getIssuer + * @covers ::getScheme + */ + public function shouldConstructWithNullValues() + { + $requiredShareCode = new RequiredShareCode(); + + $this->assertNull($requiredShareCode->getIssuer()); + $this->assertNull($requiredShareCode->getScheme()); + } + + /** + * @test + * @covers ::jsonSerialize + */ + public function shouldSerializeToJsonWithBothFields() + { + $requiredShareCode = new RequiredShareCode(self::SOME_ISSUER, self::SOME_SCHEME); + + $this->assertJsonStringEqualsJsonString( + json_encode([ + 'issuer' => self::SOME_ISSUER, + 'scheme' => self::SOME_SCHEME, + ]), + json_encode($requiredShareCode) + ); + } + + /** + * @test + * @covers ::jsonSerialize + */ + public function shouldSerializeToJsonWithOnlyIssuer() + { + $requiredShareCode = new RequiredShareCode(self::SOME_ISSUER, null); + + $this->assertJsonStringEqualsJsonString( + json_encode([ + 'issuer' => self::SOME_ISSUER, + ]), + json_encode($requiredShareCode) + ); + } + + /** + * @test + * @covers ::jsonSerialize + */ + public function shouldSerializeToJsonWithOnlyScheme() + { + $requiredShareCode = new RequiredShareCode(null, self::SOME_SCHEME); + + $this->assertJsonStringEqualsJsonString( + json_encode([ + 'scheme' => self::SOME_SCHEME, + ]), + json_encode($requiredShareCode) + ); + } + + /** + * @test + * @covers ::jsonSerialize + */ + public function shouldSerializeToEmptyObjectWhenBothFieldsAreNull() + { + $requiredShareCode = new RequiredShareCode(null, null); + + $this->assertJsonStringEqualsJsonString( + json_encode(new \stdClass()), + json_encode($requiredShareCode) + ); + } +} diff --git a/tests/DocScan/Session/Create/SessionSpecificationBuilderTest.php b/tests/DocScan/Session/Create/SessionSpecificationBuilderTest.php index 3f3640b7..789a0565 100644 --- a/tests/DocScan/Session/Create/SessionSpecificationBuilderTest.php +++ b/tests/DocScan/Session/Create/SessionSpecificationBuilderTest.php @@ -6,6 +6,7 @@ use Yoti\DocScan\Session\Create\Check\RequestedCheck; use Yoti\DocScan\Session\Create\Filters\RequiredDocument; +use Yoti\DocScan\Session\Create\Filters\RequiredShareCode; use Yoti\DocScan\Session\Create\IbvOptions; use Yoti\DocScan\Session\Create\ImportToken; use Yoti\DocScan\Session\Create\NotificationConfig; @@ -68,6 +69,11 @@ class SessionSpecificationBuilderTest extends TestCase */ private $importTokenMock; + /** + * @var RequiredShareCode + */ + private $requiredShareCodeMock; + public function setup(): void { $this->sdkConfigMock = $this->createMock(SdkConfig::class); @@ -89,6 +95,9 @@ public function setup(): void $this->importTokenMock = $this->createMock(ImportToken::class); + $this->requiredShareCodeMock = $this->createMock(RequiredShareCode::class); + $this->requiredShareCodeMock->method('jsonSerialize')->willReturn((object)['requiredShareCode']); + $this->subject = (object)[1 => 'some']; $this->identityProfileRequirements = (object)[ @@ -532,4 +541,65 @@ public function shouldReturnCorrectJsonStringWithImportToken() json_encode($sessionSpecification) ); } + + /** + * @test + * @covers ::withRequiredShareCode + * @covers ::build + * @covers \Yoti\DocScan\Session\Create\SessionSpecification::__construct + * @covers \Yoti\DocScan\Session\Create\SessionSpecification::getRequiredShareCodes + */ + public function shouldBuildWithRequiredShareCode() + { + $sessionSpecification = (new SessionSpecificationBuilder()) + ->withRequiredShareCode($this->requiredShareCodeMock) + ->build(); + + $this->assertCount(1, $sessionSpecification->getRequiredShareCodes()); + $this->assertEquals($this->requiredShareCodeMock, $sessionSpecification->getRequiredShareCodes()[0]); + } + + /** + * @test + * @covers ::withRequiredShareCodes + * @covers ::build + * @covers \Yoti\DocScan\Session\Create\SessionSpecification::__construct + * @covers \Yoti\DocScan\Session\Create\SessionSpecification::getRequiredShareCodes + */ + public function shouldOverwriteCurrentListWithRequiredShareCodes() + { + $someOtherRequiredShareCodeMock = $this->createMock(RequiredShareCode::class); + + $sessionSpecification = (new SessionSpecificationBuilder()) + ->withRequiredShareCode($this->requiredShareCodeMock) + ->withRequiredShareCodes([$someOtherRequiredShareCodeMock]) + ->build(); + + $this->assertCount(1, $sessionSpecification->getRequiredShareCodes()); + $this->assertSame($someOtherRequiredShareCodeMock, $sessionSpecification->getRequiredShareCodes()[0]); + } + + /** + * @test + * @covers \Yoti\DocScan\Session\Create\SessionSpecification::jsonSerialize + * @covers \Yoti\DocScan\Session\Create\SessionSpecificationBuilder::withRequiredShareCode + * @covers \Yoti\DocScan\Session\Create\SessionSpecificationBuilder::build + */ + public function shouldReturnCorrectJsonStringWithRequiredShareCodes() + { + $sessionSpecification = (new SessionSpecificationBuilder()) + ->withRequiredShareCode($this->requiredShareCodeMock) + ->build(); + + $this->assertJsonStringEqualsJsonString( + json_encode([ + 'requested_checks' => [], + 'requested_tasks' => [], + 'required_documents' => [], + 'create_identity_profile_preview' => false, + 'required_share_codes' => [$this->requiredShareCodeMock], + ]), + json_encode($sessionSpecification) + ); + } } diff --git a/tests/DocScan/Session/Retrieve/ResourceContainerTest.php b/tests/DocScan/Session/Retrieve/ResourceContainerTest.php index dbc8c2c3..dd19eeb5 100644 --- a/tests/DocScan/Session/Retrieve/ResourceContainerTest.php +++ b/tests/DocScan/Session/Retrieve/ResourceContainerTest.php @@ -129,4 +129,46 @@ public function shouldFilterZoomLivenessResources(): void $this->assertCount(3, $result->getLivenessCapture()); $this->assertCount(2, $result->getZoomLivenessResources()); } + + /** + * @test + * @covers ::__construct + * @covers ::parseShareCodes + * @covers ::getShareCodes + */ + public function shouldParseShareCodes(): void + { + $input = [ + 'share_codes' => [ + [ + 'id' => 'share_code_id_1', + 'source' => 'some_source', + 'created_at' => '2021-01-01T00:00:00.000Z', + 'last_updated' => '2021-01-01T00:00:00.000Z', + ], + [ + 'id' => 'share_code_id_2', + 'source' => 'another_source', + ], + ], + ]; + + $result = new ResourceContainer($input); + + $this->assertCount(2, $result->getShareCodes()); + } + + /** + * @test + * @covers ::__construct + * @covers ::getShareCodes + */ + public function shouldHandleMissingShareCodes(): void + { + $input = []; + + $result = new ResourceContainer($input); + + $this->assertCount(0, $result->getShareCodes()); + } } diff --git a/tests/DocScan/Session/Retrieve/ShareCodeResourceResponseTest.php b/tests/DocScan/Session/Retrieve/ShareCodeResourceResponseTest.php new file mode 100644 index 00000000..c4337e8c --- /dev/null +++ b/tests/DocScan/Session/Retrieve/ShareCodeResourceResponseTest.php @@ -0,0 +1,187 @@ + self::SOME_ID, + 'source' => [ + 'type' => self::SOME_SOURCE, + ], + 'created_at' => self::SOME_CREATED_AT, + 'last_updated' => self::SOME_LAST_UPDATED, + ]; + + $shareCodeResource = new ShareCodeResourceResponse($shareCodeData); + + $this->assertEquals(self::SOME_ID, $shareCodeResource->getId()); + $this->assertInstanceOf(\DateTime::class, $shareCodeResource->getCreatedAt()); + $this->assertInstanceOf(\DateTime::class, $shareCodeResource->getLastUpdated()); + } + + /** + * @test + * @covers ::__construct + * @covers ::getLookupProfileMedia + * @covers ::getReturnedProfileMedia + * @covers ::getIdPhotoMedia + * @covers ::getFileMedia + * @covers \Yoti\DocScan\Session\Retrieve\ResourceResponse::__construct + */ + public function shouldParseMediaFields() + { + $shareCodeData = [ + 'id' => self::SOME_ID, + 'source' => [ + 'type' => self::SOME_SOURCE, + ], + 'lookup_profile' => [ + 'media' => [ + 'id' => 'lookup_profile_media_id', + 'type' => 'JSON', + ], + ], + 'returned_profile' => [ + 'media' => [ + 'id' => 'returned_profile_media_id', + 'type' => 'JSON', + ], + ], + 'id_photo' => [ + 'media' => [ + 'id' => 'id_photo_media_id', + 'type' => 'IMAGE', + ], + ], + 'file' => [ + 'media' => [ + 'id' => 'file_media_id', + 'type' => 'PDF', + ], + ], + ]; + + $shareCodeResource = new ShareCodeResourceResponse($shareCodeData); + + $this->assertNotNull($shareCodeResource->getLookupProfileMedia()); + $this->assertEquals('lookup_profile_media_id', $shareCodeResource->getLookupProfileMedia()->getId()); + + $this->assertNotNull($shareCodeResource->getReturnedProfileMedia()); + $this->assertEquals('returned_profile_media_id', $shareCodeResource->getReturnedProfileMedia()->getId()); + + $this->assertNotNull($shareCodeResource->getIdPhotoMedia()); + $this->assertEquals('id_photo_media_id', $shareCodeResource->getIdPhotoMedia()->getId()); + + $this->assertNotNull($shareCodeResource->getFileMedia()); + $this->assertEquals('file_media_id', $shareCodeResource->getFileMedia()->getId()); + } + + /** + * @test + * @covers ::__construct + * @covers ::getLookupProfileMedia + * @covers ::getReturnedProfileMedia + * @covers ::getIdPhotoMedia + * @covers ::getFileMedia + * @covers \Yoti\DocScan\Session\Retrieve\ResourceResponse::__construct + */ + public function shouldHandleMissingMediaFields() + { + $shareCodeData = [ + 'id' => self::SOME_ID, + 'source' => [ + 'type' => self::SOME_SOURCE, + ], + ]; + + $shareCodeResource = new ShareCodeResourceResponse($shareCodeData); + + $this->assertNull($shareCodeResource->getLookupProfileMedia()); + $this->assertNull($shareCodeResource->getReturnedProfileMedia()); + $this->assertNull($shareCodeResource->getIdPhotoMedia()); + $this->assertNull($shareCodeResource->getFileMedia()); + } + + /** + * @test + * @covers ::__construct + * @covers ::getVerifyShareCodeTasks + * @covers \Yoti\DocScan\Session\Retrieve\ResourceResponse::__construct + * @covers \Yoti\DocScan\Session\Retrieve\ResourceResponse::getTasks + * @covers \Yoti\DocScan\Session\Retrieve\ResourceResponse::filterTasksByType + * @covers \Yoti\DocScan\Session\Retrieve\ResourceResponse::createTaskFromArray + */ + public function shouldParseVerifyShareCodeTasks() + { + $shareCodeData = [ + 'id' => self::SOME_ID, + 'source' => [ + 'type' => self::SOME_SOURCE, + ], + 'tasks' => [ + [ + 'type' => 'VERIFY_SHARE_CODE_TASK', + 'id' => 'task_id_1', + 'state' => 'DONE', + ], + [ + 'type' => 'VERIFY_SHARE_CODE_TASK', + 'id' => 'task_id_2', + 'state' => 'PENDING', + ], + ], + ]; + + $shareCodeResource = new ShareCodeResourceResponse($shareCodeData); + + $this->assertCount(2, $shareCodeResource->getTasks()); + $this->assertCount(2, $shareCodeResource->getVerifyShareCodeTasks()); + $this->assertInstanceOf(VerifyShareCodeTaskResponse::class, $shareCodeResource->getVerifyShareCodeTasks()[0]); + } + + /** + * @test + * @covers ::__construct + * @covers ::getVerifyShareCodeTasks + * @covers \Yoti\DocScan\Session\Retrieve\ResourceResponse::__construct + * @covers \Yoti\DocScan\Session\Retrieve\ResourceResponse::filterTasksByType + */ + public function shouldHandleMissingTasks() + { + $shareCodeData = [ + 'id' => self::SOME_ID, + 'source' => [ + 'type' => self::SOME_SOURCE, + ], + ]; + + $shareCodeResource = new ShareCodeResourceResponse($shareCodeData); + + $this->assertCount(0, $shareCodeResource->getVerifyShareCodeTasks()); + } +}