forked from qor/sorting
/
publish_test.go
123 lines (105 loc) · 4.14 KB
/
publish_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
package sorting_test
import (
"fmt"
"reflect"
"testing"
"github.com/jinzhu/gorm"
"github.com/qor/qor/publish"
"github.com/qor/sorting"
)
type Product struct {
gorm.Model
Name string
sorting.Sorting
publish.Status
}
func prepareProducts() {
db.Delete(&Product{})
for i := 1; i <= 5; i++ {
product := Product{Name: fmt.Sprintf("product%v", i)}
db.Save(&product)
}
}
func getProduct(name string) *Product {
var product Product
db.First(&product, "name = ?", name)
return &product
}
func checkProductPositionInDB(db *gorm.DB, names ...string) bool {
var products []Product
var positions []string
db.Find(&products)
for _, product := range products {
positions = append(positions, product.Name)
}
if reflect.DeepEqual(positions, names) {
return true
} else {
fmt.Printf("Expect %v, got %v\n", names, positions)
return false
}
}
func TestSortingWithPublishStatus(t *testing.T) {
prepareProducts()
var count1 int
pb.DraftDB().Model(&Product{}).Where("publish_status = ?", publish.DIRTY).Count(&count1)
if count1 != 0 {
t.Errorf("Should no draft products after create product")
}
sorting.MoveTo(db, getProduct("product5"), 2)
if !checkProductPositionInDB(pb.DraftDB(), "product1", "product5", "product2", "product3", "product4") {
t.Errorf("Order in draft db should be correct when change order in production db")
}
if !checkProductPositionInDB(pb.ProductionDB(), "product1", "product5", "product2", "product3", "product4") {
t.Errorf("Order in production db should be correct when change order in production db")
}
var count2 int
pb.DraftDB().Model(&Product{}).Where("publish_status = ?", publish.DIRTY).Count(&count2)
if count2 != 0 {
t.Errorf("Should no draft products after sorting in production db")
}
sorting.MoveTo(pb.DraftDB(), getProduct("product5"), 4)
if !checkProductPositionInDB(pb.DraftDB(), "product1", "product2", "product3", "product5", "product4") {
t.Errorf("Order in draft db should be correct when change order in draft db")
}
if !checkProductPositionInDB(pb.ProductionDB(), "product1", "product5", "product2", "product3", "product4") {
t.Errorf("Order in production db should be correct when change order in draft db")
}
var count3 int
pb.DraftDB().Model(&Product{}).Where("publish_status = ?", publish.DIRTY).Count(&count3)
if count3 != 0 {
t.Errorf("Should no draft products after sorting in draft db")
}
var publishEvents []publish.PublishEvent
db.Where("publish_status = ? AND name = ?", publish.DIRTY, "changed_sorting").Find(&publishEvents)
for _, publishEvent := range publishEvents {
publishEvent.Publish(pb.ProductionDB())
}
if !checkProductPositionInDB(pb.DraftDB(), "product1", "product2", "product3", "product5", "product4") {
t.Errorf("Order in draft db should be correct after publish event")
}
if !checkProductPositionInDB(pb.ProductionDB(), "product1", "product2", "product3", "product5", "product4") {
t.Errorf("Order in production db should be correct after publish event")
}
sorting.MoveTo(pb.DraftDB(), getProduct("product5"), 1)
if !checkProductPositionInDB(pb.DraftDB(), "product5", "product1", "product2", "product3", "product4") {
t.Errorf("Order in draft db should be correct when change order in draft db")
}
if !checkProductPositionInDB(pb.ProductionDB(), "product1", "product2", "product3", "product5", "product4") {
t.Errorf("Order in production db should be correct when change order in draft db")
}
var publishDiscardEvents []publish.PublishEvent
db.Where("publish_status = ? AND name = ?", publish.DIRTY, "changed_sorting").Find(&publishDiscardEvents)
if len(publishDiscardEvents) > 1 {
t.Errorf("Should only found one publish event for changed_sorting, but got %v", len(publishDiscardEvents))
}
for _, publishEvent := range publishDiscardEvents {
publishEvent.Discard(pb.ProductionDB())
}
if !checkProductPositionInDB(pb.ProductionDB(), "product1", "product2", "product3", "product5", "product4") {
t.Errorf("Order in draft db should be correct after discard event")
}
if !checkProductPositionInDB(pb.ProductionDB(), "product1", "product2", "product3", "product5", "product4") {
t.Errorf("Order in production db should be correct after discard event")
}
}