gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package optional_test
  4. import (
  5. std_json "encoding/json" //nolint:depguard // for testing purpose
  6. "testing"
  7. "code.gitea.io/gitea/modules/json"
  8. "code.gitea.io/gitea/modules/optional"
  9. "github.com/stretchr/testify/assert"
  10. "gopkg.in/yaml.v3"
  11. )
  12. type testSerializationStruct struct {
  13. NormalString string `json:"normal_string" yaml:"normal_string"`
  14. NormalBool bool `json:"normal_bool" yaml:"normal_bool"`
  15. OptBool optional.Option[bool] `json:"optional_bool,omitempty" yaml:"optional_bool,omitempty"`
  16. OptString optional.Option[string] `json:"optional_string,omitempty" yaml:"optional_string,omitempty"`
  17. OptTwoBool optional.Option[bool] `json:"optional_two_bool" yaml:"optional_two_bool"`
  18. OptTwoString optional.Option[string] `json:"optional_twostring" yaml:"optional_two_string"`
  19. }
  20. func TestOptionalToJson(t *testing.T) {
  21. tests := []struct {
  22. name string
  23. obj *testSerializationStruct
  24. want string
  25. }{
  26. {
  27. name: "empty",
  28. obj: new(testSerializationStruct),
  29. want: `{"normal_string":"","normal_bool":false,"optional_two_bool":null,"optional_twostring":null}`,
  30. },
  31. {
  32. name: "some",
  33. obj: &testSerializationStruct{
  34. NormalString: "a string",
  35. NormalBool: true,
  36. OptBool: optional.Some(false),
  37. OptString: optional.Some(""),
  38. OptTwoBool: optional.None[bool](),
  39. OptTwoString: optional.None[string](),
  40. },
  41. want: `{"normal_string":"a string","normal_bool":true,"optional_bool":false,"optional_string":"","optional_two_bool":null,"optional_twostring":null}`,
  42. },
  43. }
  44. for _, tc := range tests {
  45. t.Run(tc.name, func(t *testing.T) {
  46. b, err := json.Marshal(tc.obj)
  47. assert.NoError(t, err)
  48. assert.Equal(t, tc.want, string(b), "gitea json module returned unexpected")
  49. b, err = std_json.Marshal(tc.obj)
  50. assert.NoError(t, err)
  51. assert.Equal(t, tc.want, string(b), "std json module returned unexpected")
  52. })
  53. }
  54. }
  55. func TestOptionalFromJson(t *testing.T) {
  56. tests := []struct {
  57. name string
  58. data string
  59. want testSerializationStruct
  60. }{
  61. {
  62. name: "empty",
  63. data: `{}`,
  64. want: testSerializationStruct{
  65. NormalString: "",
  66. },
  67. },
  68. {
  69. name: "some",
  70. data: `{"normal_string":"a string","normal_bool":true,"optional_bool":false,"optional_string":"","optional_two_bool":null,"optional_twostring":null}`,
  71. want: testSerializationStruct{
  72. NormalString: "a string",
  73. NormalBool: true,
  74. OptBool: optional.Some(false),
  75. OptString: optional.Some(""),
  76. },
  77. },
  78. }
  79. for _, tc := range tests {
  80. t.Run(tc.name, func(t *testing.T) {
  81. var obj1 testSerializationStruct
  82. err := json.Unmarshal([]byte(tc.data), &obj1)
  83. assert.NoError(t, err)
  84. assert.Equal(t, tc.want, obj1, "gitea json module returned unexpected")
  85. var obj2 testSerializationStruct
  86. err = std_json.Unmarshal([]byte(tc.data), &obj2)
  87. assert.NoError(t, err)
  88. assert.Equal(t, tc.want, obj2, "std json module returned unexpected")
  89. })
  90. }
  91. }
  92. func TestOptionalToYaml(t *testing.T) {
  93. tests := []struct {
  94. name string
  95. obj *testSerializationStruct
  96. want string
  97. }{
  98. {
  99. name: "empty",
  100. obj: new(testSerializationStruct),
  101. want: `normal_string: ""
  102. normal_bool: false
  103. optional_two_bool: null
  104. optional_two_string: null
  105. `,
  106. },
  107. {
  108. name: "some",
  109. obj: &testSerializationStruct{
  110. NormalString: "a string",
  111. NormalBool: true,
  112. OptBool: optional.Some(false),
  113. OptString: optional.Some(""),
  114. },
  115. want: `normal_string: a string
  116. normal_bool: true
  117. optional_bool: false
  118. optional_string: ""
  119. optional_two_bool: null
  120. optional_two_string: null
  121. `,
  122. },
  123. }
  124. for _, tc := range tests {
  125. t.Run(tc.name, func(t *testing.T) {
  126. b, err := yaml.Marshal(tc.obj)
  127. assert.NoError(t, err)
  128. assert.Equal(t, tc.want, string(b), "yaml module returned unexpected")
  129. })
  130. }
  131. }
  132. func TestOptionalFromYaml(t *testing.T) {
  133. tests := []struct {
  134. name string
  135. data string
  136. want testSerializationStruct
  137. }{
  138. {
  139. name: "empty",
  140. data: ``,
  141. want: testSerializationStruct{},
  142. },
  143. {
  144. name: "empty but init",
  145. data: `normal_string: ""
  146. normal_bool: false
  147. optional_bool:
  148. optional_two_bool:
  149. optional_two_string:
  150. `,
  151. want: testSerializationStruct{},
  152. },
  153. {
  154. name: "some",
  155. data: `
  156. normal_string: a string
  157. normal_bool: true
  158. optional_bool: false
  159. optional_string: ""
  160. optional_two_bool: null
  161. optional_twostring: null
  162. `,
  163. want: testSerializationStruct{
  164. NormalString: "a string",
  165. NormalBool: true,
  166. OptBool: optional.Some(false),
  167. OptString: optional.Some(""),
  168. },
  169. },
  170. }
  171. for _, tc := range tests {
  172. t.Run(tc.name, func(t *testing.T) {
  173. var obj testSerializationStruct
  174. err := yaml.Unmarshal([]byte(tc.data), &obj)
  175. assert.NoError(t, err)
  176. assert.Equal(t, tc.want, obj, "yaml module returned unexpected")
  177. })
  178. }
  179. }