mirror of
https://github.com/GSA/notifications-api.git
synced 2026-08-23 07:46:06 -04:00
Merge pull request #2587 from alphagov/find_services_by_partial_name
Find services by partial name
This commit is contained in:
@@ -46,7 +46,7 @@ from app.models import (
|
|||||||
SMS_TYPE,
|
SMS_TYPE,
|
||||||
LETTER_TYPE,
|
LETTER_TYPE,
|
||||||
)
|
)
|
||||||
from app.utils import email_address_is_nhs, get_london_midnight_in_utc, midnight_n_days_ago
|
from app.utils import email_address_is_nhs, escape_special_characters, get_london_midnight_in_utc, midnight_n_days_ago
|
||||||
|
|
||||||
DEFAULT_SERVICE_PERMISSIONS = [
|
DEFAULT_SERVICE_PERMISSIONS = [
|
||||||
SMS_TYPE,
|
SMS_TYPE,
|
||||||
@@ -69,6 +69,11 @@ def dao_fetch_all_services(only_active=False):
|
|||||||
return query.all()
|
return query.all()
|
||||||
|
|
||||||
|
|
||||||
|
def get_services_by_partial_name(service_name):
|
||||||
|
service_name = escape_special_characters(service_name)
|
||||||
|
return Service.query.filter(Service.name.ilike("%{}%".format(service_name))).all()
|
||||||
|
|
||||||
|
|
||||||
def dao_count_live_services():
|
def dao_count_live_services():
|
||||||
return Service.query.filter_by(
|
return Service.query.filter_by(
|
||||||
active=True,
|
active=True,
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ from app.dao.services_dao import (
|
|||||||
dao_remove_user_from_service,
|
dao_remove_user_from_service,
|
||||||
dao_suspend_service,
|
dao_suspend_service,
|
||||||
dao_update_service,
|
dao_update_service,
|
||||||
|
get_services_by_partial_name,
|
||||||
)
|
)
|
||||||
from app.dao.service_whitelist_dao import (
|
from app.dao.service_whitelist_dao import (
|
||||||
dao_fetch_service_whitelist,
|
dao_fetch_service_whitelist,
|
||||||
@@ -166,6 +167,17 @@ def get_services():
|
|||||||
return jsonify(data=data)
|
return jsonify(data=data)
|
||||||
|
|
||||||
|
|
||||||
|
@service_blueprint.route('/find-services-by-name', methods=['GET'])
|
||||||
|
def find_services_by_name():
|
||||||
|
service_name = request.args.get('service_name')
|
||||||
|
if not service_name:
|
||||||
|
errors = {'service_name': ['Missing data for required field.']}
|
||||||
|
raise InvalidRequest(errors, status_code=400)
|
||||||
|
fetched_services = get_services_by_partial_name(service_name)
|
||||||
|
data = service_schema.dump(fetched_services, many=True).data
|
||||||
|
return jsonify(data=data), 200
|
||||||
|
|
||||||
|
|
||||||
@service_blueprint.route('/live-services-data', methods=['GET'])
|
@service_blueprint.route('/live-services-data', methods=['GET'])
|
||||||
def get_live_services_data():
|
def get_live_services_data():
|
||||||
data = dao_fetch_live_services_data()
|
data = dao_fetch_live_services_data()
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ from app.dao.services_dao import (
|
|||||||
dao_resume_service,
|
dao_resume_service,
|
||||||
dao_fetch_active_users_for_service,
|
dao_fetch_active_users_for_service,
|
||||||
dao_fetch_service_by_inbound_number,
|
dao_fetch_service_by_inbound_number,
|
||||||
|
get_services_by_partial_name,
|
||||||
)
|
)
|
||||||
from app.dao.service_user_dao import dao_get_service_user, dao_update_service_user
|
from app.dao.service_user_dao import dao_get_service_user, dao_update_service_user
|
||||||
from app.dao.users_dao import save_model_user, create_user_code
|
from app.dao.users_dao import save_model_user, create_user_code
|
||||||
@@ -392,7 +393,22 @@ def test_get_all_services_for_user(notify_db_session):
|
|||||||
assert dao_fetch_all_services_by_user(user.id)[2].name == 'service 3'
|
assert dao_fetch_all_services_by_user(user.id)[2].name == 'service 3'
|
||||||
|
|
||||||
|
|
||||||
def test_get_all_only_services_user_has_access_to(notify_db_session):
|
def test_get_services_by_partial_name(notify_db_session):
|
||||||
|
create_service(service_name="Tadfield Police")
|
||||||
|
create_service(service_name="Tadfield Air Base")
|
||||||
|
create_service(service_name="London M25 Management Body")
|
||||||
|
services_from_db = get_services_by_partial_name("Tadfield")
|
||||||
|
assert len(services_from_db) == 2
|
||||||
|
assert sorted([service.name for service in services_from_db]) == ["Tadfield Air Base", "Tadfield Police"]
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_services_by_partial_name_is_case_insensitive(notify_db_session):
|
||||||
|
create_service(service_name="Tadfield Police")
|
||||||
|
services_from_db = get_services_by_partial_name("tadfield")
|
||||||
|
assert services_from_db[0].name == "Tadfield Police"
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_all_user_services_only_returns_services_user_has_access_to(notify_db_session):
|
||||||
user = create_user()
|
user = create_user()
|
||||||
create_service(service_name='service 1', user=user, email_from='service.1')
|
create_service(service_name='service 1', user=user, email_from='service.1')
|
||||||
create_service(service_name='service 2', user=user, email_from='service.2')
|
create_service(service_name='service 2', user=user, email_from='service.2')
|
||||||
|
|||||||
@@ -138,6 +138,36 @@ def test_get_service_list_should_return_empty_list_if_no_services(admin_request)
|
|||||||
assert len(json_resp['data']) == 0
|
assert len(json_resp['data']) == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_find_services_by_name_finds_services(notify_db, admin_request, mocker):
|
||||||
|
service_1 = create_service(service_name="ABCDEF")
|
||||||
|
service_2 = create_service(service_name="ABCGHT")
|
||||||
|
mock_get_services_by_partial_name = mocker.patch(
|
||||||
|
'app.service.rest.get_services_by_partial_name',
|
||||||
|
return_value=[service_1, service_2]
|
||||||
|
)
|
||||||
|
response = admin_request.get('service.find_services_by_name', service_name="ABC")["data"]
|
||||||
|
mock_get_services_by_partial_name.assert_called_once_with("ABC")
|
||||||
|
assert len(response) == 2
|
||||||
|
|
||||||
|
|
||||||
|
def test_find_services_by_name_handles_no_results(notify_db, admin_request, mocker):
|
||||||
|
mock_get_services_by_partial_name = mocker.patch(
|
||||||
|
'app.service.rest.get_services_by_partial_name',
|
||||||
|
return_value=[]
|
||||||
|
)
|
||||||
|
response = admin_request.get('service.find_services_by_name', service_name="ABC")["data"]
|
||||||
|
mock_get_services_by_partial_name.assert_called_once_with("ABC")
|
||||||
|
assert len(response) == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_find_services_by_name_handles_no_service_name(notify_db, admin_request, mocker):
|
||||||
|
mock_get_services_by_partial_name = mocker.patch(
|
||||||
|
'app.service.rest.get_services_by_partial_name'
|
||||||
|
)
|
||||||
|
admin_request.get('service.find_services_by_name', _expected_status=400)
|
||||||
|
mock_get_services_by_partial_name.assert_not_called()
|
||||||
|
|
||||||
|
|
||||||
def test_get_live_services_data(sample_user, admin_request):
|
def test_get_live_services_data(sample_user, admin_request):
|
||||||
org = create_organisation()
|
org = create_organisation()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user