From d1a05e2ec5d7d3c9d9f9d83ff0871a96453b8e37 Mon Sep 17 00:00:00 2001 From: Pea Tyczynska Date: Fri, 6 Jul 2018 16:16:21 +0100 Subject: [PATCH] find_users_by_email view calls API and feeds results to template Template then displays the results. Page displays a message if no results found --- app/main/views/find_users.py | 10 ++++-- app/notify_client/user_api_client.py | 6 ++++ .../views/find-users/find-users-by-email.html | 17 +++++++++- tests/app/main/views/test_find_users.py | 33 +++++++++++++++++-- 4 files changed, 60 insertions(+), 6 deletions(-) diff --git a/app/main/views/find_users.py b/app/main/views/find_users.py index 80135d9b0..96992df19 100644 --- a/app/main/views/find_users.py +++ b/app/main/views/find_users.py @@ -1,16 +1,22 @@ from flask import abort, render_template, request, url_for from flask_login import login_required +from app import user_api_client from app.main import main from app.utils import user_is_platform_admin from app.main.forms import SearchUsersForm -@main.route("/find-users-by-email", methods=['GET']) +@main.route("/find-users-by-email", methods=['GET', 'POST']) @login_required @user_is_platform_admin def find_users_by_email(): + form = SearchUsersForm() + users_found = None + if form.validate_on_submit(): + users_found = user_api_client.find_users_by_full_or_partial_email(form.search.data)['data'] return render_template( 'views/find-users/find-users-by-email.html', - form=SearchUsersForm(), + form=form, + users_found=users_found ) diff --git a/app/notify_client/user_api_client.py b/app/notify_client/user_api_client.py index c0e3a28ef..02b9bfd5b 100644 --- a/app/notify_client/user_api_client.py +++ b/app/notify_client/user_api_client.py @@ -179,6 +179,12 @@ class UserApiClient(NotifyAdminAPIClient): data = {'email': email_address} self.post(endpoint, data=data) + def find_users_by_full_or_partial_email(self, email_address): + endpoint = '/user/find-users-by-email' + data = {'email': email_address} + users = self.post(endpoint, data=data) + return users + def is_email_already_in_use(self, email_address): if self.get_user_by_email_or_none(email_address): return True diff --git a/app/templates/views/find-users/find-users-by-email.html b/app/templates/views/find-users/find-users-by-email.html index 650b5cdde..1ff768d0f 100644 --- a/app/templates/views/find-users/find-users-by-email.html +++ b/app/templates/views/find-users/find-users-by-email.html @@ -24,7 +24,7 @@ {{ textbox( form.search, width='1-1', - label='Find users by e-mail' + label='Find users by e-mail, or by partial e-mail' ) }}
@@ -37,4 +37,19 @@ + {% if users_found %} + + {% elif users_found == [] %} +

No users found.

+ {% endif %} {% endblock %} diff --git a/tests/app/main/views/test_find_users.py b/tests/app/main/views/test_find_users.py index 0f061a53e..eddc35557 100644 --- a/tests/app/main/views/test_find_users.py +++ b/tests/app/main/views/test_find_users.py @@ -3,6 +3,7 @@ from flask import url_for from lxml import html from app.main.views.find_users import find_users_by_email +from tests import user_json from tests.conftest import mock_get_user def test_find_users_by_email_page_loads_correctly( @@ -11,14 +12,40 @@ def test_find_users_by_email_page_loads_correctly( mocker ): mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) - client.login(platform_admin_user) response = client.get(url_for('main.find_users_by_email')) - assert response.status_code == 200 document = html.fromstring(response.get_data(as_text=True)) header = document.xpath('//h1')[0].text assert "Find users by e-mail" in header assert len(document.xpath("//input[@type='search']")) > 0 + + +def test_find_users_by_email_displays_users_found( + client, + platform_admin_user, + mocker +): + mock_get_user(mocker, user=platform_admin_user) + client.login(platform_admin_user) + mocker.patch('app.user_api_client.find_users_by_full_or_partial_email', return_value={"data": [user_json()]}, autospec=True) + response = client.post(url_for('main.find_users_by_email', data=[{"email": "twilight.sparkle"}])) + assert response.status_code == 200 + + document = html.fromstring(response.get_data(as_text=True)) + assert "Test User" in document.text_content() + +def test_find_users_by_email_displays_message_if_no_users_found( + client, + platform_admin_user, + mocker +): + mock_get_user(mocker, user=platform_admin_user) + client.login(platform_admin_user) + mocker.patch('app.user_api_client.find_users_by_full_or_partial_email', return_value={"data": []}, autospec=True) + response = client.post(url_for('main.find_users_by_email', data=[{"email": "twilight.sparkle"}])) + assert response.status_code == 200 + + document = html.fromstring(response.get_data(as_text=True)) + assert "No users found." in document.text_content()