191 lines · 4.8 KB · Go
RawDownload
// Copyright 2024 The Gitea Authors. All rights reserved.// SPDX-License-Identifier: MIT package optional_test import (	std_json "encoding/json" //nolint:depguard	"testing" 	"forgejo.org/modules/json"	"forgejo.org/modules/optional" 	"github.com/stretchr/testify/assert"	"github.com/stretchr/testify/require"	"gopkg.in/yaml.v3") type testSerializationStruct struct {	NormalString string                  `json:"normal_string" yaml:"normal_string"`	NormalBool   bool                    `json:"normal_bool" yaml:"normal_bool"`	OptBool      optional.Option[bool]   `json:"optional_bool,omitempty" yaml:"optional_bool,omitempty"`	OptString    optional.Option[string] `json:"optional_string,omitempty" yaml:"optional_string,omitempty"`	OptTwoBool   optional.Option[bool]   `json:"optional_two_bool" yaml:"optional_two_bool"`	OptTwoString optional.Option[string] `json:"optional_twostring" yaml:"optional_two_string"`} func TestOptionalToJson(t *testing.T) {	tests := []struct {		name string		obj  *testSerializationStruct		want string	}{		{			name: "empty",			obj:  new(testSerializationStruct),			want: `{"normal_string":"","normal_bool":false,"optional_two_bool":null,"optional_twostring":null}`,		},		{			name: "some",			obj: &testSerializationStruct{				NormalString: "a string",				NormalBool:   true,				OptBool:      optional.Some(false),				OptString:    optional.Some(""),				OptTwoBool:   optional.None[bool](),				OptTwoString: optional.None[string](),			},			want: `{"normal_string":"a string","normal_bool":true,"optional_bool":false,"optional_string":"","optional_two_bool":null,"optional_twostring":null}`,		},	}	for _, tc := range tests {		t.Run(tc.name, func(t *testing.T) {			b, err := json.Marshal(tc.obj)			require.NoError(t, err)			assert.Equal(t, tc.want, string(b), "gitea json module returned unexpected") 			b, err = std_json.Marshal(tc.obj)			require.NoError(t, err)			assert.Equal(t, tc.want, string(b), "std json module returned unexpected")		})	}} func TestOptionalFromJson(t *testing.T) {	tests := []struct {		name string		data string		want testSerializationStruct	}{		{			name: "empty",			data: `{}`,			want: testSerializationStruct{				NormalString: "",			},		},		{			name: "some",			data: `{"normal_string":"a string","normal_bool":true,"optional_bool":false,"optional_string":"","optional_two_bool":null,"optional_twostring":null}`,			want: testSerializationStruct{				NormalString: "a string",				NormalBool:   true,				OptBool:      optional.Some(false),				OptString:    optional.Some(""),			},		},	}	for _, tc := range tests {		t.Run(tc.name, func(t *testing.T) {			var obj1 testSerializationStruct			err := json.Unmarshal([]byte(tc.data), &obj1)			require.NoError(t, err)			assert.Equal(t, tc.want, obj1, "gitea json module returned unexpected") 			var obj2 testSerializationStruct			err = std_json.Unmarshal([]byte(tc.data), &obj2)			require.NoError(t, err)			assert.Equal(t, tc.want, obj2, "std json module returned unexpected")		})	}} func TestOptionalToYaml(t *testing.T) {	tests := []struct {		name string		obj  *testSerializationStruct		want string	}{		{			name: "empty",			obj:  new(testSerializationStruct),			want: `normal_string: ""normal_bool: falseoptional_two_bool: nulloptional_two_string: null`,		},		{			name: "some",			obj: &testSerializationStruct{				NormalString: "a string",				NormalBool:   true,				OptBool:      optional.Some(false),				OptString:    optional.Some(""),			},			want: `normal_string: a stringnormal_bool: trueoptional_bool: falseoptional_string: ""optional_two_bool: nulloptional_two_string: null`,		},	}	for _, tc := range tests {		t.Run(tc.name, func(t *testing.T) {			b, err := yaml.Marshal(tc.obj)			require.NoError(t, err)			assert.Equal(t, tc.want, string(b), "yaml module returned unexpected")		})	}} func TestOptionalFromYaml(t *testing.T) {	tests := []struct {		name string		data string		want testSerializationStruct	}{		{			name: "empty",			data: ``,			want: testSerializationStruct{},		},		{			name: "empty but init",			data: `normal_string: ""normal_bool: falseoptional_bool:optional_two_bool:optional_two_string:`,			want: testSerializationStruct{},		},		{			name: "some",			data: `normal_string: a stringnormal_bool: trueoptional_bool: falseoptional_string: ""optional_two_bool: nulloptional_twostring: null`,			want: testSerializationStruct{				NormalString: "a string",				NormalBool:   true,				OptBool:      optional.Some(false),				OptString:    optional.Some(""),			},		},	}	for _, tc := range tests {		t.Run(tc.name, func(t *testing.T) {			var obj testSerializationStruct			err := yaml.Unmarshal([]byte(tc.data), &obj)			require.NoError(t, err)			assert.Equal(t, tc.want, obj, "yaml module returned unexpected")		})	}}