From b3fb463d3541888413e7ba12dd46104e0c317b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armando=20Rodr=C3=ADguez?= <127134616+armando-rodriguez-cko@users.noreply.github.com> Date: Wed, 29 Jul 2026 17:40:00 +0200 Subject: [PATCH] feat(identities): add Address Document Verification (Adv) endpoints Implements the Adv* family from swagger 2026-07-16 (INT-1665): POST/GET /address-document-verifications, anonymize, attempts (create/list/get) and pdf-report. Reuses identity-verification scope. - AddressDocumentVerificationClient with 7 methods - AddressDocumentVerificationRequest + AddressDocumentVerificationAttemptRequest - Exposed on CheckoutApi via the identity API client - Client tests --- checkout_sdk/checkout_api.py | 4 ++ .../addressdocumentverification/__init__.py | 0 .../addressdocumentverification.py | 15 +++++ .../addressdocumentverification_client.py | 63 ++++++++++++++++++ .../addressdocumentverification/__init__.py | 0 ...addressdocumentverification_client_test.py | 64 +++++++++++++++++++ 6 files changed, 146 insertions(+) create mode 100644 checkout_sdk/identities/addressdocumentverification/__init__.py create mode 100644 checkout_sdk/identities/addressdocumentverification/addressdocumentverification.py create mode 100644 checkout_sdk/identities/addressdocumentverification/addressdocumentverification_client.py create mode 100644 tests/identities/addressdocumentverification/__init__.py create mode 100644 tests/identities/addressdocumentverification/addressdocumentverification_client_test.py diff --git a/checkout_sdk/checkout_api.py b/checkout_sdk/checkout_api.py index 7ba32cc9..1e89742e 100644 --- a/checkout_sdk/checkout_api.py +++ b/checkout_sdk/checkout_api.py @@ -33,6 +33,8 @@ from checkout_sdk.identities.amlscreening.amlscreening_client import AmlScreeningClient from checkout_sdk.identities.faceauthentication.faceauthentication_client import FaceAuthenticationClient from checkout_sdk.identities.iddocumentverification.iddocumentverification_client import IdDocumentVerificationClient +from checkout_sdk.identities.addressdocumentverification.addressdocumentverification_client import \ + AddressDocumentVerificationClient from checkout_sdk.identities.applicants.applicants_client import ApplicantsClient from checkout_sdk.identities.identityverification.identityverification_client import IdentityVerificationClient from checkout_sdk.networktokens.network_tokens_client import NetworkTokensClient @@ -111,6 +113,8 @@ def __init__(self, configuration: CheckoutConfiguration): self.face_authentication = FaceAuthenticationClient(api_client=identity_api_client, configuration=configuration) self.id_document_verification = IdDocumentVerificationClient(api_client=identity_api_client, configuration=configuration) + self.address_document_verification = AddressDocumentVerificationClient(api_client=identity_api_client, + configuration=configuration) self.applicants = ApplicantsClient(api_client=identity_api_client, configuration=configuration) self.identity_verification = IdentityVerificationClient(api_client=identity_api_client, configuration=configuration) diff --git a/checkout_sdk/identities/addressdocumentverification/__init__.py b/checkout_sdk/identities/addressdocumentverification/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/checkout_sdk/identities/addressdocumentverification/addressdocumentverification.py b/checkout_sdk/identities/addressdocumentverification/addressdocumentverification.py new file mode 100644 index 00000000..5f52f070 --- /dev/null +++ b/checkout_sdk/identities/addressdocumentverification/addressdocumentverification.py @@ -0,0 +1,15 @@ +from __future__ import absolute_import + + +class DeclaredData: + name: str + + +class AddressDocumentVerificationRequest: + applicant_id: str + user_journey_id: str + declared_data: DeclaredData + + +class AddressDocumentVerificationAttemptRequest: + document: str diff --git a/checkout_sdk/identities/addressdocumentverification/addressdocumentverification_client.py b/checkout_sdk/identities/addressdocumentverification/addressdocumentverification_client.py new file mode 100644 index 00000000..2a0c0740 --- /dev/null +++ b/checkout_sdk/identities/addressdocumentverification/addressdocumentverification_client.py @@ -0,0 +1,63 @@ +from __future__ import absolute_import + +from checkout_sdk.api_client import ApiClient +from checkout_sdk.authorization_type import AuthorizationType +from checkout_sdk.checkout_configuration import CheckoutConfiguration +from checkout_sdk.client import Client +from checkout_sdk.identities.addressdocumentverification.addressdocumentverification import ( + AddressDocumentVerificationRequest, AddressDocumentVerificationAttemptRequest +) + + +class AddressDocumentVerificationClient(Client): + __ADDRESS_DOCUMENT_VERIFICATIONS_PATH = 'address-document-verifications' + __ANONYMIZE_PATH = 'anonymize' + __ATTEMPTS_PATH = 'attempts' + __PDF_REPORT_PATH = 'pdf-report' + + def __init__(self, api_client: ApiClient, configuration: CheckoutConfiguration): + super().__init__(api_client=api_client, + configuration=configuration, + authorization_type=AuthorizationType.SECRET_KEY_OR_OAUTH) + + def create_address_document_verification(self, request: AddressDocumentVerificationRequest): + return self._api_client.post(self.__ADDRESS_DOCUMENT_VERIFICATIONS_PATH, + self._sdk_authorization(), + request) + + def get_address_document_verification(self, address_document_verification_id: str): + return self._api_client.get( + self.build_path(self.__ADDRESS_DOCUMENT_VERIFICATIONS_PATH, address_document_verification_id), + self._sdk_authorization()) + + def anonymize_address_document_verification(self, address_document_verification_id: str): + return self._api_client.post( + self.build_path(self.__ADDRESS_DOCUMENT_VERIFICATIONS_PATH, address_document_verification_id, + self.__ANONYMIZE_PATH), + self._sdk_authorization()) + + def create_address_document_verification_attempt(self, address_document_verification_id: str, + request: AddressDocumentVerificationAttemptRequest): + return self._api_client.post( + self.build_path(self.__ADDRESS_DOCUMENT_VERIFICATIONS_PATH, address_document_verification_id, + self.__ATTEMPTS_PATH), + self._sdk_authorization(), + request) + + def get_address_document_verification_attempts(self, address_document_verification_id: str): + return self._api_client.get( + self.build_path(self.__ADDRESS_DOCUMENT_VERIFICATIONS_PATH, address_document_verification_id, + self.__ATTEMPTS_PATH), + self._sdk_authorization()) + + def get_address_document_verification_attempt(self, address_document_verification_id: str, attempt_id: str): + return self._api_client.get( + self.build_path(self.__ADDRESS_DOCUMENT_VERIFICATIONS_PATH, address_document_verification_id, + self.__ATTEMPTS_PATH, attempt_id), + self._sdk_authorization()) + + def get_address_document_verification_report(self, address_document_verification_id: str): + return self._api_client.get( + self.build_path(self.__ADDRESS_DOCUMENT_VERIFICATIONS_PATH, address_document_verification_id, + self.__PDF_REPORT_PATH), + self._sdk_authorization()) diff --git a/tests/identities/addressdocumentverification/__init__.py b/tests/identities/addressdocumentverification/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/identities/addressdocumentverification/addressdocumentverification_client_test.py b/tests/identities/addressdocumentverification/addressdocumentverification_client_test.py new file mode 100644 index 00000000..56cd913d --- /dev/null +++ b/tests/identities/addressdocumentverification/addressdocumentverification_client_test.py @@ -0,0 +1,64 @@ +import pytest + +from tests._assertions import assert_api_call +from checkout_sdk.identities.addressdocumentverification.addressdocumentverification import ( + AddressDocumentVerificationRequest, AddressDocumentVerificationAttemptRequest +) +from checkout_sdk.identities.addressdocumentverification.addressdocumentverification_client import \ + AddressDocumentVerificationClient + + +@pytest.fixture(scope='class') +def client(mock_sdk_configuration, mock_api_client): + return AddressDocumentVerificationClient(api_client=mock_api_client, configuration=mock_sdk_configuration) + + +class TestAddressDocumentVerificationClient: + + def test_should_create_address_document_verification(self, mocker, client: AddressDocumentVerificationClient): + mock = mocker.patch('checkout_sdk.api_client.ApiClient.post', return_value='response') + body = AddressDocumentVerificationRequest() + + assert client.create_address_document_verification(body) == 'response' + assert_api_call(mock, 'address-document-verifications', body) + + def test_should_get_address_document_verification(self, mocker, client: AddressDocumentVerificationClient): + mock = mocker.patch('checkout_sdk.api_client.ApiClient.get', return_value='response') + + assert client.get_address_document_verification('adv_12345') == 'response' + assert_api_call(mock, 'address-document-verifications/adv_12345') + + def test_should_anonymize_address_document_verification(self, mocker, client: AddressDocumentVerificationClient): + mock = mocker.patch('checkout_sdk.api_client.ApiClient.post', return_value='response') + + assert client.anonymize_address_document_verification('adv_12345') == 'response' + assert_api_call(mock, 'address-document-verifications/adv_12345/anonymize') + + def test_should_create_address_document_verification_attempt(self, mocker, + client: AddressDocumentVerificationClient): + mock = mocker.patch('checkout_sdk.api_client.ApiClient.post', return_value='response') + body = AddressDocumentVerificationAttemptRequest() + + assert client.create_address_document_verification_attempt('adv_12345', body) == 'response' + assert_api_call(mock, 'address-document-verifications/adv_12345/attempts', body) + + def test_should_get_address_document_verification_attempts(self, mocker, + client: AddressDocumentVerificationClient): + mock = mocker.patch('checkout_sdk.api_client.ApiClient.get', return_value='response') + + assert client.get_address_document_verification_attempts('adv_12345') == 'response' + assert_api_call(mock, 'address-document-verifications/adv_12345/attempts') + + def test_should_get_address_document_verification_attempt(self, mocker, + client: AddressDocumentVerificationClient): + mock = mocker.patch('checkout_sdk.api_client.ApiClient.get', return_value='response') + + assert client.get_address_document_verification_attempt('adv_12345', 'adva_67890') == 'response' + assert_api_call(mock, 'address-document-verifications/adv_12345/attempts/adva_67890') + + def test_should_get_address_document_verification_report(self, mocker, + client: AddressDocumentVerificationClient): + mock = mocker.patch('checkout_sdk.api_client.ApiClient.get', return_value='response') + + assert client.get_address_document_verification_report('adv_12345') == 'response' + assert_api_call(mock, 'address-document-verifications/adv_12345/pdf-report')