code.gitea.io/gitea@v1.22.3/modules/optional/serialization_test.go (about)

     1  // Copyright 2024 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package optional_test
     5  
     6  import (
     7  	std_json "encoding/json" //nolint:depguard
     8  	"testing"
     9  
    10  	"code.gitea.io/gitea/modules/json"
    11  	"code.gitea.io/gitea/modules/optional"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  	"gopkg.in/yaml.v3"
    15  )
    16  
    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"`
    24  }
    25  
    26  func TestOptionalToJson(t *testing.T) {
    27  	tests := []struct {
    28  		name string
    29  		obj  *testSerializationStruct
    30  		want string
    31  	}{
    32  		{
    33  			name: "empty",
    34  			obj:  new(testSerializationStruct),
    35  			want: `{"normal_string":"","normal_bool":false,"optional_two_bool":null,"optional_twostring":null}`,
    36  		},
    37  		{
    38  			name: "some",
    39  			obj: &testSerializationStruct{
    40  				NormalString: "a string",
    41  				NormalBool:   true,
    42  				OptBool:      optional.Some(false),
    43  				OptString:    optional.Some(""),
    44  				OptTwoBool:   optional.None[bool](),
    45  				OptTwoString: optional.None[string](),
    46  			},
    47  			want: `{"normal_string":"a string","normal_bool":true,"optional_bool":false,"optional_string":"","optional_two_bool":null,"optional_twostring":null}`,
    48  		},
    49  	}
    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")
    55  
    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")
    59  		})
    60  	}
    61  }
    62  
    63  func TestOptionalFromJson(t *testing.T) {
    64  	tests := []struct {
    65  		name string
    66  		data string
    67  		want testSerializationStruct
    68  	}{
    69  		{
    70  			name: "empty",
    71  			data: `{}`,
    72  			want: testSerializationStruct{
    73  				NormalString: "",
    74  			},
    75  		},
    76  		{
    77  			name: "some",
    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",
    81  				NormalBool:   true,
    82  				OptBool:      optional.Some(false),
    83  				OptString:    optional.Some(""),
    84  			},
    85  		},
    86  	}
    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")
    93  
    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")
    98  		})
    99  	}
   100  }
   101  
   102  func TestOptionalToYaml(t *testing.T) {
   103  	tests := []struct {
   104  		name string
   105  		obj  *testSerializationStruct
   106  		want string
   107  	}{
   108  		{
   109  			name: "empty",
   110  			obj:  new(testSerializationStruct),
   111  			want: `normal_string: ""
   112  normal_bool: false
   113  optional_two_bool: null
   114  optional_two_string: null
   115  `,
   116  		},
   117  		{
   118  			name: "some",
   119  			obj: &testSerializationStruct{
   120  				NormalString: "a string",
   121  				NormalBool:   true,
   122  				OptBool:      optional.Some(false),
   123  				OptString:    optional.Some(""),
   124  			},
   125  			want: `normal_string: a string
   126  normal_bool: true
   127  optional_bool: false
   128  optional_string: ""
   129  optional_two_bool: null
   130  optional_two_string: null
   131  `,
   132  		},
   133  	}
   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")
   139  		})
   140  	}
   141  }
   142  
   143  func TestOptionalFromYaml(t *testing.T) {
   144  	tests := []struct {
   145  		name string
   146  		data string
   147  		want testSerializationStruct
   148  	}{
   149  		{
   150  			name: "empty",
   151  			data: ``,
   152  			want: testSerializationStruct{},
   153  		},
   154  		{
   155  			name: "empty but init",
   156  			data: `normal_string: ""
   157  normal_bool: false
   158  optional_bool:
   159  optional_two_bool:
   160  optional_two_string:
   161  `,
   162  			want: testSerializationStruct{},
   163  		},
   164  		{
   165  			name: "some",
   166  			data: `
   167  normal_string: a string
   168  normal_bool: true
   169  optional_bool: false
   170  optional_string: ""
   171  optional_two_bool: null
   172  optional_twostring: null
   173  `,
   174  			want: testSerializationStruct{
   175  				NormalString: "a string",
   176  				NormalBool:   true,
   177  				OptBool:      optional.Some(false),
   178  				OptString:    optional.Some(""),
   179  			},
   180  		},
   181  	}
   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")
   188  		})
   189  	}
   190  }