This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
from types import SimpleNamespace
|
||||
|
||||
import pytest
|
||||
|
||||
import routers.database.files.files as files_router
|
||||
import routers.database.files.files_simplified as files_simplified_router
|
||||
|
||||
|
||||
ROUTERS = [files_router, files_simplified_router]
|
||||
|
||||
USER_A = "00000000-0000-0000-0000-000000000001"
|
||||
USER_B = "00000000-0000-0000-0000-000000000002"
|
||||
CAB_A = "10000000-0000-0000-0000-000000000001"
|
||||
CAB_B = "10000000-0000-0000-0000-000000000002"
|
||||
|
||||
|
||||
class FakeQuery:
|
||||
def __init__(self, rows):
|
||||
self.rows = list(rows)
|
||||
|
||||
def select(self, *_args, **_kwargs):
|
||||
return self
|
||||
|
||||
def eq(self, key, value):
|
||||
self.rows = [row for row in self.rows if row.get(key) == value]
|
||||
return self
|
||||
|
||||
def limit(self, _n):
|
||||
return self
|
||||
|
||||
def execute(self):
|
||||
return SimpleNamespace(data=self.rows)
|
||||
|
||||
|
||||
class FakeSupabase:
|
||||
def __init__(self, store):
|
||||
self.store = store
|
||||
|
||||
def table(self, name):
|
||||
return FakeQuery(self.store.get(name, []))
|
||||
|
||||
|
||||
class FakeServiceRoleClient:
|
||||
def __init__(self, store):
|
||||
self.supabase = FakeSupabase(store)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("router_module", ROUTERS)
|
||||
def test_list_files_hides_unowned_unshared_cabinet(monkeypatch, router_module):
|
||||
store = {
|
||||
"file_cabinets": [
|
||||
{"id": CAB_A, "user_id": USER_A},
|
||||
{"id": CAB_B, "user_id": USER_B},
|
||||
],
|
||||
"cabinet_memberships": [],
|
||||
"files": [
|
||||
{"id": "file-a", "cabinet_id": CAB_A, "uploaded_by": USER_A},
|
||||
{"id": "file-b", "cabinet_id": CAB_B, "uploaded_by": USER_B},
|
||||
],
|
||||
}
|
||||
monkeypatch.setattr(
|
||||
router_module,
|
||||
"SupabaseServiceRoleClient",
|
||||
lambda: FakeServiceRoleClient(store),
|
||||
)
|
||||
|
||||
assert router_module.list_files(CAB_B, {"sub": USER_A}) == []
|
||||
|
||||
|
||||
@pytest.mark.parametrize("router_module", ROUTERS)
|
||||
def test_list_files_allows_own_cabinet(monkeypatch, router_module):
|
||||
store = {
|
||||
"file_cabinets": [{"id": CAB_A, "user_id": USER_A}],
|
||||
"cabinet_memberships": [],
|
||||
"files": [{"id": "file-a", "cabinet_id": CAB_A, "uploaded_by": USER_A}],
|
||||
}
|
||||
monkeypatch.setattr(
|
||||
router_module,
|
||||
"SupabaseServiceRoleClient",
|
||||
lambda: FakeServiceRoleClient(store),
|
||||
)
|
||||
|
||||
assert router_module.list_files(CAB_A, {"sub": USER_A}) == [
|
||||
{"id": "file-a", "cabinet_id": CAB_A, "uploaded_by": USER_A}
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("router_module", ROUTERS)
|
||||
def test_list_files_denies_non_owner_even_with_cabinet_membership(monkeypatch, router_module):
|
||||
store = {
|
||||
"file_cabinets": [{"id": CAB_B, "user_id": USER_B}],
|
||||
"cabinet_memberships": [
|
||||
{"cabinet_id": CAB_B, "profile_id": USER_A, "role": "viewer"}
|
||||
],
|
||||
"files": [{"id": "file-b", "cabinet_id": CAB_B, "uploaded_by": USER_B}],
|
||||
}
|
||||
monkeypatch.setattr(
|
||||
router_module,
|
||||
"SupabaseServiceRoleClient",
|
||||
lambda: FakeServiceRoleClient(store),
|
||||
)
|
||||
|
||||
assert router_module.list_files(CAB_B, {"sub": USER_A}) == []
|
||||
Reference in New Issue
Block a user