fix bug sms
This commit is contained in:
1 parent
48d0ecba79
commit
ae4dbab3cc
5 files changed
+93
-13
No files matched your search
@@ -1,14 +1,62 @@
|
||||
"""Customer OTP journey, repeat submits, and recoverable failure contracts."""
|
||||
from datetime import timedelta
|
||||
from unittest.mock import patch
|
||||
from unittest.mock import Mock, patch
|
||||
|
||||
from django.test import override_settings
|
||||
from django.utils import timezone
|
||||
import requests
|
||||
|
||||
from apps.cuser.models import SmsOpt
|
||||
from apps.jwt_auth.test_regressions import RegressionFixtures
|
||||
|
||||
|
||||
class CustomerLoginTests(RegressionFixtures):
|
||||
def test_unrecognized_provider_reply_keeps_delivered_code_usable(self):
|
||||
for body in ('1', '654321987', '<string>accepted</string>', ''):
|
||||
with self.subTest(body=body):
|
||||
SmsOpt.objects.all().delete()
|
||||
with patch('utils.services.sms.requests.get', return_value=Mock(text=body)):
|
||||
sent = self.post('login/mobile/', {'mobile': self.user.mobile})
|
||||
self.assertEqual(sent.status_code, 202)
|
||||
self.assertEqual(sent.data['result']['delivery_status'], 'unconfirmed')
|
||||
code = SmsOpt.objects.get(mobile=self.user.mobile).opt
|
||||
verified = self.post('login/mobile/verify/', {'mobile': self.user.mobile, 'opt': code})
|
||||
self.assertEqual(verified.status_code, 200)
|
||||
self.assertEqual(self.post('token/', {'uuid_opt': verified.data[0]['uuid']}).status_code, 200)
|
||||
|
||||
def test_lost_provider_reply_keeps_code_and_still_throttles_repeat_sms(self):
|
||||
for error in (requests.Timeout, requests.ConnectionError):
|
||||
with self.subTest(error=error):
|
||||
SmsOpt.objects.all().delete()
|
||||
with patch('utils.services.sms.requests.get', side_effect=error) as send:
|
||||
sent = self.post('login/mobile/', {'mobile': self.user.mobile})
|
||||
self.assertEqual(sent.status_code, 202)
|
||||
self.assertEqual(self.post('login/mobile/', {'mobile': self.user.mobile}).status_code, 429)
|
||||
send.assert_called_once()
|
||||
code = SmsOpt.objects.get().opt
|
||||
self.assertEqual(self.post('login/mobile/verify/', {'mobile': self.user.mobile, 'opt': code}).status_code, 200)
|
||||
|
||||
def test_uncertain_resend_retains_previous_delivered_code(self):
|
||||
original = self.otp()
|
||||
SmsOpt.objects.filter(pk=original.pk).update(created_at=timezone.now() - timedelta(seconds=61))
|
||||
with patch('utils.services.sms.requests.get', return_value=Mock(text='unexpected')):
|
||||
self.assertEqual(self.post('login/mobile/', {'mobile': self.user.mobile}).status_code, 202)
|
||||
self.assertEqual(SmsOpt.objects.filter(mobile=self.user.mobile).count(), 2)
|
||||
self.assertEqual(self.post('login/mobile/verify/', {'mobile': self.user.mobile, 'opt': original.opt}).status_code, 200)
|
||||
self.assertFalse(SmsOpt.objects.filter(mobile=self.user.mobile).exists())
|
||||
|
||||
@override_settings(SMS_SUCCESS_CODES='0,1', SMS_FAILURE_CODES='error,-1')
|
||||
def test_configured_response_codes_and_explicit_rejection(self):
|
||||
with patch('utils.services.sms.requests.get', return_value=Mock(text='\ufeff1\r\n')):
|
||||
sent = self.post('login/mobile/', {'mobile': self.user.mobile})
|
||||
self.assertEqual(sent.status_code, 200)
|
||||
self.assertEqual(sent.data['result']['delivery_status'], 'accepted')
|
||||
original = SmsOpt.objects.get()
|
||||
SmsOpt.objects.filter(pk=original.pk).update(created_at=timezone.now() - timedelta(seconds=61))
|
||||
with patch('utils.services.sms.requests.get', return_value=Mock(text='-1')):
|
||||
self.assertEqual(self.post('login/mobile/', {'mobile': self.user.mobile}).status_code, 503)
|
||||
self.assertEqual(SmsOpt.objects.get().pk, original.pk)
|
||||
|
||||
def test_complete_customer_journey_login_refresh_and_logout(self):
|
||||
with patch('apps.jwt_auth.services.DefaultSmsProvider.send_sms', return_value=True) as send:
|
||||
sent = self.post('login/mobile/', {'mobile': '۰۹۱۲۳۴۵۶۷۸۹'})
|
||||
|
||||
Reference in new issue
Block a user