Refactor filtering out accepted invites to client

None of our model or view layer code should need to know about accepted
invites. We don’t use them anywhere because once an invite is accepted
that person is now a user.

Putting this logic in the client means that:
- none of the code calling the client needs to care about accepted
  invites
- it’s easier to (if we want) update the API code to not return accepted
  invites
This commit is contained in:
Chris Hill-Scott
2018-11-30 17:39:39 +00:00
parent 29830da5e6
commit 538a06c0bf
4 changed files with 20 additions and 26 deletions

View File

@@ -19,10 +19,10 @@ from app.utils import user_has_permissions
@user_has_permissions()
def manage_users(service_id):
users = sorted(
user_api_client.get_users_for_service(service_id=service_id) + [
invite for invite in invite_api_client.get_invites_for_service(service_id=service_id)
if invite.status != 'accepted'
],
(
user_api_client.get_users_for_service(service_id=service_id) +
invite_api_client.get_invites_for_service(service_id=service_id)
),
key=lambda user: user.email_address,
)

View File

@@ -28,11 +28,16 @@ class InviteApiClient(NotifyAdminAPIClient):
return InvitedUser(**resp['data'])
def get_invites_for_service(self, service_id):
endpoint = '/service/{}/invite'.format(service_id)
resp = self.get(endpoint)
invites = resp['data']
invited_users = self._get_invited_users(invites)
return invited_users
return [
InvitedUser(**invite)
for invite in self._get_invites_for_service(service_id)
if invite['status'] != 'accepted'
]
def _get_invites_for_service(self, service_id):
return self.get(
'/service/{}/invite'.format(service_id)
)['data']
def check_token(self, token):
resp = self.get(url='/invite/service/{}'.format(token))
@@ -51,12 +56,5 @@ class InviteApiClient(NotifyAdminAPIClient):
self.post(url='/service/{0}/invite/{1}'.format(service_id, invited_user_id),
data=data)
def _get_invited_users(self, invites):
invited_users = []
for invite in invites:
invited_user = InvitedUser(**invite)
invited_users.append(invited_user)
return invited_users
invite_api_client = InviteApiClient()

View File

@@ -1,4 +1,5 @@
import copy
import uuid
import pytest
from bs4 import BeautifulSoup
@@ -641,24 +642,19 @@ def test_manage_users_shows_invited_user(
def test_manage_users_does_not_show_accepted_invite(
logged_in_client,
client_request,
mocker,
active_user_with_permissions,
sample_invite,
):
import uuid
invited_user_id = uuid.uuid4()
sample_invite['id'] = invited_user_id
sample_invite['status'] = 'accepted'
data = [InvitedUser(**sample_invite)]
service = create_sample_service(active_user_with_permissions)
mocker.patch('app.user_api_client.get_users_for_service', return_value=[active_user_with_permissions])
mocker.patch('app.invite_api_client.get_invites_for_service', return_value=data)
mocker.patch('app.invite_api_client._get_invites_for_service', return_value=[sample_invite])
response = logged_in_client.get(url_for('main.manage_users', service_id=service['id']))
page = client_request.get('main.manage_users', service_id=SERVICE_ONE_ID)
assert response.status_code == 200
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
assert page.h1.string.strip() == 'Team members'
user_lists = page.find_all('div', {'class': 'user-list'})
assert len(user_lists) == 1

View File

@@ -2174,10 +2174,10 @@ def mock_get_invites_for_service(mocker, service_one, sample_invite):
for i in range(0, 5):
invite = copy.copy(sample_invite)
invite['email_address'] = 'user_{}@testnotify.gov.uk'.format(i)
data.append(InvitedUser(**invite))
data.append(invite)
return data
return mocker.patch('app.invite_api_client.get_invites_for_service', side_effect=_get_invites)
return mocker.patch('app.invite_api_client._get_invites_for_service', side_effect=_get_invites)
@pytest.fixture(scope='function')