fix: validate Cua window discovery filters and guide recovery
This commit is contained in:
1 parent
c89588a80d
commit
1c1d700e9b
12 files changed
+337
-31
No files matched your search
@@ -0,0 +1,88 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type lookupInput struct{ bytes.Buffer }
|
||||
|
||||
func (*lookupInput) Close() error { return nil }
|
||||
|
||||
func TestInvalidDiscoveryPIDStopsBeforeDriver(t *testing.T) {
|
||||
for _, pid := range []any{0, -1, 1.5, "123", true, float64(4294967296)} {
|
||||
result := newAdapter(nil).handle("list_windows", obj{"app": "Brave", "pid": pid})
|
||||
if result["isError"] != true || object(object(result["structuredContent"])["artemis"])["execution"] != "not_started" {
|
||||
t.Fatalf("invalid PID %v reached driver or was reported as no windows: %v", pid, result)
|
||||
}
|
||||
if !strings.Contains(str(object(items(result["content"])[0])["text"]), "omit pid") {
|
||||
t.Fatalf("missing recovery instruction for %v", pid)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestAppDiscoveryOmitsNullPIDAtDriverBoundary(t *testing.T) {
|
||||
input := &lookupInput{}
|
||||
lines := make(chan []byte, 1)
|
||||
lines <- []byte(`{"id":1,"result":{"content":[],"structuredContent":{"windows":[{"app_name":"brave.exe","pid":72,"window_id":81,"title":"Browser"}]}}}`)
|
||||
a := newAdapter(&peer{input: input, lines: lines})
|
||||
args := obj{"app": " Brave ", "pid": nil, "on_screen_only": true}
|
||||
result := a.handle("list_windows", args)
|
||||
if result["isError"] == true || len(items(object(result["structuredContent"])["windows"])) != 1 {
|
||||
t.Fatalf("failed app-only discovery: %v", result)
|
||||
}
|
||||
var sent obj
|
||||
if err := json.Unmarshal(input.Bytes(), &sent); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
forwarded := object(object(sent["params"])["arguments"])
|
||||
if _, present := forwarded["pid"]; present || forwarded["app"] != "Brave" || forwarded["on_screen_only"] != true {
|
||||
t.Fatalf("incorrect upstream query: %v", forwarded)
|
||||
}
|
||||
if args["app"] != " Brave " || len(args) != 3 {
|
||||
t.Fatal("changed original arguments used in trace")
|
||||
}
|
||||
}
|
||||
|
||||
func TestConflictingFiltersPreserveScopeAndRemoveForegroundHint(t *testing.T) {
|
||||
query := obj{"app": "Brave", "pid": 14492, "on_screen_only": true}
|
||||
result := windowListing(obj{
|
||||
"content": []any{textBlock(`No windows. Current frontmost app is "studio64.exe" (pid 14492).`)},
|
||||
"structuredContent": obj{"windows": []any{}},
|
||||
}, query)
|
||||
data := object(result["structuredContent"])
|
||||
lookup := object(data["lookup"])
|
||||
next := object(lookup["suggested_arguments"])
|
||||
if len(items(data["windows"])) != 0 || lookup["status"] != "no_match" || object(lookup["filters"])["pid"] != 14492 {
|
||||
t.Fatal("original filter or no-match result was hidden")
|
||||
}
|
||||
if _, exists := next["pid"]; exists || next["app"] != "Brave" || next["on_screen_only"] != true {
|
||||
t.Fatalf("incorrect app-only recovery: %v", next)
|
||||
}
|
||||
text := str(object(items(result["content"])[0])["text"])
|
||||
if strings.Contains(text, "studio64.exe") || !strings.Contains(text, "pid omitted") {
|
||||
t.Fatalf("misleading recovery: %s", text)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEmptyVisibleQuerySuggestsSameTargetOffScreen(t *testing.T) {
|
||||
query := obj{"pid": 12, "on_screen_only": true}
|
||||
result := windowListing(obj{"structuredContent": obj{"windows": []any{}}}, query)
|
||||
next := object(object(object(result["structuredContent"])["lookup"])["suggested_arguments"])
|
||||
if next["pid"] != 12 || next["on_screen_only"] != false || query["on_screen_only"] != true {
|
||||
t.Fatalf("changed target or original query: %v", next)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLookupErrorsNeverBecomeEmptySuccess(t *testing.T) {
|
||||
for _, result := range []obj{
|
||||
{"isError": true, "content": []any{textBlock("driver unavailable")}},
|
||||
{"structuredContent": obj{}},
|
||||
} {
|
||||
if windowListing(result, obj{"app": "Brave"})["isError"] != true {
|
||||
t.Fatal("observation failure became a successful empty list")
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user