okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
eaef427
main
1"""Python work routes must isolate ledger reads and writes by session workspace.""" 2 3import json 4import unittest 5from urllib .parse import urlencode 6 7from harness import Albedo ,Provider ,python ,text 8 9 10class WorkTests (unittest .TestCase ): 11def test_python_work_is_scoped_to_session_workspace (self ): 12provider = Provider ( 13lambda request : ( 14python ( 15"import os\n" 16"name = os.path.basename(os.getcwd())\n" 17"await work.create(title=name)\n" 18"print([item['title'] for item in await work.list()])" 19 ) 20if request ["messages" ][- 1 ].get ("role" )== "user" 21else text ("done" ) 22 ) 23 ) 24self .addCleanup (provider .close ) 25with Albedo (provider )as app : 26outputs = [] 27for name in ("work-first" ,"work-second" ): 28workspace = app .workspace / name 29workspace .mkdir () 30session = app .session (workspace ) 31app .prompt (session ,"use work" ).close () 32app .idle (session ) 33results = [ 34json .loads (part ["value" ]) 35for entry in app .history (session )["items" ] 36if entry ["kind" ]== "tool_result" 37and entry ["tool" ]["name" ]== "python" 38for part in entry ["content" ] 39if part ["kind" ]== "json" and part ["field" ]== "result" 40 ] 41self .assertEqual (len (results ),1 ) 42self .assertEqual (results [0 ]["status" ],"ok" ,results [0 ]) 43outputs .append (results [0 ]["output" ]) 44self .assertIn ("work-first" ,outputs [0 ]) 45self .assertNotIn ("work-second" ,outputs [0 ]) 46self .assertIn ("work-second" ,outputs [1 ]) 47self .assertNotIn ("work-first" ,outputs [1 ]) 48 49def test_foreign_ids_cannot_be_read_changed_deleted_or_parented (self ): 50foreign = {} 51 52def script (request ): 53if request ["messages" ][- 1 ].get ("role" )!= "user" : 54return text ("done" ) 55item_id ,revision = int (foreign ["id" ]),int (foreign ["revision" ]) 56return python ( 57f"operations = [lambda: work.get( { item_id } ), " 58f"lambda: work.update( { item_id } , revision= { revision } , title='changed'), " 59f"lambda: work.delete( { item_id } , revision= { revision } ), " 60f"lambda: work.create(title='child', parent= { item_id } )]\n" 61"for operation in operations:\n" 62" try:\n" 63" await operation()\n" 64" except WorkError:\n" 65" print('REFUSED')\n" 66" else:\n" 67" raise AssertionError('foreign item accepted')\n" 68"print('EMPTY', await work.list())" 69 ) 70 71provider = Provider (script ) 72self .addCleanup (provider .close ) 73with Albedo (provider )as app : 74query = urlencode ({"workspace" :str (app .workspace )}) 75with app .api ( 76f"/extensions/work/items? { query } " , 77 {"title" :"original" }, 78method = "POST" , 79 )as response : 80foreign .update (json .load (response )["resource" ]["value" ]) 81other = app .workspace / "other-workspace" 82other .mkdir () 83session = app .session (other ) 84app .prompt (session ,"try foreign IDs" ).close () 85app .idle (session ) 86results = [ 87json .loads (part ["value" ]) 88for entry in app .history (session )["items" ] 89if entry ["kind" ]== "tool_result" and entry ["tool" ]["name" ]== "python" 90for part in entry ["content" ] 91if part ["kind" ]== "json" and part ["field" ]== "result" 92 ] 93self .assertEqual (len (results ),1 ) 94self .assertEqual (results [0 ]["status" ],"ok" ,results [0 ]) 95self .assertEqual (results [0 ]["output" ].count ("REFUSED" ),4 ) 96self .assertIn ("EMPTY []" ,results [0 ]["output" ]) 97with app .api (f"/extensions/work/items? { query } " )as response : 98items = json .load (response )["items" ] 99self .assertEqual ([item ["value" ]["title" ]for item in items ], ["original" ])