okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
2f6697a
main
1// Loaded commands and pages must remain usable when later discovery fails. 2// A controlled peer fails catalog reads while keeping declared routes available. 3package daemon 4 5import ( 6"encoding/json" 7"errors" 8"net/http" 9"testing" 10) 11 12func TestLoadedCommandsRemainReadableWhenDiscoveryFails (t * testing.T ) { 13conn := controlledConnection (t ,func (w http.ResponseWriter ,r * http.Request ) { 14if r .Method != http .MethodGet || r .URL .Path != "/sessions/s/catalog" { 15t .Errorf ("unexpected catalog request: %s %s" ,r .Method ,r .URL ) 16 } 17name := "/retained" 18var next * string 19if r .URL .Query ().Get ("next" )== "" { 20next = new ("loaded - page ") 21 }else { 22if r .URL .Query ().Get ("next" )!= "loaded-page" { 23t .Errorf ("unexpected loaded continuation: %s" ,r .URL ) 24 } 25name = "/second" 26 } 27_ = json .NewEncoder (w ).Encode (map [string ]any { 28"discovery" :nil , 29"discovery_failure" :map [string ]any {"code" :"discovery_unavailable" ,"detail" :"Saved preferences cannot be read." }, 30"loaded" :map [string ]any {"revision" :"loaded-real" ,"next" :next ,"commands" : []any {map [string ]any { 31"id" :"skills:" + name ,"slash_name" :name ,"description" :"Loaded skill" ,"arguments" : []any {},"caller_permissions" : []string {"human" },"delivery" :"input" ,"command_id" :name , 32 }}}, 33 }) 34 }) 35commands ,err := ListSessionCommands (t .Context (),conn ,"s" ) 36if err != nil || len (commands )!= 2 || commands [0 ].CommandID != "/retained" || commands [1 ].CommandID != "/second" { 37t .Fatalf ("loaded commands were erased by discovery failure: %+v %v" ,commands ,err ) 38 } 39catalog ,err := GetCapabilityCatalog (t .Context (),conn ,"s" ) 40failure ,ok := errors.AsType [* CatalogDiscoveryError ](err ) 41if ! ok || failure .Code != "discovery_unavailable" || failure .Detail != "Saved preferences cannot be read." || catalog .Revision != "" { 42t .Fatalf ("fresh discovery failure was hidden or assigned a revision: %+v %v" ,catalog ,err ) 43 } 44} 45 46func TestLoadedPageUsesDeclaredReadWhenDiscoveryFails (t * testing.T ) { 47conn := controlledConnection (t ,func (w http.ResponseWriter ,r * http.Request ) { 48switch r .URL .Path { 49case "/sessions/s" : 50_ = json .NewEncoder (w ).Encode (canonicalSession ("s" ,generationA ,0 )) 51case "/sessions/s/catalog" : 52_ ,_ = w .Write ([]byte (`{"discovery":null,"discovery_failure":{"code":"discovery_unavailable","detail":"unavailable"},"loaded":{"revision":"loaded","next":null,"commands":[{"id":"links","slash_name":"/link","description":"Links","arguments":[],"caller_permissions":["client"],"delivery":"read","operation":{"operation_id":"readCustomPage","method":"GET","path_template":"/extensions/custom/page","path":{},"headers":{},"body":{},"result_schema":{},"query":{"scope":{"source":"literal","value":"loaded"}}}}]}}` )) 53case "/extensions/custom/page" : 54if r .URL .Query ().Get ("scope" )!= "loaded" { 55t .Errorf ("declared filter lost: %s" ,r .URL ) 56 } 57_ ,_ = w .Write ([]byte (`{"page":{"title":"Retained page","empty_state":"Empty","rows":[],"glance":null,"actions":[],"summary":""}}` )) 58default : 59t .Errorf ("page guessed a route: %s" ,r .URL ) 60w .WriteHeader (404 ) 61 } 62 }) 63page ,err := LoadPage (t .Context (),conn ,"s" ,"/links" ) 64if err != nil || page .Title != "Retained page" { 65t .Fatalf ("retained aliased page unavailable: %#v, %v" ,page ,err ) 66 } 67}