@@ -227,26 +227,67 @@ def test_url_storage_resolver_helpers(faker: Faker, app_environment: EnvVarsDict
227227 assert isinstance (encoded_web_url , AnyUrl )
228228 assert f"{ encoded_web_url } " == f"{ encoded_web_request .url } "
229229
230- # since storage is FastAPI-base it now returns non encoded URLs
231- non_encoded_url = URL (f"/v0/storage/locations/0/files/{ file_id } :complete" )
232- non_encoded_web_request = make_mocked_request ("GET" , str (non_encoded_url ), app = app )
233- non_encoded_web_request [RQT_USERID_KEY ] = faker .pyint ()
234- non_encoded_storage_url = _to_storage_url (non_encoded_web_request )
235- assert (
236- non_encoded_storage_url .raw_parts [- 1 ]
237- == non_encoded_web_request .url .raw_parts [- 1 ]
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"
238250 )
239- assert non_encoded_storage_url .host == app_environment ["STORAGE_HOST" ]
240- assert non_encoded_storage_url .port == int (app_environment ["STORAGE_PORT" ])
241- assert non_encoded_storage_url .query ["user_id" ] == str (
242- non_encoded_web_request [RQT_USERID_KEY ]
251+ assert (
252+ f"{ webserver_url_path } "
253+ == f"/v0/storage/locations/0/files/{ fully_encoded_file_id } :complete"
243254 )
255+ assert webserver_url_path .raw_parts [- 1 ] == f"{ fully_encoded_file_id } :complete"
244256
257+ storage_url_path = URL (
258+ f"/v0/locations/0/files/{ storage_fastapi_encoded_file_id } :complete" ,
259+ )
245260 assert (
246- _from_storage_url (
247- non_encoded_web_request ,
248- TypeAdapter (AnyUrl ).validate_python (f"{ non_encoded_storage_url } " ),
249- url_encode = file_id ,
250- ).path
251- == f"{ encoded_url } "
261+ f"{ storage_url_path } "
262+ == f"/v0/locations/0/files/{ storage_fastapi_encoded_file_id } :complete"
252263 )
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