Skip to content

Commit dd142c9

Browse files
authored
Merge pull request #239 from ioet/revert-235-229_make_admin
Revert "229 make admin"
2 parents cc6b22a + 11eb20d commit dd142c9

File tree

4 files changed

+41
-147
lines changed

4 files changed

+41
-147
lines changed

tests/conftest.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,11 +140,6 @@ def owner_id() -> str:
140140
return fake.uuid4()
141141

142142

143-
@pytest.fixture(scope="session")
144-
def user_id() -> str:
145-
return fake.uuid4()
146-
147-
148143
@pytest.fixture(scope="function")
149144
def sample_item(
150145
cosmos_db_repository: CosmosDBRepository,
Lines changed: 7 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,25 @@
1-
from unittest.mock import Mock, patch
1+
from unittest.mock import Mock
22
from flask import json
33
from flask.testing import FlaskClient
44
from flask_restplus._http import HTTPStatus
55
from utils.azure_users import AzureConnection
66

77

88
def test_users_response_contains_expected_props(
9-
client: FlaskClient, valid_header: dict,
9+
client: FlaskClient,
10+
valid_header: dict,
1011
):
1112

1213
AzureConnection.users = Mock(
1314
return_value=[{'name': 'dummy', 'email': 'dummy', 'role': 'dummy'}]
1415
)
1516

16-
response = client.get('/users', headers=valid_header,)
17+
response = client.get(
18+
'/users',
19+
headers=valid_header,
20+
)
1721

1822
assert HTTPStatus.OK == response.status_code
1923
assert 'name' in json.loads(response.data)[0]
2024
assert 'email' in json.loads(response.data)[0]
2125
assert 'role' in json.loads(response.data)[0]
22-
23-
24-
def test_update_user_role_response_contains_expected_props(
25-
client: FlaskClient, valid_header: dict, user_id: str,
26-
):
27-
valid_user_role_data = {'role': 'admin'}
28-
AzureConnection.update_user_role = Mock(
29-
return_value={'name': 'dummy', 'email': 'dummy', 'role': 'dummy'}
30-
)
31-
32-
response = client.post(
33-
f'/users/{user_id}/roles',
34-
headers=valid_header,
35-
json=valid_user_role_data,
36-
)
37-
38-
assert HTTPStatus.OK == response.status_code
39-
assert 'name' in json.loads(response.data)
40-
assert 'email' in json.loads(response.data)
41-
assert 'role' in json.loads(response.data)
42-
43-
44-
@patch('utils.azure_users.AzureConnection.update_user_role', new_callable=Mock)
45-
def test_on_post_update_user_role_is_being_called_with_valid_arguments(
46-
update_user_role_mock,
47-
client: FlaskClient,
48-
valid_header: dict,
49-
user_id: str,
50-
):
51-
52-
valid_user_role_data = {'role': 'admin'}
53-
response = client.post(
54-
f'/users/{user_id}/roles',
55-
headers=valid_header,
56-
json=valid_user_role_data,
57-
)
58-
59-
assert HTTPStatus.OK == response.status_code
60-
update_user_role_mock.assert_called_once_with(
61-
user_id, valid_user_role_data['role']
62-
)
63-
64-
65-
@patch('utils.azure_users.AzureConnection.update_user_role', new_callable=Mock)
66-
def test_on_delete_update_user_role_is_being_called_with_valid_arguments(
67-
update_user_role_mock,
68-
client: FlaskClient,
69-
valid_header: dict,
70-
user_id: str,
71-
):
72-
73-
response = client.delete(
74-
f'/users/{user_id}/roles/time-tracker-admin', headers=valid_header,
75-
)
76-
77-
assert HTTPStatus.OK == response.status_code
78-
update_user_role_mock.assert_called_once_with(user_id, role=None)

time_tracker_api/users/users_namespace.py

Lines changed: 15 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22
from flask_restplus import fields, Resource
33
from flask_restplus._http import HTTPStatus
44

5-
from time_tracker_api.api import common_fields, api, NullableString
5+
from time_tracker_api.api import common_fields, api
66

7-
from utils.azure_users import AzureConnection
8-
9-
10-
azure_connection = AzureConnection()
7+
faker = Faker()
118

129
ns = api.namespace('users', description='Namespace of the API for users')
1310

@@ -20,72 +17,45 @@
2017
title='Name',
2118
max_length=50,
2219
description='Name of the user',
23-
example=Faker().word(['Marcelo', 'Sandro']),
20+
example=faker.word(['Marcelo', 'Sandro']),
2421
),
2522
'email': fields.String(
2623
title="User's Email",
2724
max_length=50,
2825
description='Email of the user that belongs to the tenant',
29-
example=Faker().email(),
26+
example=faker.email(),
3027
),
31-
'role': NullableString(
28+
'role': fields.String(
3229
title="User's Role",
3330
max_length=50,
3431
description='Role assigned to the user by the tenant',
35-
example=Faker().word(['time-tracker-admin']),
32+
example=faker.word(['admin']),
3633
),
3734
},
3835
)
3936

4037
user_response_fields.update(common_fields)
4138

