field_test.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package schema_test
  2. import (
  3. "database/sql"
  4. "reflect"
  5. "sync"
  6. "testing"
  7. "time"
  8. "github.com/jinzhu/gorm"
  9. "github.com/jinzhu/gorm/schema"
  10. "github.com/jinzhu/gorm/tests"
  11. )
  12. func TestFieldValuerAndSetter(t *testing.T) {
  13. var (
  14. userSchema, _, _ = schema.Parse(&tests.User{}, &sync.Map{}, schema.NamingStrategy{})
  15. user = tests.User{
  16. Model: gorm.Model{
  17. ID: 10,
  18. CreatedAt: time.Now(),
  19. DeletedAt: tests.Now(),
  20. },
  21. Name: "valuer_and_setter",
  22. Age: 18,
  23. Birthday: tests.Now(),
  24. Active: true,
  25. }
  26. reflectValue = reflect.ValueOf(&user)
  27. )
  28. // test valuer
  29. values := map[string]interface{}{
  30. "name": user.Name,
  31. "id": user.ID,
  32. "created_at": user.CreatedAt,
  33. "deleted_at": user.DeletedAt,
  34. "age": user.Age,
  35. "birthday": user.Birthday,
  36. "active": true,
  37. }
  38. checkField(t, userSchema, reflectValue, values)
  39. // test setter
  40. newValues := map[string]interface{}{
  41. "name": "valuer_and_setter_2",
  42. "id": 2,
  43. "created_at": time.Now(),
  44. "deleted_at": tests.Now(),
  45. "age": 20,
  46. "birthday": time.Now(),
  47. "active": false,
  48. }
  49. for k, v := range newValues {
  50. if err := userSchema.FieldsByDBName[k].Set(reflectValue, v); err != nil {
  51. t.Errorf("no error should happen when assign value to field %v, but got %v", k, err)
  52. }
  53. }
  54. checkField(t, userSchema, reflectValue, newValues)
  55. // test valuer and other type
  56. age := myint(10)
  57. newValues2 := map[string]interface{}{
  58. "name": sql.NullString{String: "valuer_and_setter_3", Valid: true},
  59. "id": &sql.NullInt64{Int64: 3, Valid: true},
  60. "created_at": tests.Now(),
  61. "deleted_at": time.Now(),
  62. "age": &age,
  63. "birthday": mytime(time.Now()),
  64. "active": mybool(true),
  65. }
  66. for k, v := range newValues2 {
  67. if err := userSchema.FieldsByDBName[k].Set(reflectValue, v); err != nil {
  68. t.Errorf("no error should happen when assign value to field %v, but got %v", k, err)
  69. }
  70. }
  71. checkField(t, userSchema, reflectValue, newValues2)
  72. }
  73. func TestPointerFieldValuerAndSetter(t *testing.T) {
  74. var (
  75. userSchema, _, _ = schema.Parse(&User{}, &sync.Map{}, schema.NamingStrategy{})
  76. name = "pointer_field_valuer_and_setter"
  77. age uint = 18
  78. active = true
  79. user = User{
  80. Model: &gorm.Model{
  81. ID: 10,
  82. CreatedAt: time.Now(),
  83. DeletedAt: tests.Now(),
  84. },
  85. Name: &name,
  86. Age: &age,
  87. Birthday: tests.Now(),
  88. Active: &active,
  89. }
  90. reflectValue = reflect.ValueOf(&user)
  91. )
  92. // test valuer
  93. values := map[string]interface{}{
  94. "name": user.Name,
  95. "id": user.ID,
  96. "created_at": user.CreatedAt,
  97. "deleted_at": user.DeletedAt,
  98. "age": user.Age,
  99. "birthday": user.Birthday,
  100. "active": true,
  101. }
  102. checkField(t, userSchema, reflectValue, values)
  103. // test setter
  104. newValues := map[string]interface{}{
  105. "name": "valuer_and_setter_2",
  106. "id": 2,
  107. "created_at": time.Now(),
  108. "deleted_at": tests.Now(),
  109. "age": 20,
  110. "birthday": time.Now(),
  111. "active": false,
  112. }
  113. for k, v := range newValues {
  114. if err := userSchema.FieldsByDBName[k].Set(reflectValue, v); err != nil {
  115. t.Errorf("no error should happen when assign value to field %v, but got %v", k, err)
  116. }
  117. }
  118. checkField(t, userSchema, reflectValue, newValues)
  119. // test valuer and other type
  120. age2 := myint(10)
  121. newValues2 := map[string]interface{}{
  122. "name": sql.NullString{String: "valuer_and_setter_3", Valid: true},
  123. "id": &sql.NullInt64{Int64: 3, Valid: true},
  124. "created_at": tests.Now(),
  125. "deleted_at": time.Now(),
  126. "age": &age2,
  127. "birthday": mytime(time.Now()),
  128. "active": mybool(true),
  129. }
  130. for k, v := range newValues2 {
  131. if err := userSchema.FieldsByDBName[k].Set(reflectValue, v); err != nil {
  132. t.Errorf("no error should happen when assign value to field %v, but got %v", k, err)
  133. }
  134. }
  135. checkField(t, userSchema, reflectValue, newValues2)
  136. }
  137. func TestAdvancedDataTypeValuerAndSetter(t *testing.T) {
  138. var (
  139. userSchema, _, _ = schema.Parse(&AdvancedDataTypeUser{}, &sync.Map{}, schema.NamingStrategy{})
  140. name = "advanced_data_type_valuer_and_setter"
  141. deletedAt = mytime(time.Now())
  142. isAdmin = mybool(false)
  143. user = AdvancedDataTypeUser{
  144. ID: sql.NullInt64{Int64: 10, Valid: true},
  145. Name: &sql.NullString{String: name, Valid: true},
  146. Birthday: sql.NullTime{Time: time.Now(), Valid: true},
  147. RegisteredAt: mytime(time.Now()),
  148. DeletedAt: &deletedAt,
  149. Active: mybool(true),
  150. Admin: &isAdmin,
  151. }
  152. reflectValue = reflect.ValueOf(&user)
  153. )
  154. // test valuer
  155. values := map[string]interface{}{
  156. "id": user.ID,
  157. "name": user.Name,
  158. "birthday": user.Birthday,
  159. "registered_at": user.RegisteredAt,
  160. "deleted_at": user.DeletedAt,
  161. "active": user.Active,
  162. "admin": user.Admin,
  163. }
  164. checkField(t, userSchema, reflectValue, values)
  165. // test setter
  166. newDeletedAt := mytime(time.Now())
  167. newIsAdmin := mybool(true)
  168. newValues := map[string]interface{}{
  169. "id": sql.NullInt64{Int64: 1, Valid: true},
  170. "name": &sql.NullString{String: name + "rename", Valid: true},
  171. "birthday": time.Now(),
  172. "registered_at": mytime(time.Now()),
  173. "deleted_at": &newDeletedAt,
  174. "active": mybool(false),
  175. "admin": &newIsAdmin,
  176. }
  177. for k, v := range newValues {
  178. if err := userSchema.FieldsByDBName[k].Set(reflectValue, v); err != nil {
  179. t.Errorf("no error should happen when assign value to field %v, but got %v", k, err)
  180. }
  181. }
  182. checkField(t, userSchema, reflectValue, newValues)
  183. newValues2 := map[string]interface{}{
  184. "id": 5,
  185. "name": name + "rename2",
  186. "birthday": time.Now(),
  187. "registered_at": time.Now(),
  188. "deleted_at": time.Now(),
  189. "active": true,
  190. "admin": false,
  191. }
  192. for k, v := range newValues2 {
  193. if err := userSchema.FieldsByDBName[k].Set(reflectValue, v); err != nil {
  194. t.Errorf("no error should happen when assign value to field %v, but got %v", k, err)
  195. }
  196. }
  197. checkField(t, userSchema, reflectValue, newValues2)
  198. }