fix: allows_same_name_different_parent
This commit is contained in:
@@ -83,6 +83,7 @@ class _AsyncSessionMock:
|
||||
self.added: list[object] = []
|
||||
self.flush_order: list[str] = []
|
||||
self._refreshed: list[object] = []
|
||||
self.scalar_results: list[Any] = []
|
||||
|
||||
def add(self, obj: object) -> None:
|
||||
self.added.append(obj)
|
||||
@@ -95,6 +96,8 @@ class _AsyncSessionMock:
|
||||
self._refreshed.append(obj)
|
||||
|
||||
async def scalar(self, *_args, **_kwargs) -> None:
|
||||
if self.scalar_results:
|
||||
return self.scalar_results.pop(0)
|
||||
return None
|
||||
|
||||
|
||||
@@ -222,6 +225,60 @@ async def test_create_script_record_allows_reupload_after_delete() -> None:
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_create_script_record_allows_same_name_different_parent() -> None:
|
||||
"""Same filename in different parent directories of the same user
|
||||
must coexist — they correspond to different Jupyter paths
|
||||
(/user/foo.ipynb vs /user/test/foo.ipynb).
|
||||
"""
|
||||
from backend.scripts import create_script_record
|
||||
|
||||
session = _AsyncSessionMock()
|
||||
request = _make_request()
|
||||
context = _make_context()
|
||||
|
||||
runtime_client = request.app.state.runtime_client
|
||||
runtime_client.ensure_directory = AsyncMock(return_value=None)
|
||||
runtime_client.create_notebook = AsyncMock(return_value={"name": "x.ipynb"})
|
||||
|
||||
s1, so1 = await create_script_record(
|
||||
name="x.ipynb", script_type="notebook", content=b'{"cells":[]}',
|
||||
visibility="private", parent_path=None,
|
||||
request=request, context=context, session=session,
|
||||
)
|
||||
|
||||
# Prime the mock to return a directory row for the upcoming parent lookup.
|
||||
user_prefix = f"workspace/{context.user.user_id}"
|
||||
session.scalar_results.append(
|
||||
StorageObjects(
|
||||
storage_object_id="01OBJ0000000000000000AB",
|
||||
workspace_id=context.workspace.workspace_id,
|
||||
owner_user_id=context.user.user_id,
|
||||
object_type="directory",
|
||||
usage_type="working_copy",
|
||||
storage_backend=settings.storage_backend,
|
||||
storage_uri="s3://bucket/key",
|
||||
file_name="test",
|
||||
created_by=context.user.user_id,
|
||||
relative_path=f"{user_prefix}/test",
|
||||
)
|
||||
)
|
||||
|
||||
# Second upload with the same name but in a subdirectory must NOT 409.
|
||||
s2, so2 = await create_script_record(
|
||||
name="x.ipynb", script_type="notebook", content=b'{"cells":[]}',
|
||||
visibility="private", parent_path="test",
|
||||
request=request, context=context, session=session,
|
||||
)
|
||||
|
||||
assert s1.script_id != s2.script_id
|
||||
assert so1.storage_object_id != so2.storage_object_id
|
||||
# Different relative_paths because parent_path differs.
|
||||
assert so1.relative_path != so2.relative_path
|
||||
assert so1.relative_path.endswith("x.ipynb")
|
||||
assert so2.relative_path.endswith("test/x.ipynb")
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_create_script_after_soft_delete_does_not_conflict() -> None:
|
||||
"""Resurrection regression: with uk_storage_bucket_key_active being a
|
||||
|
||||
Reference in New Issue
Block a user