Skip to content

Commit b6ee91f

Browse files
committed
feat: TT-122 show users by type of user
1 parent 2833c00 commit b6ee91f

File tree

3 files changed

+101
-2
lines changed

3 files changed

+101
-2
lines changed

tests/time_tracker_api/users/users_namespace_test.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from flask import json
33
from flask.testing import FlaskClient
44
from flask_restplus._http import HTTPStatus
5-
from utils.azure_users import AzureConnection
5+
from utils.azure_users import AzureConnection, ROLE_FIELD_VALUES, AzureUser_v2
66
from pytest import mark
77

88

@@ -181,3 +181,59 @@ def test_update_role_is_called_properly_on_each_action(
181181
update_role_mock.assert_called_once_with(
182182
user_id, role_id, is_grant=is_grant
183183
)
184+
185+
186+
@patch('msal.ConfidentialClientApplication')
187+
@patch('utils.azure_users.AzureConnection.get_token')
188+
@patch('utils.azure_users.AzureConnection._get_user')
189+
@mark.parametrize(
190+
'field_name,field_value,expected',
191+
[
192+
(ROLE_FIELD_VALUES['test'][0], ROLE_FIELD_VALUES['test'][1], True),
193+
(ROLE_FIELD_VALUES['test'][0], None, False),
194+
],
195+
)
196+
def test_azure_connection_is_test_user(
197+
_get_user_mock,
198+
get_token_mock,
199+
msal_client_mock,
200+
field_name,
201+
field_value,
202+
expected,
203+
):
204+
_get_user_mock.return_value = {field_name: field_value}
205+
test_user_id = 'test-user-id'
206+
207+
az_conn = AzureConnection()
208+
assert az_conn.is_test_user(test_user_id) == expected
209+
210+
211+
@patch('msal.ConfidentialClientApplication')
212+
@patch('utils.azure_users.AzureConnection.get_token')
213+
@patch('utils.azure_users.AzureConnection._get_test_user_ids')
214+
def test_azure_connection_get_test_user_ids(
215+
_get_test_user_ids_mock, get_token_mock, msal_client_mock,
216+
):
217+
_get_test_user_ids_mock.return_value = [
218+
{'objectId': 'ID1'},
219+
{'objectId': 'ID2'},
220+
]
221+
ids = ['ID1', 'ID2']
222+
az_conn = AzureConnection()
223+
assert az_conn.get_test_user_ids() == ids
224+
225+
226+
@patch('msal.ConfidentialClientApplication')
227+
@patch('utils.azure_users.AzureConnection.get_token')
228+
@patch('utils.azure_users.AzureConnection.get_test_user_ids')
229+
@patch('utils.azure_users.AzureConnection.users_v2')
230+
def test_azure_connection_get_non_test_users(
231+
users_v2_mock, get_test_user_ids_mock, get_token_mock, msal_client_mock,
232+
):
233+
az1 = AzureUser_v2('ID1', None, None, [])
234+
az2 = AzureUser_v2('ID2', None, None, [])
235+
users_v2_mock.return_value = [az1, az2]
236+
get_test_user_ids_mock.return_value = ['ID1']
237+
non_test_users = [az2]
238+
az_conn = AzureConnection()
239+
assert az_conn.get_non_test_users() == non_test_users

time_tracker_api/users/users_namespace.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from flask_restplus._http import HTTPStatus
44

55
from time_tracker_api.api import common_fields, api, NullableString
6+
from time_tracker_api.security import current_user_id
67

78
from utils.azure_users import AzureConnection
89
from commons.feature_toggles.feature_toggle_manager import FeatureToggleManager
@@ -68,7 +69,14 @@ def get(self):
6869
"""List all users"""
6970
user_role_field_toggle = FeatureToggleManager('bk-user-role-field')
7071
if user_role_field_toggle.is_toggle_enabled_for_user():
71-
return AzureConnection().users_v2()
72+
azure_connection = AzureConnection()
73+
current_user_is_tester = azure_connection.is_test_user(
74+
current_user_id()
75+
)
76+
if current_user_is_tester:
77+
return azure_connection.users_v2()
78+
else:
79+
return azure_connection.get_non_test_users()
7280
return AzureConnection().users()
7381

7482

utils/azure_users.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,41 @@ def update_role(self, user_id, role_id, is_grant):
178178

179179
return self.to_azure_user_v2(response.json())
180180

181+
def _get_user(self, user_id):
182+
endpoint = "{endpoint}/users/{user_id}?api-version=1.6".format(
183+
endpoint=self.config.ENDPOINT, user_id=user_id
184+
)
185+
response = requests.get(endpoint, auth=BearerAuth(self.access_token))
186+
assert 200 == response.status_code
187+
return response.json()
188+
189+
def is_test_user(self, user_id):
190+
response = self._get_user(user_id)
191+
field_name, field_value = ROLE_FIELD_VALUES['test']
192+
return field_name in response and field_value == response[field_name]
193+
194+
def _get_test_user_ids(self):
195+
field_name, field_value = ROLE_FIELD_VALUES['test']
196+
endpoint = "{endpoint}/users?api-version=1.6&$select=objectId,{field_name}&$filter={field_name} eq '{field_value}'".format(
197+
endpoint=self.config.ENDPOINT,
198+
field_name=field_name,
199+
field_value=field_value,
200+
)
201+
response = requests.get(endpoint, auth=BearerAuth(self.access_token))
202+
assert 200 == response.status_code
203+
assert 'value' in response.json()
204+
return response.json()['value']
205+
206+
def get_test_user_ids(self):
207+
response = self._get_test_user_ids()
208+
return [item['objectId'] for item in response]
209+
210+
def get_non_test_users(self) -> List[AzureUser]:
211+
test_user_ids = self.get_test_user_ids()
212+
return [
213+
user for user in self.users_v2() if user.id not in test_user_ids
214+
]
215+
181216
def get_role_data(self, role_id, is_grant=True):
182217
assert role_id in ROLE_FIELD_VALUES.keys()
183218
field_name, field_value = ROLE_FIELD_VALUES[role_id]

0 commit comments

Comments
 (0)