diff --git a/server/server.go b/server/server.go index 275d0bd274..286afb2fde 100644 --- a/server/server.go +++ b/server/server.go @@ -1014,7 +1014,13 @@ func (s *Server) v0QueryPath(w http.ResponseWriter, r *http.Request, urlPath str } if len(rs) == 0 { - err := types.NewErrorV1(types.CodeUndefinedDocument, fmt.Sprintf("%v: %v", types.MsgUndefinedError, stringPathToDataRef(urlPath))) + ref := stringPathToDataRef(urlPath) + + var messageType = types.MsgMissingError + if len(s.getCompiler().GetRulesForVirtualDocument(ref)) > 0 { + messageType = types.MsgFoundUndefinedError + } + err := types.NewErrorV1(types.CodeUndefinedDocument, fmt.Sprintf("%v: %v", messageType, ref)) if logErr := logger.Log(ctx, txn, decisionID, r.RemoteAddr, urlPath, "", goInput, input, nil, ndbCache, err, m); logErr != nil { writer.ErrorAuto(w, logErr) return diff --git a/server/server_test.go b/server/server_test.go index 30af2a8816..ef2915e15f 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -3198,7 +3198,7 @@ func TestDecisionLogging(t *testing.T) { code: 404, response: `{ "code": "undefined_document", - "message": "document missing or undefined: data.test" + "message": "document missing: data.test" }`, }, } @@ -3406,6 +3406,15 @@ func TestUnversionedPost(t *testing.T) { t.Fatalf("Expected not found before policy added but got %v", f.recorder) } + expectedBody := `{ + "code": "undefined_document", + "message": "document missing: data.system.main" +} +` + if f.recorder.Body.String() != expectedBody { + t.Errorf("Expected %s got %s", expectedBody, f.recorder.Body.String()) + } + module := ` package system.main @@ -3425,6 +3434,36 @@ func TestUnversionedPost(t *testing.T) { if f.recorder.Code != 200 || f.recorder.Body.String() != expected { t.Fatalf(`Expected HTTP 200 / %v but got: %v`, expected, f.recorder) } + + module = ` + package system + + main { + input.foo == "bar" + } + ` + + if err := f.v1("PUT", "/policies/test", module, 200, ""); err != nil { + t.Fatal(err) + } + + f.reset() + f.server.Handler.ServeHTTP(f.recorder, func() *http.Request { + return newReqUnversioned(http.MethodPost, "/", `{"input": {"foo": "bar"}}`) + }()) + + if f.recorder.Code != 404 { + t.Fatalf("Expected not found before policy added but got %v", f.recorder) + } + + expectedBody = `{ + "code": "undefined_document", + "message": "document undefined: data.system.main" +} +` + if f.recorder.Body.String() != expectedBody { + t.Errorf("Expected %s got %s", expectedBody, f.recorder.Body.String()) + } } func TestQueryV1Explain(t *testing.T) { diff --git a/server/types/types.go b/server/types/types.go index 8f61c3dd3f..6b8e5657cf 100644 --- a/server/types/types.go +++ b/server/types/types.go @@ -80,6 +80,8 @@ const ( MsgUnauthorizedUndefinedError = "authorization policy missing or undefined" MsgUnauthorizedError = "request rejected by administrative policy" MsgUndefinedError = "document missing or undefined" + MsgMissingError = "document missing" + MsgFoundUndefinedError = "document undefined" MsgPluginConfigError = "error(s) occurred while configuring plugin(s)" )