from datetime import datetime from unittest import mock import pytest from app.config import Settings from app.connectors.database.types import EmailDomainValidation from app.handlers import ValidateEmailDomainsHandler @pytest.fixture(scope="function") def handler( email_domain_validation_service_mock: mock.MagicMock, snowflake_client_mock: mock.MagicMock, settings: Settings, ) -> ValidateEmailDomainsHandler: return ValidateEmailDomainsHandler( email_domain_validation_service=email_domain_validation_service_mock, snowflake_client=snowflake_client_mock, domains_chunk_size=settings.domains_chunk_size, threads_count=settings.threads_count, ) def test_handler_domain_validation_success( handler: ValidateEmailDomainsHandler, email_domain_validation_service_mock: mock.MagicMock, snowflake_client_mock: mock.MagicMock, ) -> None: email_domain_validation = EmailDomainValidation( email_domain="sonymusic-pde.com", is_valid=None, attempts=0, reason=None, updated_at=datetime.now(), ) snowflake_client_mock.get_domains_to_verify.return_value = [ [email_domain_validation] ] email_domain_validation_service_mock.validate_email_domain.return_value = None handler.handle() snowflake_client_mock.get_domains_to_verify.assert_called() snowflake_client_mock.update_domains.assert_called_with([email_domain_validation]) assert email_domain_validation.attempts == 0 assert email_domain_validation.is_valid is True assert email_domain_validation.reason is None def test_handler_domain_validation_fail( handler: ValidateEmailDomainsHandler, email_domain_validation_service_mock: mock.MagicMock, snowflake_client_mock: mock.MagicMock, ) -> None: email_domain_validation = EmailDomainValidation( email_domain="example.com", is_valid=None, attempts=0, reason=None, updated_at=datetime.now(), ) exception_description = "Domain validation exception" snowflake_client_mock.get_domains_to_verify.return_value = [ [email_domain_validation] ] email_domain_validation_service_mock.validate_email_domain.side_effect = Exception( exception_description ) handler.handle() snowflake_client_mock.get_domains_to_verify.assert_called() snowflake_client_mock.update_domains.assert_called_with([email_domain_validation]) assert email_domain_validation.attempts == 1 assert email_domain_validation.is_valid is False assert email_domain_validation.reason == exception_description