Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/river/encoding/encoding_test.go
4095 views
1
package encoding_test
2
3
import (
4
"io"
5
"testing"
6
7
"github.com/grafana/agent/pkg/river/encoding"
8
"github.com/stretchr/testify/require"
9
)
10
11
func TestConvertRiverBodyToJSON_CapsuleValue(t *testing.T) {
12
type Content struct {
13
Field io.Closer `river:"writer,attr"`
14
}
15
16
out, err := encoding.ConvertRiverBodyToJSON(Content{Field: io.NopCloser(nil)})
17
require.NoError(t, err)
18
19
expect := `[
20
{
21
"name": "writer",
22
"type": "attr",
23
"value": {
24
"type": "capsule",
25
"value": "capsule(\"io.Closer\")"
26
}
27
}
28
]`
29
30
require.JSONEq(t, expect, string(out))
31
}
32
33
func TestConvertRiverBodyToJSON_Label(t *testing.T) {
34
// In this test since Name is a label it should NOT be represented in the convertRiverBody
35
type Content struct {
36
Name string `river:",label"`
37
DummyVal string `river:"dummy,attr,optional"`
38
}
39
40
out, err := encoding.ConvertRiverBodyToJSON(Content{
41
Name: "label_test",
42
DummyVal: "dummy_test"})
43
require.NoError(t, err)
44
45
expect := `[
46
{
47
"name": "dummy",
48
"type": "attr",
49
"value": {"type":"string","value":"dummy_test"}
50
}
51
]`
52
53
require.JSONEq(t, expect, string(out))
54
}
55
56
func TestConvertRiverBodyToJSON_BlockWithZeroValue(t *testing.T) {
57
type t1 struct {
58
Age int `river:"age,attr"`
59
}
60
type parent struct {
61
Person *t1 `river:"person,block"`
62
}
63
64
out, err := encoding.ConvertRiverBodyToJSON(parent{Person: &t1{Age: 0}})
65
require.NoError(t, err)
66
67
expect := `[{
68
"name": "person",
69
"type": "block",
70
"body": [{
71
"name": "age",
72
"type": "attr",
73
"value": {
74
"type": "number",
75
"value": 0
76
}
77
}]
78
}]`
79
80
require.JSONEq(t, expect, string(out))
81
}
82
83
func TestConvertRiverBodyToJSON_Enum_Block(t *testing.T) {
84
type InnerBlock struct {
85
Number int `river:"number,attr"`
86
}
87
88
type EnumBlock struct {
89
BlockA *InnerBlock `river:"a,block,optional"`
90
BlockB *InnerBlock `river:"b,block,optional"`
91
BlockC *InnerBlock `river:"c,block,optional"`
92
}
93
94
type Structure struct {
95
Field string `river:"field,attr"`
96
97
OtherBlocks []EnumBlock `river:"block,enum"`
98
}
99
100
in := Structure{
101
Field: "some_value",
102
OtherBlocks: []EnumBlock{
103
{BlockC: &InnerBlock{Number: 1}},
104
{BlockB: &InnerBlock{Number: 2}},
105
{BlockC: &InnerBlock{Number: 3}},
106
},
107
}
108
109
actual, err := encoding.ConvertRiverBodyToJSON(in)
110
require.NoError(t, err)
111
112
expect := `[{
113
"name": "field",
114
"type": "attr",
115
"value": {
116
"type": "string",
117
"value": "some_value"
118
}
119
}, {
120
"name": "block.c",
121
"type": "block",
122
"body": [{
123
"name": "number",
124
"type": "attr",
125
"value": { "type": "number", "value": 1 }
126
}]
127
}, {
128
"name": "block.b",
129
"type": "block",
130
"body": [{
131
"name": "number",
132
"type": "attr",
133
"value": { "type": "number", "value": 2 }
134
}]
135
}, {
136
"name": "block.c",
137
"type": "block",
138
"body": [{
139
"name": "number",
140
"type": "attr",
141
"value": { "type": "number", "value": 3 }
142
}]
143
}]`
144
145
require.JSONEq(t, expect, string(actual))
146
}
147
148
func TestMapBlocks(t *testing.T) {
149
type Body struct {
150
Block map[string]string `river:"some_block,block,optional"`
151
}
152
153
val := Body{
154
Block: map[string]string{"key": "value"},
155
}
156
157
actual, err := encoding.ConvertRiverBodyToJSON(val)
158
require.NoError(t, err)
159
160
expect := `[{
161
"name": "some_block",
162
"type": "block",
163
"body": [{
164
"name": "key",
165
"type": "attr",
166
"value": { "type": "string", "value": "value" }
167
}]
168
}]`
169
170
require.JSONEq(t, expect, string(actual))
171
}
172
173