Skip to content

Commit 4aa5d47

Browse files
committed
Raise ValidationError for dupe RelayNumber.number
1 parent e9f5b57 commit 4aa5d47

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

phones/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,9 @@ def save(self, *args, **kwargs):
215215
elif existing_numbers.exists():
216216
raise ValidationError("User can have only one relay number.")
217217

218+
if RelayNumber.objects.filter(number=self.number).exists():
219+
raise ValidationError("This number is already claimed.")
220+
218221
# Before saving into DB provision the number in Twilio
219222
phones_config = apps.get_app_config("phones")
220223
client = twilio_client()

phones/tests/models_tests.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,42 @@ def test_create_relaynumber_when_user_already_has_one_raises_error(
213213
mock_messages_create.assert_not_called()
214214

215215

216+
def test_create_duplicate_relaynumber_raises_error(phone_user, mocked_twilio_client):
217+
mock_twilio_client = mocked_twilio_client
218+
mock_messages_create = mock_twilio_client.messages.create
219+
mock_number_create = mock_twilio_client.incoming_phone_numbers.create
220+
221+
real_phone = "+12223334444"
222+
RealPhone.objects.create(user=phone_user, verified=True, number=real_phone)
223+
mock_messages_create.assert_called_once()
224+
mock_messages_create.reset_mock()
225+
226+
relay_number = "+19998887777"
227+
relay_number_obj = RelayNumber.objects.create(user=phone_user, number=relay_number)
228+
229+
mock_number_create.assert_called_once()
230+
call_kwargs = mock_number_create.call_args.kwargs
231+
assert call_kwargs["phone_number"] == relay_number
232+
assert call_kwargs["sms_application_sid"] == settings.TWILIO_SMS_APPLICATION_SID
233+
assert call_kwargs["voice_application_sid"] == settings.TWILIO_SMS_APPLICATION_SID
234+
235+
mock_messages_create.assert_called_once()
236+
mock_number_create.reset_mock()
237+
mock_messages_create.reset_mock()
238+
239+
second_user = make_phone_test_user()
240+
second_phone = "+15553334444"
241+
RealPhone.objects.create(user=second_user, verified=True, number=second_phone)
242+
mock_messages_create.assert_called_once()
243+
mock_messages_create.reset_mock()
244+
245+
with pytest.raises(ValidationError) as exc_info:
246+
RelayNumber.objects.create(user=second_user, number=relay_number)
247+
assert exc_info.value.message == "This number is already claimed."
248+
mock_number_create.assert_not_called()
249+
mock_messages_create.assert_not_called()
250+
251+
216252
def test_create_relaynumber_creates_twilio_incoming_number_and_sends_welcome(
217253
phone_user, mocked_twilio_client
218254
):

0 commit comments

Comments
 (0)