1111These tests drive the real route handlers with the data services mocked,
1212verifying two invariants for each newly-guarded action:
1313
14- 1. A viewer-ceiling caller is denied with HTTP 403 *before* the data service is
15- touched (the deny-only ceiling fires ahead of owner-override and the
16- ``AUTHZ_ENABLED`` gate).
14+ 1. A viewer-ceiling caller is denied *before* the mutating data service is
15+ touched (normally with HTTP 403; UUID-private resources may mask it as 404).
17162. With no ceiling installed, the owner-override path returns early and the
1817 route proceeds to the underlying service — preserving feature-off behavior.
1918"""
@@ -281,7 +280,7 @@ async def test_memory_delete_viewer_denied(monkeypatch, owner):
281280 from langflow .api .v1 import memories
282281
283282 delete_spy = AsyncMock (return_value = True )
284- mb = SimpleNamespace (user_id = owner .id , kb_name = "kb" )
283+ mb = SimpleNamespace (id = uuid4 (), user_id = owner .id , kb_name = "kb" )
285284 _install_memory_service (monkeypatch , delete = delete_spy , get = AsyncMock (return_value = mb ))
286285
287286 set_current_external_access_context (_viewer_ceiling ())
@@ -291,7 +290,7 @@ async def test_memory_delete_viewer_denied(monkeypatch, owner):
291290 finally :
292291 set_current_external_access_context (None )
293292
294- assert exc_info .value .status_code == 403
293+ assert exc_info .value .status_code == 404
295294 delete_spy .assert_not_awaited ()
296295
297296
@@ -300,7 +299,7 @@ async def test_memory_flush_viewer_denied(monkeypatch, owner):
300299 from langflow .api .v1 import memories
301300
302301 trigger_spy = AsyncMock (return_value = uuid4 ())
303- mb = SimpleNamespace (user_id = owner .id , kb_name = "kb" )
302+ mb = SimpleNamespace (id = uuid4 (), user_id = owner .id , kb_name = "kb" )
304303 _install_memory_service (monkeypatch , trigger_ingestion = trigger_spy , get = AsyncMock (return_value = mb ))
305304
306305 set_current_external_access_context (_viewer_ceiling ())
@@ -312,7 +311,7 @@ async def test_memory_flush_viewer_denied(monkeypatch, owner):
312311 finally :
313312 set_current_external_access_context (None )
314313
315- assert exc_info .value .status_code == 403
314+ assert exc_info .value .status_code == 404
316315 trigger_spy .assert_not_awaited ()
317316
318317
@@ -321,7 +320,7 @@ async def test_memory_regenerate_viewer_denied(monkeypatch, owner):
321320 from langflow .api .v1 import memories
322321
323322 regen_spy = AsyncMock (return_value = [])
324- mb = SimpleNamespace (user_id = owner .id , kb_name = "kb" )
323+ mb = SimpleNamespace (id = uuid4 (), user_id = owner .id , kb_name = "kb" )
325324 _install_memory_service (monkeypatch , regenerate = regen_spy , get = AsyncMock (return_value = mb ))
326325
327326 set_current_external_access_context (_viewer_ceiling ())
@@ -331,7 +330,7 @@ async def test_memory_regenerate_viewer_denied(monkeypatch, owner):
331330 finally :
332331 set_current_external_access_context (None )
333332
334- assert exc_info .value .status_code == 403
333+ assert exc_info .value .status_code == 404
335334 regen_spy .assert_not_awaited ()
336335
337336
@@ -341,7 +340,7 @@ async def test_memory_delete_owner_proceeds(monkeypatch, owner):
341340 from langflow .api .v1 import memories
342341
343342 delete_spy = AsyncMock (return_value = True )
344- mb = SimpleNamespace (user_id = owner .id , kb_name = "kb" )
343+ mb = SimpleNamespace (id = uuid4 (), user_id = owner .id , kb_name = "kb" )
345344 _install_memory_service (monkeypatch , delete = delete_spy , get = AsyncMock (return_value = mb ))
346345
347346 set_current_external_access_context (ExternalAccessContext (provider = "openrag" , subject = "s-1" , level = "editor" ))
0 commit comments