From e225f919d626db35783d26109c83b31d1b78ac54 Mon Sep 17 00:00:00 2001 From: Ananias Carvalho Date: Mon, 6 Jul 2026 15:18:21 +0200 Subject: [PATCH 1/3] tests: Add biometric token endpoint tests --- onfido/models/biometric_token.py | 1 - tests/test_biometric_tokens.py | 194 +++++++++++++++++++++++++++++++ 2 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 tests/test_biometric_tokens.py diff --git a/onfido/models/biometric_token.py b/onfido/models/biometric_token.py index 09a6985..3123c68 100644 --- a/onfido/models/biometric_token.py +++ b/onfido/models/biometric_token.py @@ -102,4 +102,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: # TODO: Rewrite to not use raise_errors BiometricToken.model_rebuild(raise_errors=False) - diff --git a/tests/test_biometric_tokens.py b/tests/test_biometric_tokens.py new file mode 100644 index 0000000..38f7ed0 --- /dev/null +++ b/tests/test_biometric_tokens.py @@ -0,0 +1,194 @@ +import json +from time import sleep +from uuid import uuid4 + +import pytest + +from onfido import ( + ApiException, + ApplicantBuilder, + ApplicantConsentBuilder, + ApplicantConsentName, + BiometricTokenUpdater, + WorkflowRunBuilder, +) +from tests.conftest import create_applicant, upload_live_photo + + +@pytest.fixture(scope="function") +def applicant_id(onfido_api): + applicant = create_applicant( + onfido_api, + ApplicantBuilder( + first_name="First", + last_name="Last", + email="first.last@gmail.com", + consents=[ + ApplicantConsentBuilder( + name=ApplicantConsentName.PRIVACY_NOTICES_READ, + granted=True, + ) + ], + ), + ) + return applicant.id + + +@pytest.fixture(scope="function") +def biometric_workflow_id(): + return "b79dcf69-41a0-412d-b803-d1a618730f72" + + +@pytest.fixture(scope="function") +def biometric_customer_user_id(): + return f"test-user-id-{uuid4()}" + + +@pytest.fixture(scope="function", autouse=True) +def live_photo(onfido_api, applicant_id): + return upload_live_photo(onfido_api, applicant_id) + + +@pytest.fixture(scope="function") +def create_biometric_token( + onfido_api, + applicant_id, + biometric_workflow_id, + biometric_customer_user_id, + live_photo, +): + workflow_run = onfido_api.create_workflow_run( + WorkflowRunBuilder( + applicant_id=applicant_id, + workflow_id=biometric_workflow_id, + customer_user_id=biometric_customer_user_id, + custom_data={ + "media_ids": [ + { + "id": str(live_photo.id), + } + ] + }, + ) + ) + + assert workflow_run.customer_user_id == biometric_customer_user_id + + max_retries = 3 + + # Wait for the biometric token to be created + for _ in range(max_retries + 1): + biometric_tokens = onfido_api.list_biometric_tokens( + biometric_customer_user_id + ) + if biometric_tokens.biometric_tokens: + return biometric_tokens + sleep(2) + + pytest.fail("Biometric tokens were not created in time") + + +@pytest.fixture(scope="function") +def biometric_token(create_biometric_token): + return create_biometric_token.biometric_tokens[0] + + +@pytest.fixture(scope="function") +def biometric_token_id(biometric_token): + token_uuid = biometric_token.uuid + if token_uuid is None: + pytest.fail("Biometric token response did not include a uuid") + + return token_uuid + + +def test_list_biometric_tokens(create_biometric_token): + assert len(create_biometric_token.biometric_tokens) > 0 + assert create_biometric_token.biometric_tokens[0].uuid is not None + assert create_biometric_token.biometric_tokens[0].data.status is not None + + +def test_find_biometric_token(onfido_api, biometric_customer_user_id, biometric_token_id): + biometric_token_response = onfido_api.find_biometric_token( + biometric_customer_user_id, + biometric_token_id, + ) + + assert biometric_token_response.biometric_token.uuid == biometric_token_id + assert biometric_token_response.biometric_token.data.status is not None + + +def test_update_biometric_token_status(onfido_api, biometric_customer_user_id, biometric_token_id): + updated_biometric_token = onfido_api.update_biometric_token( + biometric_customer_user_id, + biometric_token_id, + BiometricTokenUpdater(status="approved"), + ) + + assert updated_biometric_token.biometric_token.uuid == biometric_token_id + assert updated_biometric_token.biometric_token.data.status == "approved" + + +def test_invalidate_biometric_token_success(onfido_api, biometric_customer_user_id, biometric_token_id): + response = onfido_api.invalidate_biometric_token_without_preload_content( + biometric_customer_user_id, + biometric_token_id, + ) + + assert response.status == 200 + + +def test_invalidate_biometric_token_not_found_when_already_deleted( + onfido_api, + biometric_customer_user_id, + biometric_token_id, +): + onfido_api.invalidate_biometric_token_without_preload_content( + biometric_customer_user_id, + biometric_token_id, + ) + + with pytest.raises(ApiException) as exc_info: + onfido_api.invalidate_biometric_token( + biometric_customer_user_id, + biometric_token_id, + ) + + error_response = json.loads(exc_info.value.body) + + assert exc_info.value.status == 404 + assert error_response["error"]["message"] == "Not found" + assert error_response["error"]["type"] == "resource_not_found" + + +def test_invalidate_biometric_tokens_success( + onfido_api, + biometric_customer_user_id, + create_biometric_token, +): + response = onfido_api.invalidate_biometric_tokens_without_preload_content( + biometric_customer_user_id + ) + + assert response.status == 200 + + +def test_invalidate_biometric_tokens_not_found_when_already_deleted( + onfido_api, + biometric_customer_user_id, + create_biometric_token, +): + onfido_api.invalidate_biometric_tokens_without_preload_content( + biometric_customer_user_id + ) + + with pytest.raises(ApiException) as exc_info: + onfido_api.invalidate_biometric_tokens( + biometric_customer_user_id + ) + + error_response = json.loads(exc_info.value.body) + + assert exc_info.value.status == 404 + assert error_response["error"]["message"] == "Not found" + assert error_response["error"]["type"] == "resource_not_found" From c0271804f31a549723c21aecdeeb627e71c51939 Mon Sep 17 00:00:00 2001 From: Ananias Carvalho Date: Tue, 7 Jul 2026 16:11:37 +0200 Subject: [PATCH 2/3] fix: remove edits in the auto-generated biometric_token file --- onfido/models/biometric_token.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/onfido/models/biometric_token.py b/onfido/models/biometric_token.py index 1d06ecf..b75da4b 100644 --- a/onfido/models/biometric_token.py +++ b/onfido/models/biometric_token.py @@ -103,3 +103,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: _obj.additional_properties[_key] = obj.get(_key) return _obj + + From d3e712fbfd6c38f222b4e4c976ba3b8017826573 Mon Sep 17 00:00:00 2001 From: Ananias Carvalho Date: Tue, 7 Jul 2026 17:29:29 +0200 Subject: [PATCH 3/3] refactor: improve the biometric_token tests --- tests/test_biometric_tokens.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/tests/test_biometric_tokens.py b/tests/test_biometric_tokens.py index 38f7ed0..64187a3 100644 --- a/tests/test_biometric_tokens.py +++ b/tests/test_biometric_tokens.py @@ -17,12 +17,13 @@ @pytest.fixture(scope="function") def applicant_id(onfido_api): + unique_suffix = uuid4().hex[:8] applicant = create_applicant( onfido_api, ApplicantBuilder( - first_name="First", - last_name="Last", - email="first.last@gmail.com", + first_name=f"First{unique_suffix}", + last_name=f"Last{unique_suffix}", + email=f"first.last.{unique_suffix}@example.com", consents=[ ApplicantConsentBuilder( name=ApplicantConsentName.PRIVACY_NOTICES_READ, @@ -89,13 +90,8 @@ def create_biometric_token( @pytest.fixture(scope="function") -def biometric_token(create_biometric_token): - return create_biometric_token.biometric_tokens[0] - - -@pytest.fixture(scope="function") -def biometric_token_id(biometric_token): - token_uuid = biometric_token.uuid +def biometric_token_id(create_biometric_token): + token_uuid = create_biometric_token.biometric_tokens[0].uuid if token_uuid is None: pytest.fail("Biometric token response did not include a uuid") @@ -119,14 +115,15 @@ def test_find_biometric_token(onfido_api, biometric_customer_user_id, biometric_ def test_update_biometric_token_status(onfido_api, biometric_customer_user_id, biometric_token_id): + approved_status = "approved" updated_biometric_token = onfido_api.update_biometric_token( biometric_customer_user_id, biometric_token_id, - BiometricTokenUpdater(status="approved"), + BiometricTokenUpdater(status=approved_status), ) assert updated_biometric_token.biometric_token.uuid == biometric_token_id - assert updated_biometric_token.biometric_token.data.status == "approved" + assert updated_biometric_token.biometric_token.data.status == approved_status def test_invalidate_biometric_token_success(onfido_api, biometric_customer_user_id, biometric_token_id):