42-
user_role_input_fields = ns.model(
43-
'UserRoleInput',
44-
{
45-
'role': NullableString(
46-
title="User's Role",
47-
required=True,
48-
max_length=50,
49-
description='Role assigned to the user by the tenant',
50-
example=Faker().word(['time-tracker-admin']),
51-
),
52-
},
53-
)
54-
5539

5640
@ns.route('')
5741
class Users(Resource):
5842
@ns.doc('list_users')
5943
@ns.marshal_list_with(user_response_fields)
6044
def get(self):
6145
"""List all users"""
46+
from utils.azure_users import AzureConnection
47+
48+
azure_connection = AzureConnection()
6249
return azure_connection.users()
6350

6451

65-
@ns.route('/<string:id>/roles')
52+
@ns.route('/<string:id>')
6653
@ns.response(HTTPStatus.NOT_FOUND, 'User not found')
6754
@ns.response(HTTPStatus.UNPROCESSABLE_ENTITY, 'The id has an invalid format')
6855
@ns.param('id', 'The user identifier')
69-
class UserRoles(Resource):
70-
@ns.doc('create_user_role')
71-
@ns.expect(user_role_input_fields)
72-
@ns.response(
73-
HTTPStatus.BAD_REQUEST, 'Invalid format or structure of the user'
74-
)
75-
@ns.marshal_with(user_response_fields)
76-
def post(self, id):
77-
"""Create user's role"""
78-
return azure_connection.update_user_role(id, ns.payload['role'])
79-
80-
81-
@ns.route('/<string:user_id>/roles/<string:role_id>')
82-
@ns.response(HTTPStatus.NOT_FOUND, 'User not found')
83-
@ns.response(HTTPStatus.UNPROCESSABLE_ENTITY, 'The id has an invalid format')
84-
@ns.param('user_id', 'The user identifier')
85-
@ns.param('role_id', 'The role name identifier')
86-
class UserRole(Resource):
87-
@ns.doc('delete_user_role')
56+
class User(Resource):
57+
@ns.doc('get_user')
8858
@ns.marshal_with(user_response_fields)
89-
def delete(self, user_id, role_id):
90-
"""Delete user's role"""
91-
return azure_connection.update_user_role(user_id, role=None)
59+
def get(self, id):
60+
"""Get an user"""
61+
return {}

utils/azure_users.py

Lines changed: 19 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import msal
22
import os
33
import requests
4-
import json
54
from typing import List
65

76

@@ -55,8 +54,6 @@ def __init__(self, config=MSConfig):
5554
self.config = config
5655
self.access_token = self.get_token()
5756

58-
self.role_field = 'extension_1d76efa96f604499acc0c0ee116a1453_role'
59-
6057
def get_token(self):
6158
response = self.client.acquire_token_for_client(
6259
scopes=self.config.SCOPE
@@ -68,43 +65,28 @@ def get_token(self):
6865
raise ValueError(error_info)
6966

7067
def users(self) -> List[AzureUser]:
68+
def to_azure_user(item) -> AzureUser:
69+
there_is_email = len(item['otherMails']) > 0
70+
there_is_role = (
71+
'extension_1d76efa96f604499acc0c0ee116a1453_role' in item
72+
)
73+
74+
id = item['objectId']
75+
name = item['displayName']
76+
email = item['otherMails'][0] if there_is_email else ''
77+
role = (
78+
item['extension_1d76efa96f604499acc0c0ee116a1453_role']
79+
if there_is_role
80+
else None
81+
)
82+
return AzureUser(id, name, email, role)
83+
7184
endpoint = "{endpoint}/users?api-version=1.6&$select=displayName,otherMails,objectId,{role_field}".format(
72-
endpoint=self.config.ENDPOINT, role_field=self.role_field,
85+
endpoint=self.config.ENDPOINT,
86+
role_field='extension_1d76efa96f604499acc0c0ee116a1453_role',
7387
)
7488
response = requests.get(endpoint, auth=BearerAuth(self.access_token))
7589

7690
assert 200 == response.status_code
7791
assert 'value' in response.json()
78-
return [self.to_azure_user(item) for item in response.json()['value']]
79-
80-
def update_user_role(self, id, role):
81-
headers = {
82-
'Content-type': 'application/json',
83-
'Accept': 'application/json',
84-
}
85-
endpoint = "{endpoint}/users/{user_id}?api-version=1.6".format(
86-
endpoint=self.config.ENDPOINT, user_id=id
87-
)
88-
data = {self.role_field: role}
89-
response = requests.patch(
90-
endpoint,
91-
auth=BearerAuth(self.access_token),
92-
data=json.dumps(data),
93-
headers=headers,
94-
)
95-
assert 204 == response.status_code
96-
97-
response = requests.get(endpoint, auth=BearerAuth(self.access_token))
98-
assert 200 == response.status_code
99-
100-
return self.to_azure_user(response.json())
101-
102-
def to_azure_user(self, item) -> AzureUser:
103-
there_is_email = len(item['otherMails']) > 0
104-
there_is_role = self.role_field in item
105-
106-
id = item['objectId']
107-
name = item['displayName']
108-
email = item['otherMails'][0] if there_is_email else ''
109-
role = item[self.role_field] if there_is_role else None
110-
return AzureUser(id, name, email, role)
92+
return [to_azure_user(item) for item in response.json()['value']]

0 commit comments

Comments
 (0)