From 232a4e0c2ec66abb787cc77d10c0afc59e5d0d68 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 5 Jul 2022 15:56:43 +0200 Subject: [PATCH 2/3] tests: refactor EmailValidator tests (#62354) --- tests/test_validators.py | 125 +++++++++++++++++++-------------------- 1 file changed, 61 insertions(+), 64 deletions(-) diff --git a/tests/test_validators.py b/tests/test_validators.py index 9a319e3c..73cb2e2c 100644 --- a/tests/test_validators.py +++ b/tests/test_validators.py @@ -56,80 +56,77 @@ def test_digits_password_policy(settings): validate_password('12345678') -@pytest.mark.parametrize( - 'email', - [ - 'nok', - '@nok.com', - 'foo@bar\x00', - 'foo&@bar', - '|a@nok.com', - 'a/../b@nok.com', - 'a%b@nok.com', - 'a!b@nok.com', - 'a#b@nok.com', - 'a&b@nok.com', - 'a?b@nok.com', - ], -) -def test_email_validator_nok(email): - with pytest.raises(ValidationError): - EmailValidator()(email) - - -@pytest.mark.parametrize('email', ['ok@ok.com', 'a|b@ok.com']) -def test_email_validator_ok(email): - EmailValidator()(email) - - -def test_email_validator_domain(settings): - settings.A2_VALIDATE_EMAIL_DOMAIN = True - with mock.patch('authentic2.validators.EmailValidator.query_mxs', return_value=[]) as query_mxs: +class TestEmailValidator: + @pytest.mark.parametrize( + 'bad_email', + [ + 'nok', + '@nok.com', + 'foo@bar\x00', + 'foo&@bar', + '|a@nok.com', + 'a/../b@nok.com', + 'a%b@nok.com', + 'a!b@nok.com', + 'a#b@nok.com', + 'a&b@nok.com', + 'a?b@nok.com', + ], + ) + def test_bad_email(self, bad_email): with pytest.raises(ValidationError): + EmailValidator()(bad_email) + + @pytest.mark.parametrize('good_email', ['ok@ok.com', 'a|b@ok.com']) + def test_good_email(self, good_email): + EmailValidator()(good_email) + + def test_validate_email_domain(self, settings): + settings.A2_VALIDATE_EMAIL_DOMAIN = True + with mock.patch('authentic2.validators.EmailValidator.query_mxs', return_value=[]) as query_mxs: + with pytest.raises(ValidationError): + EmailValidator()('ok@ok.com') + assert query_mxs.call_count == 1 + with mock.patch('authentic2.validators.EmailValidator.query_mxs', return_value=['ok']) as query_mxs: EmailValidator()('ok@ok.com') - assert query_mxs.call_count == 1 - with mock.patch('authentic2.validators.EmailValidator.query_mxs', return_value=['ok']) as query_mxs: - EmailValidator()('ok@ok.com') - assert query_mxs.call_count == 1 + assert query_mxs.call_count == 1 + @pytest.fixture + def smtp(self): + def __enter__(self): + return self -@pytest.fixture -def smtp(): - def __enter__(self): - return self + def __exit__(self, *args): + return None - def __exit__(self, *args): - return None + smtp = mock.Mock() + smtp.helo.return_value = 250, None + smtp.__enter__ = __enter__ + smtp.__exit__ = __exit__ + with mock.patch('smtplib.SMTP', return_value=smtp): + yield smtp - smtp = mock.Mock() - smtp.helo.return_value = 250, None - smtp.__enter__ = __enter__ - smtp.__exit__ = __exit__ - with mock.patch('smtplib.SMTP', return_value=smtp): - yield smtp + def test_rcpt_check(self, settings, smtp): + settings.A2_VALIDATE_EMAIL_DOMAIN = True + settings.A2_VALIDATE_EMAIL = True + validator = EmailValidator(rcpt_check=True) -def test_email_validator_rcpt_check(settings, smtp): - settings.A2_VALIDATE_EMAIL_DOMAIN = True - settings.A2_VALIDATE_EMAIL = True - - validator = EmailValidator(rcpt_check=True) + with mock.patch('authentic2.validators.EmailValidator.query_mxs', return_value=['ok']): + smtp.rcpt.return_value = 100, None + validator('ok@ok.com') - with mock.patch('authentic2.validators.EmailValidator.query_mxs', return_value=['ok']): - smtp.rcpt.return_value = 100, None - validator('ok@ok.com') + smtp.rcpt.return_value = 500, None + with pytest.raises(ValidationError): + validator('ok@ok.com') - smtp.rcpt.return_value = 500, None - with pytest.raises(ValidationError): + smtp.rcpt.return_value = 100, None + smtp.rcpt.side_effect = smtplib.SMTPServerDisconnected validator('ok@ok.com') - smtp.rcpt.return_value = 100, None - smtp.rcpt.side_effect = smtplib.SMTPServerDisconnected - validator('ok@ok.com') - - smtp.rcpt.return_value = 100, None - smtp.connect.side_effect = smtplib.SMTPConnectError(1, 2) - validator('ok@ok.com') + smtp.rcpt.return_value = 100, None + smtp.connect.side_effect = smtplib.SMTPConnectError(1, 2) + validator('ok@ok.com') - assert smtp.connect.call_count == 4 - assert smtp.rcpt.call_count == 3 + assert smtp.connect.call_count == 4 + assert smtp.rcpt.call_count == 3 -- 2.35.1