diff --git a/internal/server/api.go b/internal/server/api.go index f16af850..155251b3 100644 --- a/internal/server/api.go +++ b/internal/server/api.go @@ -107,6 +107,12 @@ func (a *API) Complete() { // ServeHTTP handles requests to the server func (a *API) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodGet { + // Updaters can tolerate unavailable read APIs, but an empty success response is malformed. + http.Error(w, "read API is not implemented by the local CLI", http.StatusNotImplemented) + return + } + data, err := io.ReadAll(r.Body) if err != nil { err = fmt.Errorf("failed to read body: %w", err) diff --git a/internal/server/api_test.go b/internal/server/api_test.go index d9047db7..8dc10d51 100644 --- a/internal/server/api_test.go +++ b/internal/server/api_test.go @@ -51,6 +51,32 @@ func TestAPI_ServeHTTP(t *testing.T) { }) } +func TestAPI_UnsupportedGet(t *testing.T) { + for _, path := range []string{ + "/update_jobs/cli/blocked_versions?package-manager=go_modules", + "/update_jobs/cli/unknown_read", + } { + t.Run(path, func(t *testing.T) { + var stdout bytes.Buffer + api := &API{writer: &stdout} + request := httptest.NewRequest(http.MethodGet, path, nil) + response := httptest.NewRecorder() + + api.ServeHTTP(response, request) + + if response.Code != http.StatusNotImplemented { + t.Errorf("expected status %d, got %d", http.StatusNotImplemented, response.Code) + } + if len(api.Errors) != 0 || len(api.Actual.Output) != 0 || stdout.Len() != 0 { + t.Errorf("unsupported read recorded as an event: errors=%v outputs=%v stdout=%q", api.Errors, api.Actual.Output, stdout.String()) + } + if api.cursor != 0 { + t.Errorf("unsupported read consumed an expectation: cursor=%d", api.cursor) + } + }) + } +} + type Wrapper[T any] struct { Data T `json:"data"` }