From 2d2f965bbe1cdd09a11b94b25069cdb2b85e4f89 Mon Sep 17 00:00:00 2001 From: Snider Date: Fri, 17 Apr 2026 18:42:21 +0100 Subject: [PATCH] Harden display query failures --- pkg/display/api.go | 12 +++++--- pkg/display/api_test.go | 68 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 4 deletions(-) diff --git a/pkg/display/api.go b/pkg/display/api.go index f02f3cd4..ce01a907 100644 --- a/pkg/display/api.go +++ b/pkg/display/api.go @@ -83,6 +83,10 @@ func unexpectedResultType(method string) error { return coreerr.E(method, "unexpected result type", nil) } +func failedQuery(method, query string) error { + return coreerr.E(method, query+" query failed", nil) +} + func (s *Service) GetScreens() []*Screen { r := s.Core().QUERY(screen.QueryAll{}) if !r.OK { @@ -105,7 +109,7 @@ func (s *Service) GetScreen(id string) (*Screen, error) { if err, ok := r.Value.(error); ok { return nil, err } - return nil, nil + return nil, failedQuery("display.GetScreen", "screen.queryByID") } scr, ok := r.Value.(*screen.Screen) if !ok { @@ -120,7 +124,7 @@ func (s *Service) GetPrimaryScreen() (*Screen, error) { if err, ok := r.Value.(error); ok { return nil, err } - return nil, nil + return nil, failedQuery("display.GetPrimaryScreen", "screen.queryPrimary") } scr, ok := r.Value.(*screen.Screen) if !ok { @@ -135,7 +139,7 @@ func (s *Service) GetScreenAtPoint(x, y int) (*Screen, error) { if err, ok := r.Value.(error); ok { return nil, err } - return nil, nil + return nil, failedQuery("display.GetScreenAtPoint", "screen.queryAtPoint") } scr, ok := r.Value.(*screen.Screen) if !ok { @@ -390,7 +394,7 @@ func (s *Service) ReadClipboardImage() ([]byte, error) { if err, ok := r.Value.(error); ok { return nil, err } - return nil, nil + return nil, failedQuery("display.ReadClipboardImage", "clipboard.queryImage") } content, ok := r.Value.(clipboard.ImageContent) if !ok { diff --git a/pkg/display/api_test.go b/pkg/display/api_test.go index 149a5e6b..37ad023e 100644 --- a/pkg/display/api_test.go +++ b/pkg/display/api_test.go @@ -198,6 +198,57 @@ func TestDisplayAPI_GetScreen_BadType(t *testing.T) { assert.Nil(t, got) } +func TestDisplayAPI_GetScreen_Ugly(t *testing.T) { + svc, c := newTestDisplayAPIService(t) + c.RegisterQuery(func(_ *core.Core, q core.Query) core.Result { + switch q.(type) { + case screen.QueryByID: + return core.Result{OK: false} + default: + return core.Result{} + } + }) + + got, err := svc.GetScreen("screen-1") + + require.Error(t, err) + assert.Nil(t, got) +} + +func TestDisplayAPI_GetPrimaryScreen_Ugly(t *testing.T) { + svc, c := newTestDisplayAPIService(t) + c.RegisterQuery(func(_ *core.Core, q core.Query) core.Result { + switch q.(type) { + case screen.QueryPrimary: + return core.Result{OK: false} + default: + return core.Result{} + } + }) + + got, err := svc.GetPrimaryScreen() + + require.Error(t, err) + assert.Nil(t, got) +} + +func TestDisplayAPI_GetScreenAtPoint_Ugly(t *testing.T) { + svc, c := newTestDisplayAPIService(t) + c.RegisterQuery(func(_ *core.Core, q core.Query) core.Result { + switch q.(type) { + case screen.QueryAtPoint: + return core.Result{OK: false} + default: + return core.Result{} + } + }) + + got, err := svc.GetScreenAtPoint(10, 20) + + require.Error(t, err) + assert.Nil(t, got) +} + func TestDisplayAPI_OpenFileDialog_Good(t *testing.T) { svc, c := newTestDisplayAPIService(t) c.Action("dialog.openFile", func(_ context.Context, opts core.Options) core.Result { @@ -497,6 +548,23 @@ func TestDisplayAPI_ReadClipboardImage_Ugly(t *testing.T) { assert.Nil(t, got) } +func TestDisplayAPI_ReadClipboardImage_Ugly_BackendFailure(t *testing.T) { + svc, c := newTestDisplayAPIService(t) + c.RegisterQuery(func(_ *core.Core, q core.Query) core.Result { + switch q.(type) { + case clipboard.QueryImage: + return core.Result{OK: false} + default: + return core.Result{} + } + }) + + got, err := svc.ReadClipboardImage() + + require.Error(t, err) + assert.Nil(t, got) +} + func TestDisplayAPI_WriteClipboardImage_Good(t *testing.T) { svc, c := newTestDisplayAPIService(t) var got []byte