package plugin import ( "bytes" "context" "testing" "github.com/grafana/grafana-plugin-sdk-go/backend" ) // mockCallResourceResponseSender implements backend.CallResourceResponseSender // for use in tests. type mockCallResourceResponseSender struct { response *backend.CallResourceResponse } // Send sets the received *backend.CallResourceResponse to s.response func (s *mockCallResourceResponseSender) Send(response *backend.CallResourceResponse) error { s.response = response return nil } // TestCallResource tests CallResource calls, using backend.CallResourceRequest and backend.CallResourceResponse. // This ensures the httpadapter for CallResource works correctly. func TestCallResource(t *testing.T) { // Initialize app inst, err := NewInstance(context.Background(), backend.AppInstanceSettings{}) if err != nil { t.Fatalf("new app: %s", err) } if inst == nil { t.Fatal("inst must not be nil") } app, ok := inst.(*App) if !ok { t.Fatal("inst must be of type *App") } // Set up and run test cases for _, tc := range []struct { name string method string path string body []byte expStatus int expBody []byte }{} { t.Run(tc.name, func(t *testing.T) { // Request by calling CallResource. This tests the httpadapter. var r mockCallResourceResponseSender err = app.CallResource(context.Background(), &backend.CallResourceRequest{ Method: tc.method, Path: tc.path, Body: tc.body, }, &r) if err != nil { t.Fatalf("CallResource error: %s", err) } if r.response == nil { t.Fatal("no response received from CallResource") } if tc.expStatus > 0 && tc.expStatus != r.response.Status { t.Errorf("response status should be %d, got %d", tc.expStatus, r.response.Status) } if len(tc.expBody) > 0 { if tb := bytes.TrimSpace(r.response.Body); !bytes.Equal(tb, tc.expBody) { t.Errorf("response body should be %s, got %s", tc.expBody, tb) } } }) } }