Skip to content

Commit 0db46a6

Browse files
author
Brendan Shephard
committed
Add tests for json decoder
This change adds tests to ensure that json values are decoded into the expected types. This verifies that numbers are decoded into json.Number types rather than floats. Signed-off-by: Brendan Shephard <bshephar@redhat.com>
1 parent 39907d9 commit 0db46a6

3 files changed

Lines changed: 169 additions & 1 deletion

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen
297297
ENVTEST ?= $(LOCALBIN)/setup-envtest
298298
CRD_MARKDOWN ?= $(LOCALBIN)/crd-to-markdown
299299
GINKGO ?= $(LOCALBIN)/ginkgo
300-
GINKGO_TESTS ?= ./tests/... ./apis/client/... ./apis/core/... ./apis/dataplane/...
300+
GINKGO_TESTS ?= ./tests/... ./apis/client/... ./apis/core/... ./apis/dataplane/... ./pkg/dataplane/...
301301

302302
KUTTL ?= $(LOCALBIN)/kubectl-kuttl
303303

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ require (
4040
github.com/openstack-k8s-operators/test-operator/api v0.6.1-0.20250415132754-51bb16559bed
4141
github.com/pkg/errors v0.9.1
4242
github.com/rabbitmq/cluster-operator/v2 v2.11.0
43+
github.com/stretchr/testify v1.10.0
4344
go.uber.org/zap v1.27.0
4445
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56
4546
gopkg.in/yaml.v3 v3.0.1
@@ -84,6 +85,7 @@ require (
8485
github.com/modern-go/reflect2 v1.0.2 // indirect
8586
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
8687
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20250423055245-3cb2ae8df6f0 // indirect
88+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
8789
github.com/prometheus/client_golang v1.19.0 // indirect
8890
github.com/prometheus/client_model v0.6.0 // indirect
8991
github.com/prometheus/common v0.53.0 // indirect

pkg/dataplane/inventory_test.go

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
package deployment
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestProcessConfigMapData_NumbersAsInts(t *testing.T) {
11+
tests := []struct {
12+
name string
13+
data map[string]string
14+
prefix string
15+
expected map[string]interface{}
16+
expectedType any
17+
}{
18+
{
19+
name: "string value remains string",
20+
data: map[string]string{
21+
"foo": "bar",
22+
},
23+
prefix: "",
24+
expected: map[string]interface{}{
25+
"foo": "bar",
26+
},
27+
expectedType: "",
28+
},
29+
{
30+
name: "integer number decoded correctly",
31+
data: map[string]string{
32+
"intVal": "123",
33+
},
34+
prefix: "",
35+
expected: map[string]interface{}{
36+
"intVal": json.Number("123"),
37+
},
38+
expectedType: json.Number("1"),
39+
},
40+
{
41+
name: "float number decoded correctly",
42+
data: map[string]string{
43+
"floatVal": "123.45",
44+
},
45+
prefix: "",
46+
expected: map[string]interface{}{
47+
"floatVal": json.Number("123.45"),
48+
},
49+
expectedType: json.Number("1"),
50+
},
51+
{
52+
name: "with prefix",
53+
data: map[string]string{
54+
"somekey": "42",
55+
},
56+
prefix: "myprefix-",
57+
expected: map[string]interface{}{
58+
"myprefix-somekey": json.Number("42"),
59+
},
60+
expectedType: json.Number("1"),
61+
},
62+
}
63+
64+
for _, tt := range tests {
65+
t.Run(tt.name, func(t *testing.T) {
66+
result := make(map[string]any)
67+
err := processConfigMapData(tt.data, tt.prefix, result)
68+
assert.NoError(t, err)
69+
70+
for k, v := range tt.expected {
71+
actual, ok := result[k]
72+
assert.True(t, ok, "key %s should exist", k)
73+
74+
assert.IsType(t, tt.expectedType, actual)
75+
76+
expectedVal, ok1 := v.(json.Number)
77+
actualVal, ok2 := actual.(json.Number)
78+
79+
if ok1 && ok2 {
80+
assert.Equal(t, expectedVal, actualVal)
81+
} else {
82+
assert.Equal(t, v, actual)
83+
}
84+
}
85+
})
86+
}
87+
}
88+
89+
func TestProcessSecretData_NumbersAsInts(t *testing.T) {
90+
tests := []struct {
91+
name string
92+
data map[string][]byte
93+
prefix string
94+
expected map[string]interface{}
95+
expectedType any
96+
}{
97+
{
98+
name: "string value remains string",
99+
data: map[string][]byte{
100+
"foo": []byte("bar"),
101+
},
102+
prefix: "",
103+
expected: map[string]interface{}{
104+
"foo": "bar",
105+
},
106+
expectedType: "",
107+
},
108+
{
109+
name: "integer number decoded correctly",
110+
data: map[string][]byte{
111+
"intVal": []byte("123"),
112+
},
113+
prefix: "",
114+
expected: map[string]interface{}{
115+
"intVal": json.Number("123"),
116+
},
117+
expectedType: json.Number("1"),
118+
},
119+
{
120+
name: "float number decoded correctly",
121+
data: map[string][]byte{
122+
"floatVal": []byte("123.45"),
123+
},
124+
prefix: "",
125+
expected: map[string]interface{}{
126+
"floatVal": json.Number("123.45"),
127+
},
128+
expectedType: json.Number("1"),
129+
},
130+
{
131+
name: "with prefix",
132+
data: map[string][]byte{
133+
"somekey": []byte("42"),
134+
},
135+
prefix: "myprefix-",
136+
expected: map[string]interface{}{
137+
"myprefix-somekey": json.Number("42"),
138+
},
139+
expectedType: json.Number("1"),
140+
},
141+
}
142+
143+
for _, tt := range tests {
144+
t.Run(tt.name, func(t *testing.T) {
145+
result := make(map[string]any)
146+
err := processSecretData(tt.data, tt.prefix, result)
147+
assert.NoError(t, err)
148+
149+
for k, v := range tt.expected {
150+
actual, ok := result[k]
151+
assert.True(t, ok, "key %s should exist", k)
152+
153+
assert.IsType(t, tt.expectedType, actual)
154+
155+
expectedVal, ok1 := v.(json.Number)
156+
actualVal, ok2 := actual.(json.Number)
157+
158+
if ok1 && ok2 {
159+
assert.Equal(t, expectedVal, actualVal)
160+
} else {
161+
assert.Equal(t, v, actual)
162+
}
163+
}
164+
})
165+
}
166+
}

0 commit comments

Comments
 (0)