1
// Copyright 2024 The Gitea Authors. All rights reserved.
2
// SPDX-License-Identifier: MIT
7
std_json "encoding/json" //nolint:depguard
10
"code.gitea.io/gitea/modules/json"
11
"code.gitea.io/gitea/modules/optional"
13
"github.com/stretchr/testify/assert"
17
type testSerializationStruct struct {
18
NormalString string `json:"normal_string" yaml:"normal_string"`
19
NormalBool bool `json:"normal_bool" yaml:"normal_bool"`
20
OptBool optional.Option[bool] `json:"optional_bool,omitempty" yaml:"optional_bool,omitempty"`
21
OptString optional.Option[string] `json:"optional_string,omitempty" yaml:"optional_string,omitempty"`
22
OptTwoBool optional.Option[bool] `json:"optional_two_bool" yaml:"optional_two_bool"`
23
OptTwoString optional.Option[string] `json:"optional_twostring" yaml:"optional_two_string"`
26
func TestOptionalToJson(t *testing.T) {
29
obj *testSerializationStruct
34
obj: new(testSerializationStruct),
35
want: `{"normal_string":"","normal_bool":false,"optional_two_bool":null,"optional_twostring":null}`,
39
obj: &testSerializationStruct{
40
NormalString: "a string",
42
OptBool: optional.Some(false),
43
OptString: optional.Some(""),
44
OptTwoBool: optional.None[bool](),
45
OptTwoString: optional.None[string](),
47
want: `{"normal_string":"a string","normal_bool":true,"optional_bool":false,"optional_string":"","optional_two_bool":null,"optional_twostring":null}`,
50
for _, tc := range tests {
51
t.Run(tc.name, func(t *testing.T) {
52
b, err := json.Marshal(tc.obj)
53
assert.NoError(t, err)
54
assert.EqualValues(t, tc.want, string(b), "gitea json module returned unexpected")
56
b, err = std_json.Marshal(tc.obj)
57
assert.NoError(t, err)
58
assert.EqualValues(t, tc.want, string(b), "std json module returned unexpected")
63
func TestOptionalFromJson(t *testing.T) {
67
want testSerializationStruct
72
want: testSerializationStruct{
78
data: `{"normal_string":"a string","normal_bool":true,"optional_bool":false,"optional_string":"","optional_two_bool":null,"optional_twostring":null}`,
79
want: testSerializationStruct{
80
NormalString: "a string",
82
OptBool: optional.Some(false),
83
OptString: optional.Some(""),
87
for _, tc := range tests {
88
t.Run(tc.name, func(t *testing.T) {
89
var obj1 testSerializationStruct
90
err := json.Unmarshal([]byte(tc.data), &obj1)
91
assert.NoError(t, err)
92
assert.EqualValues(t, tc.want, obj1, "gitea json module returned unexpected")
94
var obj2 testSerializationStruct
95
err = std_json.Unmarshal([]byte(tc.data), &obj2)
96
assert.NoError(t, err)
97
assert.EqualValues(t, tc.want, obj2, "std json module returned unexpected")
102
func TestOptionalToYaml(t *testing.T) {
105
obj *testSerializationStruct
110
obj: new(testSerializationStruct),
111
want: `normal_string: ""
113
optional_two_bool: null
114
optional_two_string: null
119
obj: &testSerializationStruct{
120
NormalString: "a string",
122
OptBool: optional.Some(false),
123
OptString: optional.Some(""),
125
want: `normal_string: a string
129
optional_two_bool: null
130
optional_two_string: null
134
for _, tc := range tests {
135
t.Run(tc.name, func(t *testing.T) {
136
b, err := yaml.Marshal(tc.obj)
137
assert.NoError(t, err)
138
assert.EqualValues(t, tc.want, string(b), "yaml module returned unexpected")
143
func TestOptionalFromYaml(t *testing.T) {
147
want testSerializationStruct
152
want: testSerializationStruct{},
155
name: "empty but init",
156
data: `normal_string: ""
162
want: testSerializationStruct{},
167
normal_string: a string
171
optional_two_bool: null
172
optional_twostring: null
174
want: testSerializationStruct{
175
NormalString: "a string",
177
OptBool: optional.Some(false),
178
OptString: optional.Some(""),
182
for _, tc := range tests {
183
t.Run(tc.name, func(t *testing.T) {
184
var obj testSerializationStruct
185
err := yaml.Unmarshal([]byte(tc.data), &obj)
186
assert.NoError(t, err)
187
assert.EqualValues(t, tc.want, obj, "yaml module returned unexpected")