"""Tests for the Vies API wsdl client.""" from unittest import mock from unittest.mock import MagicMock from marshmallow import ValidationError import pytest from payee.connectors.vies_api import Vies from payee.constants.error import ERROR_VAT_VIES_API_CHECK_FAILED, ERROR_VIES_API_ERROR from payee.utils.exception import ViesApiException CORRECT_VALID_SI_VAT = 'SI64875318' CORRECT_NOT_VALID_SI_VAT = 'SI64875319' CORRECT_VALID_GB_VAT = 'GB821018768' CORRECT_VALID_XI_VAT = 'XI432525179' CORRECT_NOT_VALID_XI_VAT = 'XI821018769' ERROR_COUNTRY_CODE_VAT = 'US821018768' CORRECT_GB_WITHOUT_PREFIX_VAT = '821018768' @pytest.mark.parametrize( 'vat', [ERROR_COUNTRY_CODE_VAT, CORRECT_VALID_GB_VAT, CORRECT_GB_WITHOUT_PREFIX_VAT] ) def test_validate_vat_number_error_regex_format(vat): """Test local Vies RegEx for validate EU VAT format.""" with pytest.raises(Exception) as excinfo: Vies().request(vat) assert ERROR_VAT_VIES_API_CHECK_FAILED == str(excinfo.value) @pytest.mark.parametrize('vat', [CORRECT_NOT_VALID_SI_VAT, CORRECT_NOT_VALID_XI_VAT]) @mock.patch('payee.connectors.vies_api.zeep.Client') def test_validate_vat_number_api_call_not_valid_vat(mock_zeep, vat): """Test external Vies API for validate VAT format.""" mock_zeep.return_value = MagicMock( service=MagicMock(checkVatApprox=MagicMock(return_value={'valid': False})) ) with pytest.raises(ValidationError) as excinfo: Vies().request(vat) assert ERROR_VAT_VIES_API_CHECK_FAILED == str(excinfo.value) @pytest.mark.parametrize('vat', [CORRECT_VALID_SI_VAT, CORRECT_VALID_XI_VAT]) @mock.patch('payee.connectors.vies_api.zeep.Client') def test_validate_vat_number_api_call_valid_vat(mock_zeep, vat): """Test external Vies API for validate VAT format.""" mock_zeep.return_value = MagicMock( service=MagicMock(checkVatApprox=MagicMock(return_value={'valid': True})) ) res = Vies().request(vat) assert res @pytest.mark.parametrize('vat', [CORRECT_NOT_VALID_SI_VAT, CORRECT_NOT_VALID_XI_VAT]) @mock.patch('payee.connectors.vies_api.sentry.send_to_sentry') @mock.patch( 'payee.connectors.vies_api.zeep.Client', side_effect=Exception('API not reachable!') ) def test_validate_vat_number_api_error(mock_zeep, mock_sentry, vat): """Test external Vies API for validate VAT format. Don't block saving if API is unavailable. """ with pytest.raises(ViesApiException) as excinfo: Vies().request(vat) assert ERROR_VIES_API_ERROR.format(error='API not reachable!') == str(excinfo.value) mock_sentry.assert_called_once()