diff --git a/put.go b/put.go index 75ea8d2..9160675 100644 --- a/put.go +++ b/put.go @@ -61,10 +61,11 @@ func compareRevs(doc *normalDoc, opts map[string]interface{}, currev string) err if currev == "" { return nil } - if optsrev != "" && optsrev != currev { - return &kivik.Error{HTTPStatus: http.StatusConflict, Message: "document update conflict"} + newrev := optsrev + if newrev == "" { + newrev = docrev } - if docrev != "" && docrev != currev { + if newrev != currev { return &kivik.Error{HTTPStatus: http.StatusConflict, Message: "document update conflict"} } return nil diff --git a/put_test.go b/put_test.go index ab9937b..82a090c 100644 --- a/put_test.go +++ b/put_test.go @@ -59,6 +59,21 @@ func TestPut(t *testing.T) { status: http.StatusConflict, err: "document update conflict", }) + tests.Add("duplicate", func(t *testing.T) interface{} { + doc := map[string]string{"foo": "bar"} + + return tst{ + id: "foo", + doc: doc, + setup: func(t *testing.T, d *db) { + if _, err := d.Put(context.Background(), "foo", doc, nil); err != nil { + t.Fatal(err) + } + }, + status: http.StatusConflict, + err: "document update conflict", + } + }) tests.Add("revs mismatch", tst{ id: "foo", doc: map[string]string{"foo": "bar", "_rev": "2-asdf"}, diff --git a/test/fs.go b/test/fs.go index 1e579e5..dab6a48 100644 --- a/test/fs.go +++ b/test/fs.go @@ -1,6 +1,8 @@ package test import ( + "net/http" + "github.com/go-kivik/kivik" "github.com/go-kivik/kiviktest" "github.com/go-kivik/kiviktest/kt" @@ -32,6 +34,7 @@ func registerFSSuite() { "Replicate.skip": true, "Get.skip": true, // FIXME: Unimplemented + "GetMeta.skip": true, // FIXME: Unimplemented "Flush.skip": true, // FIXME: Unimplemented "Delete.skip": true, // FIXME: Unimplemented "Stats.skip": true, // FIXME: Unimplemented @@ -52,7 +55,13 @@ func registerFSSuite() { "CreateIndex.skip": true, // FIXME: Unimplemented "GetIndexes.skip": true, // FIXME: Unimplemented "DeleteIndex.skip": true, // FIXME: Unimplemented - // "Put.skip": true, // FIXME: Unimplemented + + "Put/RW/Admin/group/LeadingUnderscoreInID.status": http.StatusBadRequest, + "Put/RW/Admin/group/Conflict.status": http.StatusConflict, + "Put/RW/NoAuth/group/LeadingUnderscoreInID.status": http.StatusBadRequest, + "Put/RW/NoAuth/group/DesignDoc.status": http.StatusUnauthorized, + "Put/RW/NoAuth/group/Conflict.status": http.StatusConflict, + "SetSecurity.skip": true, // FIXME: Unimplemented "ViewCleanup.skip": true, // FIXME: Unimplemented "Rev.skip": true, // FIXME: Unimplemented