tests/password_reset: deprecate httmock (#85304)

This commit is contained in:
Paul Marillonnet 2024-01-11 17:17:19 +01:00
parent 37c5ffb013
commit 047e6f5d3c
1 changed files with 26 additions and 36 deletions

View File

@ -17,10 +17,10 @@
import json
import pytest
import responses
from django.contrib.auth import authenticate
from django.test.utils import override_settings
from django.urls import reverse
from httmock import HTTMock, remember_called, urlmatch
from authentic2.apps.authenticators.models import LoginPasswordAuthenticator
from authentic2.models import Attribute, SMSCode, Token
@ -29,18 +29,6 @@ from authentic2.utils.misc import send_password_reset_mail
from . import utils
@urlmatch(netloc='foo.whatever.none')
@remember_called
def sms_service_mock(url, request):
return {
'content': {},
'headers': {
'content-type': 'application/json',
},
'status_code': 200,
}
def test_send_password_reset_email(app, simple_user, mailoutbox):
assert len(mailoutbox) == 0
with utils.run_on_commit_hooks():
@ -94,10 +82,12 @@ def test_send_password_reset_erroneous_input(app, nomail_user, settings, phone_a
)
@responses.activate
def test_send_password_reset_by_sms_code(app, nomail_user, settings, phone_activated_authn):
nomail_user.attributes.phone = '+33123456789'
nomail_user.save()
settings.SMS_URL = 'https://foo.whatever.none/'
rsps = responses.post('https://foo.whatever.none/', status=200)
code_length = settings.SMS_CODE_LENGTH
assert not SMSCode.objects.count()
@ -106,11 +96,11 @@ def test_send_password_reset_by_sms_code(app, nomail_user, settings, phone_activ
url = reverse('password_reset')
resp = app.get(url, status=200)
resp.form.set('phone_1', '0123456789')
with HTTMock(sms_service_mock):
resp = resp.form.submit().follow().maybe_follow()
body = json.loads(sms_service_mock.call['requests'][0].body)
resp = resp.form.submit().follow().maybe_follow()
body = json.loads(rsps.calls[-1].request.body)
assert body['message'].startswith('Your code is')
code = SMSCode.objects.get()
assert rsps.call_count == 1
assert body['message'][-code_length:] == code.value
assert ('Your code is valid for the next %s minute' % (SMSCode.CODE_DURATION // 60)) in resp.text
assert 'The code you received by SMS.' in resp.text
@ -121,9 +111,8 @@ def test_send_password_reset_by_sms_code(app, nomail_user, settings, phone_activ
assert authenticate(username='user', password='1234==aA') is None
resp.form.set('new_password1', '1234==aA')
resp.form.set('new_password2', '1234==aA')
with HTTMock(sms_service_mock):
resp.form.submit()
assert sms_service_mock.call['count'] == 1
resp.form.submit()
assert rsps.call_count == 2
assert SMSCode.objects.count() == 1 # no new code generated
# verify user is logged
assert str(app.session['_auth_user_id']) == str(nomail_user.pk)
@ -135,6 +124,7 @@ def test_send_password_reset_by_sms_code(app, nomail_user, settings, phone_activ
app.get(url, status=404)
@responses.activate
def test_send_password_reset_by_sms_code_nondefault_attribute(
app, nomail_user, simple_user, settings, phone_activated_authn
):
@ -151,22 +141,22 @@ def test_send_password_reset_by_sms_code_nondefault_attribute(
nomail_user.phone = ''
nomail_user.save()
settings.SMS_URL = 'https://foo.whatever.none/'
rsps = responses.post('https://foo.whatever.none/', status=200)
url = reverse('password_reset')
resp = app.get(url, status=200)
resp.form.set('phone_1', '0122446688')
with HTTMock(sms_service_mock):
resp = resp.form.submit().follow().maybe_follow()
json.loads(sms_service_mock.call['requests'][0].body)
resp = resp.form.submit().follow().maybe_follow()
json.loads(rsps.calls[-1].request.body)
assert rsps.call_count == 1
code = SMSCode.objects.get()
resp.form.set('sms_code', code.value)
resp = resp.form.submit().follow()
resp.form.set('new_password1', '1234==aA')
resp.form.set('new_password2', '1234==aA')
with HTTMock(sms_service_mock):
resp.form.submit()
assert sms_service_mock.call['count'] == 1
resp.form.submit()
assert rsps.call_count == 2
assert SMSCode.objects.count() == 1 # no new code generated
# verify user is logged
assert str(app.session['_auth_user_id']) == str(nomail_user.pk)
@ -183,18 +173,17 @@ def test_send_password_reset_by_sms_code_nondefault_attribute(
url = reverse('password_reset')
resp = app.get(url, status=200)
resp.form.set('phone_1', '0122446677')
with HTTMock(sms_service_mock):
resp = resp.form.submit().follow().maybe_follow()
json.loads(sms_service_mock.call['requests'][0].body)
resp = resp.form.submit().follow().maybe_follow()
json.loads(rsps.calls[-1].request.body)
code = SMSCode.objects.get()
assert rsps.call_count == 3
resp.form.set('sms_code', code.value)
resp = resp.form.submit().follow()
resp.form.set('new_password1', '1234==aA')
resp.form.set('new_password2', '1234==aA')
with HTTMock(sms_service_mock):
resp.form.submit()
assert sms_service_mock.call['count'] == 1
resp.form.submit()
assert rsps.call_count == 4
assert SMSCode.objects.count() == 1 # no new code generated
# verify user is logged
assert str(app.session['_auth_user_id']) == str(simple_user.pk)
@ -206,25 +195,26 @@ def test_send_password_reset_by_sms_code_nondefault_attribute(
app.get(url, status=404)
@responses.activate
def test_send_password_reset_by_sms_code_next_url(app, nomail_user, settings, phone_activated_authn):
nomail_user.attributes.phone = '+33123456789'
nomail_user.save()
settings.SMS_URL = 'https://foo.whatever.none/'
rsps = responses.post('https://foo.whatever.none/', status=200)
resp = app.get('/accounts/consents/').follow()
resp = resp.click('Reset it!')
resp.form.set('phone_1', '0123456789')
with HTTMock(sms_service_mock):
resp = resp.form.submit().follow().maybe_follow()
resp = resp.form.submit().follow().maybe_follow()
assert rsps.call_count == 1
code = SMSCode.objects.get()
resp.form.set('sms_code', code.value)
resp = resp.form.submit().follow()
resp.form.set('new_password1', '1234==aA')
resp.form.set('new_password2', '1234==aA')
with HTTMock(sms_service_mock):
resp = resp.form.submit()
assert sms_service_mock.call['count'] == 1
resp = resp.form.submit()
assert rsps.call_count == 2
assert SMSCode.objects.count() == 1 # no new code generated
user = authenticate(username='user', password='1234==aA')
assert user == nomail_user