Added Multiple SMS sender functionality

This commit is contained in:
chrisw
2017-10-24 15:37:44 +01:00
parent 8ec50971eb
commit 4e721c95ce
13 changed files with 638 additions and 229 deletions

View File

@@ -1,78 +1,64 @@
import app
import pytest
from bs4 import BeautifulSoup
from flask import url_for
from notifications_python_client.errors import HTTPError
from tests.conftest import normalize_spaces
def test_set_text_message_sender(
logged_in_client,
mock_update_service,
service_one
def test_set_inbound_sms_sets_a_number_for_service(
logged_in_client,
mock_add_sms_sender,
multiple_available_inbound_numbers,
service_one,
fake_uuid,
mock_no_inbound_number_for_service,
mocker
):
data = {"sms_sender": "elevenchars"}
response = logged_in_client.post(url_for('main.service_set_sms_sender', service_id=service_one['id']),
data=data)
assert response.status_code == 302
assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True)
mocker.patch('app.service_api_client.update_service_with_properties')
data = {
"inbound_number": "781d9c60-7a7e-46b7-9896-7b045b992fa5",
}
mock_update_service.assert_called_with(
response = logged_in_client.post(
url_for('main.service_set_inbound_number', service_id=service_one['id']),
data=data
)
assert response.status_code == 302
mock_add_sms_sender.assert_called_once_with(
service_one['id'],
sms_sender="elevenchars"
sms_sender="781d9c60-7a7e-46b7-9896-7b045b992fa5",
is_default=True,
inbound_number_id="781d9c60-7a7e-46b7-9896-7b045b992fa5"
)
def test_get_inbound_number_in_service_settings(
logged_in_client,
mock_update_service,
mock_get_letter_organisations,
single_reply_to_email_address,
single_letter_contact_block,
def test_set_inbound_sms_when_no_available_inbound_numbers(
client_request,
service_one,
no_available_inbound_numbers,
mock_no_inbound_number_for_service,
mocker
):
mocker_get_inbound_number_fun = mocker.patch(
'app.inbound_number_client.get_inbound_sms_number_for_service',
return_value={'data': {'number': '077777777', 'id': 'some_uuid'}})
page = client_request.get(
'main.service_set_inbound_number',
service_id=service_one['id']
)
response = logged_in_client.get(url_for('main.service_settings', service_id=service_one['id']))
assert response.status_code == 200
mocker_get_inbound_number_fun.assert_called_once_with(service_one['id'])
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
element = page.find('span', {"id": "077777777"})
assert not element
assert normalize_spaces(page.select_one('main p').text) == "No available inbound numbers"
def test_allow_inbound_sms_sets_a_number_for_service(
logged_in_client,
service_one,
mocker
def test_set_inbound_sms_when_service_already_has_sms(
client_request,
service_one,
multiple_available_inbound_numbers,
mock_get_inbound_number_for_service,
):
mocker.patch('app.service_api_client.update_service_with_properties')
mock_activate_inbound_sms = mocker.patch('app.inbound_number_client.activate_inbound_sms_service')
response = logged_in_client.get(url_for('main.service_set_inbound_number',
service_id=service_one['id'],
set_inbound_sms=True))
page = client_request.get(
'main.service_set_inbound_number',
service_id=service_one['id']
)
assert response.status_code == 302
assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True)
mock_activate_inbound_sms.assert_called_once_with(service_one['id'])
def test_allow_inbound_sms_returns_400_if_no_numbers_available(
logged_in_client,
service_one,
mocker
):
mock_switch_service = mocker.patch('app.service_api_client.update_service_with_properties')
mock_activate_inbound = mocker.patch('app.inbound_number_client.activate_inbound_sms_service',
side_effect=HTTPError)
logged_in_client.get(
url_for('main.service_set_inbound_number', service_id=service_one['id'], set_inbound_sms='True'))
mock_activate_inbound.assert_called_once_with(service_one['id'])
assert mock_switch_service.call_count == 2
assert normalize_spaces(page.select_one('main p').text) == "This service already has an inbound number"
def test_set_text_message_sender_and_inbound_sms_permission_exists_return_403(
@@ -92,84 +78,3 @@ def test_set_text_message_sender_and_inbound_sms_permission_exists_return_403(
assert not update_service_mock.called
assert app.current_service['permissions'] == ['inbound_sms']
def test_turn_inbound_sms_off(
logged_in_client,
service_one,
mocker
):
service_one['permissions'] = ['inbound_sms']
update_service_mock = mocker.patch('app.service_api_client.update_service',
return_value=service_one)
mock_deactivate_inbound = mocker.patch('app.inbound_number_client.deactivate_inbound_sms_permission')
response = logged_in_client.get(url_for('main.service_set_inbound_number', service_id=service_one['id'],
set_inbound_sms=False))
assert response.status_code == 302
assert response.location == url_for('main.service_set_sms_sender', service_id=service_one['id'], _external=True)
assert app.current_service['permissions'] == []
mock_deactivate_inbound.assert_called_once_with(service_id=service_one['id'])
assert update_service_mock.called
def test_set_text_message_sender_and_not_inbound_sms(
logged_in_client,
service_one,
mocker
):
service_one['permissions'] = []
update_service_mock = mocker.patch('app.service_api_client.update_service',
return_value=service_one)
data = {"sms_sender": "elevenchars"}
response = logged_in_client.post(url_for('main.service_set_sms_sender', service_id=service_one['id'],
set_inbound_sms=False),
data=data)
assert response.status_code == 302
assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True)
update_service_mock.assert_called_with(
service_one['id'],
sms_sender="elevenchars"
)
assert app.current_service['permissions'] == []
@pytest.mark.parametrize('content, expected_error', [
("", "Cant be empty"),
("twelvecharss", "Enter 11 characters or fewer"),
(".", "Use letters and numbers only")
])
def test_set_text_message_sender_validation(
logged_in_client,
mock_update_service,
service_one,
content,
expected_error,
):
response = logged_in_client.post(url_for(
'main.service_set_sms_sender',
service_id=service_one['id']),
data={"sms_sender": content},
follow_redirects=True
)
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
assert response.status_code == 200
assert page.select(".error-message")[0].text.strip() == expected_error
assert not mock_update_service.called
def test_if_sms_sender_set_then_form_populated(
logged_in_client,
service_one,
mock_get_inbound_number_for_service
):
service_one['sms_sender'] = 'elevenchars'
response = logged_in_client.get(url_for('main.service_set_sms_sender', service_id=service_one['id']))
assert response.status_code == 200
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
assert page.find(id='sms_sender')['value'] == 'elevenchars'

View File

@@ -14,6 +14,7 @@ def get_service_settings_page(
mock_get_letter_organisations,
no_reply_to_email_addresses,
no_letter_contact_blocks,
single_sms_sender,
):
platform_admin_request = client_request_factory(logged_in_platform_admin_client)
return functools.partial(platform_admin_request.get, 'main.service_settings', service_id=service_one['id'])
@@ -35,7 +36,6 @@ def get_service_settings_page(
({'permissions': ['sms']}, '.service_switch_can_send_sms', {}, 'Stop sending sms'),
({'permissions': []}, '.service_switch_can_send_sms', {}, 'Allow to send sms'),
({'permissions': ['sms', 'inbound_sms']}, '.service_set_inbound_number', {'set_inbound_sms': False}, 'Stop inbound sms'), # noqa
({'permissions': ['sms']}, '.service_set_inbound_number', {'set_inbound_sms': True}, 'Allow inbound sms'),
({'active': True}, '.archive_service', {}, 'Archive service'),
@@ -87,6 +87,7 @@ def test_normal_user_doesnt_see_any_toggle_buttons(
mock_get_letter_organisations,
no_reply_to_email_addresses,
no_letter_contact_blocks,
single_sms_sender,
):
page = client_request.get('main.service_settings', service_id=service_one['id'])
toggles = page.find('a', {'class': 'button'})