schema_test.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package schema_test
  2. import (
  3. "sync"
  4. "testing"
  5. "github.com/jinzhu/gorm/schema"
  6. "github.com/jinzhu/gorm/tests"
  7. )
  8. func TestParseSchema(t *testing.T) {
  9. user, err := schema.Parse(&tests.User{}, &sync.Map{}, schema.NamingStrategy{})
  10. if err != nil {
  11. t.Fatalf("failed to parse user, got error %v", err)
  12. }
  13. checkUserSchema(t, user)
  14. }
  15. func TestParseSchemaWithPointerFields(t *testing.T) {
  16. user, err := schema.Parse(&User{}, &sync.Map{}, schema.NamingStrategy{})
  17. if err != nil {
  18. t.Fatalf("failed to parse pointer user, got error %v", err)
  19. }
  20. checkUserSchema(t, user)
  21. }
  22. func checkUserSchema(t *testing.T, user *schema.Schema) {
  23. // check schema
  24. checkSchema(t, user, schema.Schema{Name: "User", Table: "users"}, []string{"ID"})
  25. // check fields
  26. fields := []schema.Field{
  27. {Name: "ID", DBName: "id", BindNames: []string{"Model", "ID"}, DataType: schema.Uint, PrimaryKey: true, Tag: `gorm:"primarykey"`, TagSettings: map[string]string{"PRIMARYKEY": "PRIMARYKEY"}},
  28. {Name: "CreatedAt", DBName: "created_at", BindNames: []string{"Model", "CreatedAt"}, DataType: schema.Time},
  29. {Name: "UpdatedAt", DBName: "updated_at", BindNames: []string{"Model", "UpdatedAt"}, DataType: schema.Time},
  30. {Name: "DeletedAt", DBName: "deleted_at", BindNames: []string{"Model", "DeletedAt"}, Tag: `gorm:"index"`, DataType: schema.Time},
  31. {Name: "Name", DBName: "name", BindNames: []string{"Name"}, DataType: schema.String},
  32. {Name: "Age", DBName: "age", BindNames: []string{"Age"}, DataType: schema.Uint},
  33. {Name: "Birthday", DBName: "birthday", BindNames: []string{"Birthday"}, DataType: schema.Time},
  34. {Name: "CompanyID", DBName: "company_id", BindNames: []string{"CompanyID"}, DataType: schema.Int},
  35. {Name: "ManagerID", DBName: "manager_id", BindNames: []string{"ManagerID"}, DataType: schema.Uint},
  36. {Name: "Active", DBName: "active", BindNames: []string{"Active"}, DataType: schema.Bool},
  37. }
  38. for _, f := range fields {
  39. checkSchemaField(t, user, &f, func(f *schema.Field) {
  40. f.Creatable = true
  41. f.Updatable = true
  42. })
  43. }
  44. // check relations
  45. relations := []Relation{
  46. {
  47. Name: "Account", Type: schema.HasOne, Schema: "User", FieldSchema: "Account",
  48. References: []Reference{{"ID", "User", "UserID", "Account", "", true}},
  49. },
  50. {
  51. Name: "Pets", Type: schema.HasMany, Schema: "User", FieldSchema: "Pet",
  52. References: []Reference{{"ID", "User", "UserID", "Pet", "", true}},
  53. },
  54. {
  55. Name: "Toys", Type: schema.HasMany, Schema: "User", FieldSchema: "Toy",
  56. Polymorphic: Polymorphic{ID: "OwnerID", Type: "OwnerType", Value: "users"},
  57. References: []Reference{{"ID", "User", "OwnerID", "Toy", "", true}, {"", "", "OwnerType", "Toy", "users", false}},
  58. },
  59. {
  60. Name: "Company", Type: schema.BelongsTo, Schema: "User", FieldSchema: "Company",
  61. References: []Reference{{"ID", "Company", "CompanyID", "User", "", false}},
  62. },
  63. {
  64. Name: "Manager", Type: schema.BelongsTo, Schema: "User", FieldSchema: "User",
  65. References: []Reference{{"ID", "User", "ManagerID", "User", "", false}},
  66. },
  67. {
  68. Name: "Team", Type: schema.HasMany, Schema: "User", FieldSchema: "User",
  69. References: []Reference{{"ID", "User", "ManagerID", "User", "", true}},
  70. },
  71. {
  72. Name: "Languages", Type: schema.Many2Many, Schema: "User", FieldSchema: "Language",
  73. JoinTable: JoinTable{Name: "UserSpeak", Table: "user_speaks", Fields: []schema.Field{
  74. {
  75. Name: "UserID", DBName: "user_id", BindNames: []string{"UserID"}, DataType: schema.Uint,
  76. Tag: `gorm:"primarykey"`, Creatable: true, Updatable: true, PrimaryKey: true,
  77. },
  78. {
  79. Name: "LanguageCode", DBName: "language_code", BindNames: []string{"LanguageCode"}, DataType: schema.String,
  80. Tag: `gorm:"primarykey"`, Creatable: true, Updatable: true, PrimaryKey: true,
  81. },
  82. }},
  83. References: []Reference{{"ID", "User", "UserID", "UserSpeak", "", true}, {"Code", "Language", "LanguageCode", "UserSpeak", "", false}},
  84. },
  85. {
  86. Name: "Friends", Type: schema.Many2Many, Schema: "User", FieldSchema: "User",
  87. JoinTable: JoinTable{Name: "user_friends", Table: "user_friends", Fields: []schema.Field{
  88. {
  89. Name: "UserID", DBName: "user_id", BindNames: []string{"UserID"}, DataType: schema.Uint,
  90. Tag: `gorm:"primarykey"`, Creatable: true, Updatable: true, PrimaryKey: true,
  91. },
  92. {
  93. Name: "FriendID", DBName: "friend_id", BindNames: []string{"FriendID"}, DataType: schema.Uint,
  94. Tag: `gorm:"primarykey"`, Creatable: true, Updatable: true, PrimaryKey: true,
  95. },
  96. }},
  97. References: []Reference{{"ID", "User", "UserID", "user_friends", "", true}, {"ID", "User", "FriendID", "user_friends", "", false}},
  98. },
  99. }
  100. for _, relation := range relations {
  101. checkSchemaRelation(t, user, relation)
  102. }
  103. }
  104. func TestParseSchemaWithAdvancedDataType(t *testing.T) {
  105. user, err := schema.Parse(&AdvancedDataTypeUser{}, &sync.Map{}, schema.NamingStrategy{})
  106. if err != nil {
  107. t.Fatalf("failed to parse pointer user, got error %v", err)
  108. }
  109. // check schema
  110. checkSchema(t, user, schema.Schema{Name: "AdvancedDataTypeUser", Table: "advanced_data_type_users"}, []string{"ID"})
  111. // check fields
  112. fields := []schema.Field{
  113. {Name: "ID", DBName: "id", BindNames: []string{"ID"}, DataType: schema.Int, PrimaryKey: true},
  114. {Name: "Name", DBName: "name", BindNames: []string{"Name"}, DataType: schema.String},
  115. {Name: "Birthday", DBName: "birthday", BindNames: []string{"Birthday"}, DataType: schema.Time},
  116. {Name: "RegisteredAt", DBName: "registered_at", BindNames: []string{"RegisteredAt"}, DataType: schema.Time},
  117. {Name: "DeletedAt", DBName: "deleted_at", BindNames: []string{"DeletedAt"}, DataType: schema.Time},
  118. {Name: "Active", DBName: "active", BindNames: []string{"Active"}, DataType: schema.Bool},
  119. {Name: "Admin", DBName: "admin", BindNames: []string{"Admin"}, DataType: schema.Bool},
  120. }
  121. for _, f := range fields {
  122. checkSchemaField(t, user, &f, func(f *schema.Field) {
  123. f.Creatable = true
  124. f.Updatable = true
  125. })
  126. }
  127. }