Skip to content

Commit

Permalink
Merge pull request #85 from brettbuddin/dont-replace-nonexistent-keys
Browse files Browse the repository at this point in the history
Conform to RFC6902 replacement semantics
  • Loading branch information
evanphx authored Dec 20, 2019
2 parents 0f56626 + 2663031 commit bf22ed9
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 3 deletions.
10 changes: 7 additions & 3 deletions patch.go
Original file line number Diff line number Diff line change
Expand Up @@ -388,13 +388,17 @@ func (d *partialDoc) add(key string, val *lazyNode) error {
}

func (d *partialDoc) get(key string) (*lazyNode, error) {
return (*d)[key], nil
v, ok := (*d)[key]
if !ok {
return v, errors.Wrapf(ErrMissing, "unable to get nonexistent key: %s", key)
}
return v, nil
}

func (d *partialDoc) remove(key string) error {
_, ok := (*d)[key]
if !ok {
return errors.Wrapf(ErrMissing, "Unable to remove nonexistent key: %s", key)
return errors.Wrapf(ErrMissing, "unable to remove nonexistent key: %s", key)
}

delete(*d, key)
Expand Down Expand Up @@ -616,7 +620,7 @@ func (p Patch) test(doc *container, op Operation) error {
}

val, err := con.get(key)
if err != nil {
if err != nil && errors.Cause(err) != ErrMissing {
return errors.Wrapf(err, "error in test for path: '%s'", path)
}

Expand Down
26 changes: 26 additions & 0 deletions patch_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,11 @@ var Cases = []Case{
`[{"op": "copy", "path": "/foo/0", "from": "/foo"}]`,
`{ "foo": [["bar"], "bar"]}`,
},
{
`{ "foo": null}`,
`[{"op": "copy", "path": "/bar", "from": "/foo"}]`,
`{ "foo": null, "bar": null}`,
},
{
`{ "foo": ["bar","qux","baz"]}`,
`[ { "op": "remove", "path": "/foo/-2"}]`,
Expand Down Expand Up @@ -332,6 +337,15 @@ var BadCases = []BadCase{
`{ "foo": [ "all", "grass", "cows", "eat" ] }`,
`[ { "op": "move", "from": "/foo/1", "path": "/foo/4" } ]`,
},
{
`{ "baz": "qux" }`,
`[ { "op": "replace", "path": "/foo", "value": "bar" } ]`,
},
// Can't copy from non-existent "from" key.
{
`{ "foo": "bar"}`,
`[{"op": "copy", "path": "/qux", "from": "/baz"}]`,
},
}

// This is not thread safe, so we cannot run patch tests in parallel.
Expand Down Expand Up @@ -459,6 +473,18 @@ var TestCases = []TestCase{
false,
"/foo",
},
{
`{ "foo": "bar" }`,
`[ { "op": "test", "path": "/baz", "value": "bar" } ]`,
false,
"/baz",
},
{
`{ "foo": "bar" }`,
`[ { "op": "test", "path": "/baz", "value": null } ]`,
true,
"/baz",
},
}

func TestAllTest(t *testing.T) {
Expand Down

0 comments on commit bf22ed9

Please sign in to comment.