okami.mom/albedo

git clone https://git.nkp.pet/okami.mom/albedo

Aly Raffaufdocs(test): explain coverage and manual checks2f6697a

main
3.2 KiB67 linesraw
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) {
13	conn := controlledConnection(t, func(w http.ResponseWriter, r *http.Request) {
14		if r.Method != http.MethodGet || r.URL.Path != "/sessions/s/catalog" {
15			t.Errorf("unexpected catalog request: %s %s", r.Method, r.URL)
16		}
17		name := "/retained"
18		var next *string
19		if r.URL.Query().Get("next") == "" {
20			next = new("loaded-page")
21		} else {
22			if r.URL.Query().Get("next") != "loaded-page" {
23				t.Errorf("unexpected loaded continuation: %s", r.URL)
24			}
25			name = "/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	})
35	commands, err := ListSessionCommands(t.Context(), conn, "s")
36	if err != nil || len(commands) != 2 || commands[0].CommandID != "/retained" || commands[1].CommandID != "/second" {
37		t.Fatalf("loaded commands were erased by discovery failure: %+v %v", commands, err)
38	}
39	catalog, err := GetCapabilityCatalog(t.Context(), conn, "s")
40	failure, ok := errors.AsType[*CatalogDiscoveryError](err)
41	if !ok || failure.Code != "discovery_unavailable" || failure.Detail != "Saved preferences cannot be read." || catalog.Revision != "" {
42		t.Fatalf("fresh discovery failure was hidden or assigned a revision: %+v %v", catalog, err)
43	}
44}
45
46func TestLoadedPageUsesDeclaredReadWhenDiscoveryFails(t *testing.T) {
47	conn := controlledConnection(t, func(w http.ResponseWriter, r *http.Request) {
48		switch r.URL.Path {
49		case "/sessions/s":
50			_ = json.NewEncoder(w).Encode(canonicalSession("s", generationA, 0))
51		case "/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"}}}}]}}`))
53		case "/extensions/custom/page":
54			if r.URL.Query().Get("scope") != "loaded" {
55				t.Errorf("declared filter lost: %s", r.URL)
56			}
57			_, _ = w.Write([]byte(`{"page":{"title":"Retained page","empty_state":"Empty","rows":[],"glance":null,"actions":[],"summary":""}}`))
58		default:
59			t.Errorf("page guessed a route: %s", r.URL)
60			w.WriteHeader(404)
61		}
62	})
63	page, err := LoadPage(t.Context(), conn, "s", "/links")
64	if err != nil || page.Title != "Retained page" {
65		t.Fatalf("retained aliased page unavailable: %#v, %v", page, err)
66	}
67}