|
5 | 5 |
|
6 | 6 |
|
7 | 7 | import json |
8 | | -import urllib.parse |
9 | 8 | from typing import Any |
10 | 9 |
|
11 | 10 | import pytest |
12 | | -from aiohttp import web |
13 | | -from aiohttp.test_utils import TestClient, make_mocked_request |
14 | | -from faker import Faker |
| 11 | +from aiohttp.test_utils import TestClient |
15 | 12 | from models_library.api_schemas_storage import ( |
16 | 13 | FileUploadCompleteResponse, |
17 | 14 | FileUploadLinks, |
|
23 | 20 | from pytest_simcore.helpers.typing_env import EnvVarsDict |
24 | 21 | from pytest_simcore.helpers.webserver_login import UserInfoDict |
25 | 22 | from servicelib.aiohttp.rest_responses import wrap_as_envelope |
26 | | -from servicelib.request_keys import RQT_USERID_KEY |
27 | 23 | from simcore_postgres_database.models.users import UserRole |
28 | | -from simcore_service_webserver.application_settings import setup_settings |
29 | | -from simcore_service_webserver.storage._handlers import ( |
30 | | - _from_storage_url, |
31 | | - _to_storage_url, |
32 | | -) |
33 | | -from yarl import URL |
34 | 24 |
|
35 | 25 |
|
36 | 26 | @pytest.fixture |
@@ -175,119 +165,3 @@ async def test_openapi_regression_test( |
175 | 165 | decoded_response = await response.json() |
176 | 166 | assert decoded_response["error"] is None |
177 | 167 | assert decoded_response["data"] is not None |
178 | | - |
179 | | - |
180 | | -def test_url_storage_resolver_helpers(faker: Faker, app_environment: EnvVarsDict): |
181 | | - app = web.Application() |
182 | | - setup_settings(app) |
183 | | - |
184 | | - # NOTE: careful, first we need to encode the "/" in this file path. |
185 | | - # For that we need safe="" option |
186 | | - assert urllib.parse.quote("/") == "/" |
187 | | - assert urllib.parse.quote("/", safe="") == "%2F" |
188 | | - assert urllib.parse.quote("%2F", safe="") == "%252F" |
189 | | - |
190 | | - file_id = f"{faker.uuid4()}/{faker.uuid4()}/file.py" |
191 | | - encoded_file_id = urllib.parse.quote(file_id, safe="") |
192 | | - assert "%2F" in encoded_file_id |
193 | | - assert "%252F" not in encoded_file_id |
194 | | - |
195 | | - encoded_url = URL( |
196 | | - f"/v0/storage/locations/0/files/{encoded_file_id}:complete", encoded=True |
197 | | - ) |
198 | | - assert encoded_url.raw_parts[-1] == f"{encoded_file_id}:complete" |
199 | | - |
200 | | - encoded_web_request = make_mocked_request("GET", str(encoded_url), app=app) |
201 | | - encoded_web_request[RQT_USERID_KEY] = faker.pyint() |
202 | | - |
203 | | - # web -> storage |
204 | | - encoded_storage_url = _to_storage_url(encoded_web_request) |
205 | | - # Something like |
206 | | - # http://storage:123/v5/locations/0/files/e3e70...c07cd%2Ff7...55%2Ffile.py:complete?user_id=8376 |
207 | | - |
208 | | - assert encoded_storage_url.raw_parts[-1] == encoded_web_request.url.raw_parts[-1] |
209 | | - |
210 | | - assert encoded_storage_url.host == app_environment["STORAGE_HOST"] |
211 | | - assert encoded_storage_url.port == int(app_environment["STORAGE_PORT"]) |
212 | | - assert encoded_storage_url.query["user_id"] == str( |
213 | | - encoded_web_request[RQT_USERID_KEY] |
214 | | - ) |
215 | | - |
216 | | - # storage -> web |
217 | | - encoded_web_url: AnyUrl = _from_storage_url( |
218 | | - encoded_web_request, |
219 | | - TypeAdapter(AnyUrl).validate_python(f"{encoded_storage_url}"), |
220 | | - url_encode=None, |
221 | | - ) |
222 | | - |
223 | | - assert encoded_storage_url.host != encoded_web_url.host |
224 | | - assert encoded_storage_url.port != encoded_web_url.port |
225 | | - |
226 | | - assert isinstance(encoded_storage_url, URL) # this is a bit inconvenient |
227 | | - assert isinstance(encoded_web_url, AnyUrl) |
228 | | - assert f"{encoded_web_url}" == f"{encoded_web_request.url}" |
229 | | - |
230 | | - |
231 | | -def test_from_storage_url_with_fastapi_storage( |
232 | | - faker: Faker, app_environment: EnvVarsDict |
233 | | -): |
234 | | - app = web.Application() |
235 | | - setup_settings(app) |
236 | | - # NOTE: aiohttp does not handle file_id containing / characters, but fastAPI does |
237 | | - # frontend --> webserver --> storage --> webserver --> frontend and back |
238 | | - # fully encoded --> / not encoded --> re-encode / |
239 | | - file_id = f"{faker.uuid4()}/{faker.uuid4()}/file with space and öäè.py" |
240 | | - fully_encoded_file_id = urllib.parse.quote(file_id, safe="") |
241 | | - storage_fastapi_encoded_file_id = urllib.parse.quote( |
242 | | - file_id, safe="/" |
243 | | - ) # NOTE: / is safe for fastapi |
244 | | - assert file_id != fully_encoded_file_id |
245 | | - assert file_id != storage_fastapi_encoded_file_id |
246 | | - assert fully_encoded_file_id != storage_fastapi_encoded_file_id |
247 | | - |
248 | | - webserver_url_path = URL( |
249 | | - f"/v0/storage/locations/0/files/{fully_encoded_file_id}:complete" |
250 | | - ) |
251 | | - assert ( |
252 | | - f"{webserver_url_path}" |
253 | | - == f"/v0/storage/locations/0/files/{fully_encoded_file_id}:complete" |
254 | | - ) |
255 | | - assert webserver_url_path.raw_parts[-1] == f"{fully_encoded_file_id}:complete" |
256 | | - |
257 | | - storage_url_path = URL( |
258 | | - f"/v0/locations/0/files/{storage_fastapi_encoded_file_id}:complete", |
259 | | - ) |
260 | | - assert ( |
261 | | - f"{storage_url_path}" |
262 | | - == f"/v0/locations/0/files/{storage_fastapi_encoded_file_id}:complete" |
263 | | - ) |
264 | | - |
265 | | - webserver_request = make_mocked_request("POST", f"{webserver_url_path}", app=app) |
266 | | - webserver_request[RQT_USERID_KEY] = faker.pyint() |
267 | | - # assert webserver_request.url.path == webserver_url_path |
268 | | - generated_storage_url = _to_storage_url(webserver_request) |
269 | | - assert f"{generated_storage_url.path}" == storage_url_path |
270 | | - |
271 | | - # since storage is FastAPI-base it now returns non encoded URLs |
272 | | - # non_encoded_url = URL(f"/v0/storage/locations/0/files/{file_id}:complete") |
273 | | - # non_encoded_web_request = make_mocked_request("GET", str(non_encoded_url), app=app) |
274 | | - # non_encoded_web_request[RQT_USERID_KEY] = faker.pyint() |
275 | | - # non_encoded_storage_url = _to_storage_url(non_encoded_web_request) |
276 | | - # assert ( |
277 | | - # non_encoded_storage_url.raw_parts[-1] |
278 | | - # == non_encoded_web_request.url.raw_parts[-1] |
279 | | - # ) |
280 | | - # assert non_encoded_storage_url.host == app_environment["STORAGE_HOST"] |
281 | | - # assert non_encoded_storage_url.port == int(app_environment["STORAGE_PORT"]) |
282 | | - # assert non_encoded_storage_url.query["user_id"] == str( |
283 | | - # non_encoded_web_request[RQT_USERID_KEY] |
284 | | - # ) |
285 | | - |
286 | | - # assert ( |
287 | | - # _from_storage_url( |
288 | | - # non_encoded_web_request, |
289 | | - # TypeAdapter(AnyUrl).validate_python(f"{non_encoded_storage_url}"), |
290 | | - # url_encode=file_id, |
291 | | - # ).path |
292 | | - # == f"{encoded_url}" |
293 | | - # ) |
0 commit comments