-
Notifications
You must be signed in to change notification settings - Fork 0
/
curd_test.go
145 lines (115 loc) · 4.49 KB
/
curd_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package l10n_test
import (
"testing"
"github.com/jinzhu/gorm"
_ "github.com/mattn/go-sqlite3"
"github.com/qor/qor/l10n"
_ "github.com/go-sql-driver/mysql"
)
func checkHasErr(t *testing.T, err error) {
if err != nil {
t.Error(err)
}
}
func checkHasProductInLocale(db *gorm.DB, locale string, t *testing.T) {
var count int
if db.Set("l10n:locale", locale).Count(&count); count != 1 {
t.Errorf("should has only one product for locale %v, but found %v", locale, count)
}
}
func checkHasProductInAllLocales(db *gorm.DB, t *testing.T) {
checkHasProductInLocale(db, l10n.Global, t)
checkHasProductInLocale(db, "zh", t)
checkHasProductInLocale(db, "en", t)
}
func TestCreateWithCreate(t *testing.T) {
product := Product{Code: "CreateWithCreate"}
checkHasErr(t, dbGlobal.Create(&product).Error)
checkHasErr(t, dbCN.Create(&product).Error)
checkHasErr(t, dbEN.Create(&product).Error)
checkHasProductInAllLocales(dbGlobal.Model(&Product{}).Where("id = ? AND code = ?", product.ID, "CreateWithCreate"), t)
}
func TestCreateWithSave(t *testing.T) {
product := Product{Code: "CreateWithSave"}
checkHasErr(t, dbGlobal.Create(&product).Error)
checkHasErr(t, dbCN.Create(&product).Error)
checkHasErr(t, dbEN.Create(&product).Error)
checkHasProductInAllLocales(dbGlobal.Model(&Product{}).Where("id = ? AND code = ?", product.ID, "CreateWithSave"), t)
}
func TestUpdate(t *testing.T) {
product := Product{Code: "Update", Name: "global"}
checkHasErr(t, dbGlobal.Create(&product).Error)
sharedDB := dbGlobal.Model(&Product{}).Where("id = ? AND code = ?", product.ID, "Update")
product.Name = "中文名"
checkHasErr(t, dbCN.Create(&product).Error)
checkHasProductInLocale(sharedDB.Where("name = ?", "中文名"), "zh", t)
product.Name = "English Name"
checkHasErr(t, dbEN.Create(&product).Error)
checkHasProductInLocale(sharedDB.Where("name = ?", "English Name"), "en", t)
product.Name = "新的中文名"
product.Code = "NewCode // should be ignored when update"
dbCN.Save(&product)
checkHasProductInLocale(sharedDB.Where("name = ?", "新的中文名"), "zh", t)
product.Name = "New English Name"
product.Code = "NewCode // should be ignored when update"
dbEN.Save(&product)
checkHasProductInLocale(sharedDB.Where("name = ?", "New English Name"), "en", t)
dbGlobal.Model(&Product{}).Where("id = ?", product.ID).UpdateColumns(map[string]interface{}{"quantity": gorm.Expr("quantity + ?", 2)})
var newGlobalProduct Product
var newENProduct Product
dbGlobal.Find(&newGlobalProduct, product.ID)
dbEN.Find(&newENProduct, product.ID)
if newGlobalProduct.Quantity != product.Quantity+2 || newENProduct.Quantity != product.Quantity+2 {
t.Errorf("should sync update columns results correctly")
}
}
func TestQuery(t *testing.T) {
product := Product{Code: "Query", Name: "global"}
dbGlobal.Create(&product)
dbCN.Create(&product)
var productCN Product
dbCN.First(&productCN, product.ID)
if productCN.LanguageCode != "zh" {
t.Error("Should find localized zh product with unscoped mode")
}
if dbCN.Set("l10n:mode", "locale").First(&productCN, product.ID).RecordNotFound() {
t.Error("Should find localized zh product with locale mode")
}
if dbCN.Set("l10n:mode", "global").First(&productCN); productCN.LanguageCode != l10n.Global {
t.Error("Should find global product with global mode")
}
var productEN Product
dbEN.First(&productEN, product.ID)
if productEN.LanguageCode != l10n.Global {
t.Error("Should find global product for en with unscoped mode")
}
if !dbEN.Set("l10n:mode", "locale").First(&productEN, product.ID).RecordNotFound() {
t.Error("Should find no record with locale mode")
}
if dbEN.Set("l10n:mode", "global").First(&productEN); productEN.LanguageCode != l10n.Global {
t.Error("Should find global product with global mode")
}
}
func TestDelete(t *testing.T) {
product := Product{Code: "Delete", Name: "global"}
dbGlobal.Create(&product)
dbCN.Create(&product)
if dbCN.Delete(&product).RowsAffected != 1 {
t.Errorf("Should delete localized record")
}
if dbEN.Delete(&product).RowsAffected != 0 {
t.Errorf("Should delete none record in unlocalized locale")
}
}
func TestResetLanguageCodeWithGlobalDB(t *testing.T) {
product := Product{Code: "Query", Name: "global"}
product.LanguageCode = "test"
dbGlobal.Save(&product)
if product.LanguageCode != l10n.Global {
t.Error("Should reset language code in global mode")
}
}
func TestManyToManyRelations(t *testing.T) {
product := Product{Code: "Delete", Name: "global", Tags: []Tag{{Name: "tag1"}, {Name: "tag2"}}}
dbGlobal.Save(&product)
}