|
7 | 7 |
|
8 | 8 | import functools |
9 | 9 | import sys |
10 | | -from contextlib import AsyncExitStack |
11 | 10 | from copy import deepcopy |
12 | 11 | from http import HTTPStatus |
13 | | -from typing import Any |
| 12 | +from typing import Any, AsyncIterable |
14 | 13 | from unittest.mock import MagicMock, Mock |
15 | 14 |
|
16 | 15 | import pytest |
@@ -60,121 +59,146 @@ def app_environment( |
60 | 59 | ) |
61 | 60 |
|
62 | 61 |
|
| 62 | +@pytest.fixture |
| 63 | +async def private_user(client: TestClient) -> AsyncIterable[UserInfoDict]: |
| 64 | + assert client.app |
| 65 | + async with NewUser( |
| 66 | + app=client.app, |
| 67 | + user_data={ |
| 68 | + "name": "jamie01", |
| 69 | + "first_name": "James", |
| 70 | + "last_name": "Bond", |
| 71 | + |
| 72 | + "privacy_hide_email": True, |
| 73 | + "privacy_hide_fullname": True, |
| 74 | + }, |
| 75 | + ) as usr: |
| 76 | + yield usr |
| 77 | + |
| 78 | + |
| 79 | +@pytest.fixture |
| 80 | +async def public_user(client: TestClient) -> AsyncIterable[UserInfoDict]: |
| 81 | + assert client.app |
| 82 | + async with NewUser( |
| 83 | + user_data={ |
| 84 | + "name": "taylie01", |
| 85 | + "first_name": "Taylor", |
| 86 | + "last_name": "Swift", |
| 87 | + |
| 88 | + "privacy_hide_email": False, |
| 89 | + "privacy_hide_fullname": False, |
| 90 | + }, |
| 91 | + ) as usr: |
| 92 | + yield usr |
| 93 | + |
| 94 | + |
63 | 95 | @pytest.mark.acceptance_test( |
64 | 96 | "https://github.com/ITISFoundation/osparc-issues/issues/1779" |
65 | 97 | ) |
66 | 98 | @pytest.mark.parametrize("user_role", [UserRole.USER]) |
67 | | -async def test_get_and_search_public_users( |
| 99 | +async def test_search_users( |
68 | 100 | logged_user: UserInfoDict, |
69 | 101 | client: TestClient, |
70 | 102 | user_role: UserRole, |
| 103 | + public_user: UserInfoDict, |
| 104 | + private_user: UserInfoDict, |
71 | 105 | ): |
72 | 106 | assert client.app |
73 | 107 | assert user_role.value == logged_user["role"] |
74 | 108 |
|
75 | | - async with AsyncExitStack() as stack: |
76 | | - private_user: UserInfoDict = await stack.enter_async_context( |
77 | | - NewUser( |
78 | | - app=client.app, |
79 | | - user_data={ |
80 | | - "name": "jamie01", |
81 | | - "first_name": "James", |
82 | | - "last_name": "Bond", |
83 | | - |
84 | | - "privacy_hide_email": True, |
85 | | - "privacy_hide_fullname": True, |
86 | | - }, |
87 | | - ) |
88 | | - ) |
89 | | - public_user: UserInfoDict = await stack.enter_async_context( |
90 | | - NewUser( |
91 | | - app=client.app, |
92 | | - user_data={ |
93 | | - "name": "taylie01", |
94 | | - "first_name": "Taylor", |
95 | | - "last_name": "Swift", |
96 | | - |
97 | | - "privacy_hide_email": False, |
98 | | - "privacy_hide_fullname": False, |
99 | | - }, |
100 | | - ) |
101 | | - ) |
| 109 | + assert private_user["id"] != logged_user["id"] |
| 110 | + assert public_user["id"] != logged_user["id"] |
102 | 111 |
|
103 | | - assert private_user["id"] != logged_user["id"] |
104 | | - assert public_user["id"] != logged_user["id"] |
105 | | - |
106 | | - # SEARCH by partial email |
107 | | - partial_email = "@find.m" |
108 | | - assert partial_email in private_user["email"] |
109 | | - assert partial_email in public_user["email"] |
110 | | - |
111 | | - url = client.app.router["search_users"].url_for() |
112 | | - resp = await client.post(f"{url}", json={"match": partial_email}) |
113 | | - data, _ = await assert_status(resp, status.HTTP_200_OK) |
114 | | - |
115 | | - found = TypeAdapter(list[UserGet]).validate_python(data) |
116 | | - assert found |
117 | | - assert len(found) == 1 |
118 | | - assert found[0].user_id == public_user["id"] |
119 | | - assert found[0].user_name == public_user["name"] |
120 | | - assert found[0].email == public_user["email"] |
121 | | - assert found[0].first_name == public_user.get("first_name") |
122 | | - assert found[0].last_name == public_user.get("last_name") |
123 | | - |
124 | | - # SEARCH by partial username |
125 | | - partial_username = "ie01" |
126 | | - assert partial_username in private_user["name"] |
127 | | - assert partial_username in public_user["name"] |
128 | | - |
129 | | - url = client.app.router["search_users"].url_for() |
130 | | - resp = await client.post(f"{url}", json={"match": partial_username}) |
131 | | - data, _ = await assert_status(resp, status.HTTP_200_OK) |
132 | | - |
133 | | - found = TypeAdapter(list[UserGet]).validate_python(data) |
134 | | - assert found |
135 | | - assert len(found) == 2 |
136 | | - assert found[1].user_id == public_user["id"] |
137 | | - # check privacy |
138 | | - assert found[0].user_name == private_user["name"] |
139 | | - assert found[0].email is None |
140 | | - assert found[0].first_name is None |
141 | | - assert found[0].last_name is None |
142 | | - |
143 | | - # SEARCH user for admin (from a USER) |
144 | | - url = ( |
145 | | - client.app.router["search_users_for_admin"] |
146 | | - .url_for() |
147 | | - .with_query(email=partial_email) |
148 | | - ) |
149 | | - resp = await client.get(f"{url}") |
150 | | - await assert_status(resp, status.HTTP_403_FORBIDDEN) |
| 112 | + # SEARCH by partial email |
| 113 | + partial_email = "@find.m" |
| 114 | + assert partial_email in private_user["email"] |
| 115 | + assert partial_email in public_user["email"] |
151 | 116 |
|
152 | | - # GET user by primary GID |
153 | | - url = client.app.router["get_all_group_users"].url_for( |
154 | | - gid=f"{public_user['primary_gid']}" |
155 | | - ) |
156 | | - resp = await client.get(f"{url}") |
157 | | - data, _ = await assert_status(resp, status.HTTP_200_OK) |
158 | | - |
159 | | - users = TypeAdapter(list[GroupUserGet]).validate_python(data) |
160 | | - assert len(users) == 1 |
161 | | - assert users[0].id == public_user["id"] |
162 | | - assert users[0].user_name == public_user["name"] |
163 | | - assert users[0].first_name == public_user.get("first_name") |
164 | | - assert users[0].last_name == public_user.get("last_name") |
165 | | - |
166 | | - url = client.app.router["get_all_group_users"].url_for( |
167 | | - gid=f"{private_user['primary_gid']}" |
168 | | - ) |
169 | | - resp = await client.get(f"{url}") |
170 | | - data, _ = await assert_status(resp, status.HTTP_200_OK) |
171 | | - |
172 | | - users = TypeAdapter(list[GroupUserGet]).validate_python(data) |
173 | | - assert len(users) == 1 |
174 | | - assert users[0].id == private_user["id"] |
175 | | - assert users[0].user_name == private_user["name"] |
176 | | - assert users[0].first_name is None |
177 | | - assert users[0].last_name is None |
| 117 | + url = client.app.router["search_users"].url_for() |
| 118 | + resp = await client.post(f"{url}", json={"match": partial_email}) |
| 119 | + data, _ = await assert_status(resp, status.HTTP_200_OK) |
| 120 | + |
| 121 | + found = TypeAdapter(list[UserGet]).validate_python(data) |
| 122 | + assert found |
| 123 | + assert len(found) == 1 |
| 124 | + assert found[0].user_id == public_user["id"] |
| 125 | + assert found[0].user_name == public_user["name"] |
| 126 | + assert found[0].email == public_user["email"] |
| 127 | + assert found[0].first_name == public_user.get("first_name") |
| 128 | + assert found[0].last_name == public_user.get("last_name") |
| 129 | + |
| 130 | + # SEARCH by partial username |
| 131 | + partial_username = "ie01" |
| 132 | + assert partial_username in private_user["name"] |
| 133 | + assert partial_username in public_user["name"] |
| 134 | + |
| 135 | + url = client.app.router["search_users"].url_for() |
| 136 | + resp = await client.post(f"{url}", json={"match": partial_username}) |
| 137 | + data, _ = await assert_status(resp, status.HTTP_200_OK) |
| 138 | + |
| 139 | + found = TypeAdapter(list[UserGet]).validate_python(data) |
| 140 | + assert found |
| 141 | + assert len(found) == 2 |
| 142 | + assert found[1].user_id == public_user["id"] |
| 143 | + # check privacy |
| 144 | + assert found[0].user_name == private_user["name"] |
| 145 | + assert found[0].email is None |
| 146 | + assert found[0].first_name is None |
| 147 | + assert found[0].last_name is None |
| 148 | + |
| 149 | + # SEARCH user for admin (from a USER) |
| 150 | + url = ( |
| 151 | + client.app.router["search_users_for_admin"] |
| 152 | + .url_for() |
| 153 | + .with_query(email=partial_email) |
| 154 | + ) |
| 155 | + resp = await client.get(f"{url}") |
| 156 | + await assert_status(resp, status.HTTP_403_FORBIDDEN) |
| 157 | + |
| 158 | + |
| 159 | +@pytest.mark.acceptance_test( |
| 160 | + "https://github.com/ITISFoundation/osparc-issues/issues/1779" |
| 161 | +) |
| 162 | +@pytest.mark.parametrize("user_role", [UserRole.USER]) |
| 163 | +async def test_get_user_by_group_id( |
| 164 | + logged_user: UserInfoDict, |
| 165 | + client: TestClient, |
| 166 | + user_role: UserRole, |
| 167 | + public_user: UserInfoDict, |
| 168 | + private_user: UserInfoDict, |
| 169 | +): |
| 170 | + assert client.app |
| 171 | + assert user_role.value == logged_user["role"] |
| 172 | + |
| 173 | + assert private_user["id"] != logged_user["id"] |
| 174 | + assert public_user["id"] != logged_user["id"] |
| 175 | + |
| 176 | + # GET user by primary GID |
| 177 | + url = client.app.router["get_all_group_users"].url_for( |
| 178 | + gid=f"{public_user['primary_gid']}" |
| 179 | + ) |
| 180 | + resp = await client.get(f"{url}") |
| 181 | + data, _ = await assert_status(resp, status.HTTP_200_OK) |
| 182 | + |
| 183 | + users = TypeAdapter(list[GroupUserGet]).validate_python(data) |
| 184 | + assert len(users) == 1 |
| 185 | + assert users[0].id == public_user["id"] |
| 186 | + assert users[0].user_name == public_user["name"] |
| 187 | + assert users[0].first_name == public_user.get("first_name") |
| 188 | + assert users[0].last_name == public_user.get("last_name") |
| 189 | + |
| 190 | + url = client.app.router["get_all_group_users"].url_for( |
| 191 | + gid=f"{private_user['primary_gid']}" |
| 192 | + ) |
| 193 | + resp = await client.get(f"{url}") |
| 194 | + data, _ = await assert_status(resp, status.HTTP_200_OK) |
| 195 | + |
| 196 | + users = TypeAdapter(list[GroupUserGet]).validate_python(data) |
| 197 | + assert len(users) == 1 |
| 198 | + assert users[0].id == private_user["id"] |
| 199 | + assert users[0].user_name == private_user["name"] |
| 200 | + assert users[0].first_name is None |
| 201 | + assert users[0].last_name is None |
178 | 202 |
|
179 | 203 |
|
180 | 204 | @pytest.mark.parametrize( |
|
0 commit comments