Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ability to filter for active users #1191

Merged
merged 1 commit into from
Dec 14, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions app/main/views/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,10 @@ def list_users():
if user_research_opted_in is not None:
user_query = user_query.filter(User.user_research_opted_in == convert_to_boolean(user_research_opted_in))

active = request.args.get('active')
if active is not None:
user_query = user_query.filter(User.active == convert_to_boolean(active))

return paginated_result_response(
result_name=RESOURCE_NAME,
results_query=user_query,
Expand Down
28 changes: 18 additions & 10 deletions tests/main/views/test_users.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import itertools
from datetime import datetime
from logging import Logger
import mock
Expand Down Expand Up @@ -1537,19 +1538,17 @@ class TestUsersBooleanFilters(BaseUserTest):

def setup(self):
super(TestUsersBooleanFilters, self).setup()
self.app.config['DM_API_SERVICES_PAGE_SIZE'] = 10
now = datetime.utcnow()
for personal_data_removed, user_research_opted_in in zip(
(True, True, False, False, False,),
(False, True, False, False, True,),
):
for personal_data_removed, user_research_opted_in, active in itertools.product((True, False), repeat=3):
from uuid import uuid4
user = User(
email_address=f'{uuid4()}@digital.cabinet-office.gov.uk',
name='name',
phone_number='555-555-555',
role='admin',
password='password',
active=True,
active=active,
failed_login_count=0,
created_at=now,
updated_at=now,
Expand All @@ -1565,36 +1564,45 @@ def test_can_list_users_by_personal_data_removed_true(self):
response = self.client.get('/users?personal_data_removed=true')
assert response.status_code == 200
data = json.loads(response.get_data())["users"]
assert len(data) == 2
assert len(data) == 4
assert all(user["personalDataRemoved"] is True for user in data)

def test_can_list_users_by_personal_data_removed_false(self):
response = self.client.get('/users?personal_data_removed=false')
assert response.status_code == 200
data = json.loads(response.get_data())["users"]
assert len(data) == 3
assert len(data) == 4
assert all(user["personalDataRemoved"] is False for user in data)

def test_default_list_users_unfiltered(self):
response = self.client.get('/users')
assert response.status_code == 200
data = json.loads(response.get_data())["users"]
assert len(data) == 5
assert len(data) == 8

def test_can_list_users_by_user_research_opted_in_true(self):
response = self.client.get('/users?user_research_opted_in=true')
assert response.status_code == 200
data = json.loads(response.get_data())["users"]
assert len(data) == 1 # because remove_personal_data() *also* sets this flag to false
assert len(data) == 2 # because remove_personal_data() *also* sets this flag to false
assert all(user["userResearchOptedIn"] is True for user in data)

def test_can_list_users_by_user_research_opted_in_false(self):
response = self.client.get('/users?user_research_opted_in=false')
assert response.status_code == 200
data = json.loads(response.get_data())["users"]
assert len(data) == 4 # because remove_personal_data() *also* sets this flag to false
assert len(data) == 6 # because remove_personal_data() *also* sets this flag to false
assert all(user["userResearchOptedIn"] is False for user in data)

# remove_personal_data() sets active to false
@pytest.mark.parametrize('active,expected_users', [(True, 2), (False, 6)])
def test_can_list_users_by_active(self, active, expected_users):
response = self.client.get(f'/users?active={str(active).lower()}')
assert response.status_code == 200
data = json.loads(response.get_data())["users"]
assert len(data) == expected_users
assert all(user["active"] is active for user in data)


class TestUsersRemovePersonalData(BaseUserTest):
"""Test the `remove_user_personal_data` functionality for different roles."""
Expand Down