Skip to content

Commit 38143bd

Browse files
committed
fix: propagate json.Unmarshal error in mysql rowDataConverter
Signed-off-by: vedant21-oss <vedantmalodeofficial@gmail.com>
1 parent 78fdbeb commit 38143bd

2 files changed

Lines changed: 37 additions & 8 deletions

File tree

pkg/datastore/mysql/iterator.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
)
2525

2626
type dataConverter interface {
27-
Data() map[string]interface{}
27+
Data() (map[string]interface{}, error)
2828
}
2929

3030
// Iterator for MySQL result set
@@ -59,7 +59,10 @@ func (it *Iterator) Cursor() (string, error) {
5959
return "", datastore.ErrInvalidCursor
6060
}
6161

62-
lastObjData := it.last.Data()
62+
lastObjData, err := it.last.Data()
63+
if err != nil {
64+
return "", err
65+
}
6366

6467
cursor := make(map[string]interface{}, len(it.orders))
6568
for _, o := range it.orders {
@@ -80,11 +83,13 @@ type rowDataConverter struct {
8083
}
8184

8285
// Data make JSON object with key in CamelCase format.
83-
func (r *rowDataConverter) Data() map[string]interface{} {
86+
func (r *rowDataConverter) Data() (map[string]interface{}, error) {
8487
jsonRaw := convertKeys(json.RawMessage(r.val), convertSnakeToCamel)
8588
obj := make(map[string]interface{})
86-
json.Unmarshal(jsonRaw, &obj)
87-
return obj
89+
if err := json.Unmarshal(jsonRaw, &obj); err != nil {
90+
return nil, err
91+
}
92+
return obj, nil
8893
}
8994

9095
// convertKeys convert all keys of json object with convert function.

pkg/datastore/mysql/iterator_test.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package mysql
1616

1717
import (
1818
"encoding/base64"
19+
"errors"
1920
"testing"
2021

2122
"github.com/stretchr/testify/assert"
@@ -25,10 +26,11 @@ import (
2526

2627
type dummyDoc struct {
2728
val map[string]interface{}
29+
err error
2830
}
2931

30-
func (d *dummyDoc) Data() map[string]interface{} {
31-
return d.val
32+
func (d *dummyDoc) Data() (map[string]interface{}, error) {
33+
return d.val, d.err
3234
}
3335

3436
func TestCursor(t *testing.T) {
@@ -43,6 +45,15 @@ func TestCursor(t *testing.T) {
4345
iter: Iterator{},
4446
expectErr: true,
4547
},
48+
{
49+
name: "error on last data conversion",
50+
iter: Iterator{
51+
last: &dummyDoc{
52+
err: errors.New("data conversion error"),
53+
},
54+
},
55+
expectErr: true,
56+
},
4657
{
4758
name: "valid last cursor",
4859
iter: Iterator{
@@ -108,6 +119,7 @@ func TestData(t *testing.T) {
108119
name string
109120
rowData string
110121
expectedData map[string]interface{}
122+
expectErr bool
111123
}{
112124
{
113125
name: "valid data",
@@ -118,6 +130,7 @@ func TestData(t *testing.T) {
118130
"UpdatedAt": float64(100),
119131
"CreatedAt": float64(100),
120132
},
133+
expectErr: false,
121134
},
122135
{
123136
name: "valid nested data",
@@ -130,14 +143,25 @@ func TestData(t *testing.T) {
130143
"UpdatedAt": float64(100),
131144
"CreatedAt": float64(100),
132145
},
146+
expectErr: false,
147+
},
148+
{
149+
name: "invalid json data",
150+
rowData: `{"id": "object-id", "name": "app-1", "updated_at": 100, "created_at": 100`, // missing closing brace
151+
expectedData: nil,
152+
expectErr: true,
133153
},
134154
}
135155

136156
for _, tc := range testcases {
137157
t.Run(tc.name, func(t *testing.T) {
138158
converter := &rowDataConverter{val: tc.rowData}
139-
data := converter.Data()
159+
data, err := converter.Data()
140160
assert.Equal(t, tc.expectedData, data)
161+
assert.Equal(t, tc.expectErr, err != nil)
162+
if err != nil {
163+
t.Logf("Expected error caught: %v", err)
164+
}
141165
})
142166
}
143167
}

0 commit comments

Comments
 (0)