diff --git a/app/__init__.py b/app/__init__.py index cf4529634..fff052eb1 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -17,6 +17,7 @@ from app.notify_client.api_key_api_client import ApiKeyApiClient from app.notify_client.user_api_client import UserApiClient from app.notify_client.job_api_client import JobApiClient from app.notify_client.status_api_client import StatusApiClient +from app.notify_client.invite_api_client import InviteApiClient from app.its_dangerous_session import ItsdangerousSessionInterface from app.asset_fingerprinter import AssetFingerprinter from app.utils import validate_phone_number, InvalidPhoneError @@ -32,6 +33,7 @@ user_api_client = UserApiClient() api_key_api_client = ApiKeyApiClient() job_api_client = JobApiClient() status_api_client = StatusApiClient() +invite_api_client = InviteApiClient() asset_fingerprinter = AssetFingerprinter() @@ -49,6 +51,7 @@ def create_app(config_name, config_overrides=None): api_key_api_client.init_app(application) job_api_client.init_app(application) status_api_client.init_app(application) + invite_api_client.init_app(application) login_manager.init_app(application) login_manager.login_view = 'main.sign_in' diff --git a/app/main/views/manage_users.py b/app/main/views/manage_users.py index 0a9a2d067..2f425f6af 100644 --- a/app/main/views/manage_users.py +++ b/app/main/views/manage_users.py @@ -7,13 +7,18 @@ from flask import ( flash ) -from flask_login import login_required, current_user +from flask_login import ( + login_required, + current_user +) + +from notifications_python_client.errors import HTTPError from app.main import main -from app.main.dao import users_dao from app.main.forms import InviteUserForm from app.main.dao.services_dao import get_service_by_id_or_404 from app import user_api_client +from app import invite_api_client fake_users = [ { @@ -44,10 +49,18 @@ def manage_users(service_id): def invite_user(service_id): form = InviteUserForm() - if form.validate_on_submit(): - flash('Invite sent to {}'.format(form.email_address.data), 'default_with_tick') - return redirect(url_for('.manage_users', service_id=service_id)) + email_address = form.email_address.data + try: + resp = invite_api_client.create_invite(current_user.id, service_id, email_address) + flash('Invite sent to {}'.format(resp['email_address']), 'default_with_tick') + return redirect(url_for('.manage_users', service_id=service_id)) + + except HTTPError as e: + if e.status_code == 404: + abort(404) + else: + raise e return render_template( 'views/invite-user.html', diff --git a/app/notify_client/invite_api_client.py b/app/notify_client/invite_api_client.py new file mode 100644 index 000000000..e3a7e3ee3 --- /dev/null +++ b/app/notify_client/invite_api_client.py @@ -0,0 +1,23 @@ + +from notifications_python_client.base import BaseAPIClient + + +class InviteApiClient(BaseAPIClient): + def __init__(self, base_url=None, client_id=None, secret=None): + super(self.__class__, self).__init__(base_url=base_url or 'base_url', + client_id=client_id or 'client_id', + secret=secret or 'secret') + + def init_app(self, app): + self.base_url = app.config['API_HOST_NAME'] + self.client_id = app.config['ADMIN_CLIENT_USER_NAME'] + self.secret = app.config['ADMIN_CLIENT_SECRET'] + + def create_invite(self, invite_from_id, service_id, email_address): + data = { + 'service': str(service_id), + 'email_address': email_address, + 'from_user': invite_from_id + } + resp = self.post(url='/service/{}/invite'.format(service_id), data=data) + return resp['data'] diff --git a/tests/app/main/views/test_manage_users.py b/tests/app/main/views/test_manage_users.py index de146a148..bdd31ca70 100644 --- a/tests/app/main/views/test_manage_users.py +++ b/tests/app/main/views/test_manage_users.py @@ -70,19 +70,25 @@ def test_should_show_page_for_inviting_user( def test_invite_user( app_, + service_one, api_user_active, mock_login, - mock_get_service, - mock_get_users_by_service + mock_get_users_by_service, + mock_create_invite ): + from_user = api_user_active.id + service_id = service_one['id'] + email_address = 'test@example.gov.uk' + with app_.test_request_context(): with app_.test_client() as client: client.login(api_user_active) response = client.post( - url_for('main.invite_user', service_id=55555), - data={'email_address': 'test@example.gov.uk'}, + url_for('main.invite_user', service_id=service_id), + data={'email_address': email_address}, follow_redirects=True ) assert response.status_code == 200 assert 'Invite sent to test@example.gov.uk' in response.get_data(as_text=True) + mock_create_invite.assert_called_with(from_user, service_id, email_address) diff --git a/tests/conftest.py b/tests/conftest.py index b9622bf9e..b0735c0f2 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ -import os +import uuid from datetime import date import pytest @@ -533,3 +533,15 @@ def mock_s3_upload(mocker): def _upload(upload_id, service_id, filedata, region): pass return mocker.patch('app.main.views.send.s3upload', side_effect=_upload) + + +@pytest.fixture(scope='function') +def mock_create_invite(mocker): + def _create_invite(from_user, service_id, email_address): + data = {'id': uuid.uuid4(), + 'from_user': from_user, + 'service': service_id, + 'email_address': email_address, + 'status': 'pending'} + return data + return mocker.patch('app.invite_api_client.create_invite', side_effect=_create_invite)