Skip to content

Commit 80920c3

Browse files
committed
test: improved test coverage
* refactored to remove unreachable (untestable) code * added tests for edge cases Signed-off-by: Frédéric BIDON <[email protected]>
1 parent b834f57 commit 80920c3

File tree

2 files changed

+79
-29
lines changed

2 files changed

+79
-29
lines changed

pointer.go

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,18 @@ func (p *Pointer) Offset(document string) (int64, error) {
114114

115115
// "Constructor", parses the given string JSON pointer
116116
func (p *Pointer) parse(jsonPointerString string) error {
117-
var err error
118-
119-
if jsonPointerString != emptyPointer {
120-
if !strings.HasPrefix(jsonPointerString, pointerSeparator) {
121-
err = errors.Join(ErrInvalidStart, ErrPointer)
122-
} else {
123-
referenceTokens := strings.Split(jsonPointerString, pointerSeparator)
124-
p.referenceTokens = append(p.referenceTokens, referenceTokens[1:]...)
125-
}
117+
if jsonPointerString == emptyPointer {
118+
return nil
119+
}
120+
121+
if !strings.HasPrefix(jsonPointerString, pointerSeparator) {
122+
return errors.Join(ErrInvalidStart, ErrPointer)
126123
}
127124

128-
return err
125+
referenceTokens := strings.Split(jsonPointerString, pointerSeparator)
126+
p.referenceTokens = append(p.referenceTokens, referenceTokens[1:]...)
127+
128+
return nil
129129
}
130130

131131
func (p *Pointer) get(node any, nameProvider *jsonname.NameProvider) (any, reflect.Kind, error) {
@@ -166,33 +166,36 @@ func (p *Pointer) set(node, data any, nameProvider *jsonname.NameProvider) error
166166
)
167167
}
168168

169-
if nameProvider == nil {
170-
nameProvider = jsonname.DefaultJSONNameProvider
171-
}
169+
l := len(p.referenceTokens)
172170

173171
// full document when empty
174-
if len(p.referenceTokens) == 0 {
172+
if l == 0 {
175173
return nil
176174
}
177175

178-
lastI := len(p.referenceTokens) - 1
179-
for i, token := range p.referenceTokens {
180-
isLastToken := i == lastI
181-
decodedToken := Unescape(token)
176+
if nameProvider == nil {
177+
nameProvider = jsonname.DefaultJSONNameProvider
178+
}
182179

183-
if isLastToken {
184-
return setSingleImpl(node, data, decodedToken, nameProvider)
185-
}
180+
var decodedToken string
181+
lastIndex := l - 1
186182

187-
next, err := p.resolveNodeForToken(node, decodedToken, nameProvider)
188-
if err != nil {
189-
return err
190-
}
183+
if lastIndex > 0 { // skip if we only have one token in pointer
184+
for _, token := range p.referenceTokens[:lastIndex] {
185+
decodedToken = Unescape(token)
186+
next, err := p.resolveNodeForToken(node, decodedToken, nameProvider)
187+
if err != nil {
188+
return err
189+
}
191190

192-
node = next
191+
node = next
192+
}
193193
}
194194

195-
return nil
195+
// last token
196+
decodedToken = Unescape(p.referenceTokens[lastIndex])
197+
198+
return setSingleImpl(node, data, decodedToken, nameProvider)
196199
}
197200

198201
func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvider *jsonname.NameProvider) (next any, err error) {
@@ -420,6 +423,7 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) {
420423
return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer)
421424
}
422425
}
426+
423427
return 0, fmt.Errorf("token reference %q not found: %w", decodedToken, ErrPointer)
424428
}
425429

@@ -452,6 +456,7 @@ func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) {
452456
if !dec.More() {
453457
return 0, fmt.Errorf("token reference %q not found: %w", decodedToken, ErrPointer)
454458
}
459+
455460
return dec.InputOffset(), nil
456461
}
457462

@@ -477,10 +482,11 @@ func drainSingle(dec *json.Decoder) error {
477482
}
478483
}
479484

480-
// Consumes the ending delim
485+
// consumes the ending delim
481486
if _, err := dec.Token(); err != nil {
482487
return err
483488
}
489+
484490
return nil
485491
}
486492

pointer_test.go

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,27 @@ func TestFullDocument(t *testing.T) {
102102
asMap, ok := result.(map[string]any)
103103
require.True(t, ok)
104104
require.Lenf(t, asMap, testDocumentNBItems(), "Get(%v) = %v, expect full document", in, result)
105+
106+
t.Run("should set value in doc, with nil name provider", func(t *testing.T) {
107+
setter, err := New("/foo/0")
108+
require.NoErrorf(t, err, "New(%v) error %v", in, err)
109+
110+
const value = "hey"
111+
require.NoError(t, setter.set(asMap, value, nil))
112+
113+
foos, ok := asMap["foo"]
114+
require.True(t, ok)
115+
116+
asArray, ok := foos.([]any)
117+
require.True(t, ok)
118+
require.Len(t, asArray, 2)
119+
120+
foo := asArray[0]
121+
bar, ok := foo.(string)
122+
require.True(t, ok)
123+
124+
require.Equal(t, value, bar)
125+
})
105126
})
106127
})
107128
}
@@ -367,7 +388,7 @@ func TestOtherThings(t *testing.T) {
367388
require.Error(t, err)
368389
})
369390

370-
t.Run("resolving pointer against an unsupport type (int) should error", func(t *testing.T) {
391+
t.Run("resolving pointer against an unsupported type (int) should error", func(t *testing.T) {
371392
p, err := New("/invalid")
372393
require.NoError(t, err)
373394
_, _, err = p.Get(1234)
@@ -861,3 +882,26 @@ func TestOffset(t *testing.T) {
861882
})
862883
}
863884
}
885+
886+
func TestEdgeCases(t *testing.T) {
887+
t.Parallel()
888+
889+
t.Run("set at pointer against an unsupported type (int) should error", func(t *testing.T) {
890+
p, err := New("/invalid")
891+
require.NoError(t, err)
892+
_, err = p.Set(1, 1234)
893+
require.Error(t, err)
894+
require.ErrorIs(t, err, ErrUnsupportedValueType)
895+
})
896+
897+
t.Run("set with empty pointer", func(t *testing.T) {
898+
p, err := New("")
899+
require.NoError(t, err)
900+
901+
doc := testDocumentJSON(t)
902+
newDoc, err := p.Set(doc, 1)
903+
require.NoError(t, err)
904+
905+
require.Equal(t, doc, newDoc)
906+
})
907+
}

0 commit comments

Comments
 (0)