"""Test SAP service helpers.""" from collections.abc import Generator from typing import Any from unittest.mock import call, patch import pytest from sync_contract_sap import constants, sap_service @pytest.fixture(autouse=True) def clear_auth_cache() -> Generator[None, None, None]: """Reset the cached basic-auth object between tests.""" sap_service.get_sap_basic_auth.cache_clear() yield sap_service.get_sap_basic_auth.cache_clear() @patch('sync_contract_sap.sap_service.HTTPBasicAuth') @patch('sync_contract_sap.sap_service.aws') def test_get_sap_basic_auth(mock_aws: Any, mock_basic_auth: Any) -> None: """Test creation of basic auth header object.""" get_secret_calls = [ call( mock_aws.get_secrets_manager_client.return_value, constants.SAP_AUTH_USERNAME_SECRET, ), call( mock_aws.get_secrets_manager_client.return_value, constants.SAP_AUTH_PASSWORD_SECRET, ), ] mock_aws.get_secret.side_effect = ['username', 'password'] sap_service.get_sap_basic_auth() mock_aws.get_secrets_manager_client.assert_called_once() mock_aws.get_secret.assert_has_calls(get_secret_calls) mock_basic_auth.assert_called_once_with('username', 'password') @patch('sync_contract_sap.sap_service.HTTPBasicAuth') @patch('sync_contract_sap.sap_service.aws') def test_get_sap_basic_auth_is_cached(mock_aws: Any, mock_basic_auth: Any) -> None: """Test repeated calls reuse the cached auth without re-fetching secrets.""" mock_aws.get_secret.side_effect = ['username', 'password'] first = sap_service.get_sap_basic_auth() second = sap_service.get_sap_basic_auth() assert first is second mock_aws.get_secrets_manager_client.assert_called_once() assert mock_aws.get_secret.call_count == 2