def validate_and_normalize(account: Dict, country_code: str) -> Dict: if not country_code or country_code not in ['SE', 'NO']: raise _exception('Missing country_code') try: account_no = account['account_number'] clearing_no: Optional[str] = account.get('clearing_number') bank_id: int = account['bank_id'] bank_name: str = account['bank_name'] if not bank_id or type(bank_id) is not int: raise _exception('bank_id is not int') if not bank_name or type(bank_name) is not str: raise _exception('bank_name is not str') if not account_no: raise _exception('Missing account_number') if country_code == 'SE': if not clearing_no: return _exception('Missing clearing_number') clearing_no, account_no = format_bank_account_se( clearing_no, account_no) try: bankkonto.validate(clearing_no, account_no) except bankkonto.exceptions.SwedbankBankkontoValidationError: if len(account_no) == 10: raise _exception( 'invalid control digit for Swedbank account - please double check.' ) raise _exception('invalid account length for Swedbank account') except (bankkonto.exceptions.BankkontoValidationError, BankkontoValidationError) as e: raise _exception(str(e)) except Exception: raise _exception('Account validation error') elif country_code == 'NO': if clearing_no: raise _exception(f'Clearing number is not supported in NO') clearing_no = None account_no = format_bank_account_no(account_no) if len(account_no) != 11: raise _exception( f'Required length of account number in NO is 11 digits not {len(account_no)}' ) else: raise _exception('Not a supported country for account validation.') except ValueError as e: raise e except Exception as e: raise _exception(str(e)) return { 'bank_id': bank_id, 'bank_name': bank_name, 'clearing_number': clearing_no, 'account_number': account_no, }
def test_validation_fails(clearing_number, bank_account_number): with pytest.raises(BankkontoValidationError): assert validate(clearing_number, bank_account_number)
def test_validation_ok(clearing_number, bank_account_number): assert validate(clearing_number, bank_account_number)
def __call__(self, form, field): cn, bn = bankkonto.clean_and_split(field.data) try: out = bankkonto.validate(cn, bn) except bankkonto.BankkontoValidationError as e: raise ValidationError(str(e))