-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtablemap_test.go
More file actions
199 lines (165 loc) · 4.24 KB
/
tablemap_test.go
File metadata and controls
199 lines (165 loc) · 4.24 KB
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
package reqflow
import (
"os"
"testing"
)
func TestExtractTableMap_BasicModel(t *testing.T) {
dir := helperWriteModule(t, map[string]string{
"model.go": `package testmod
type OrderModel struct {
ID int
Total float64
}
`,
})
defer os.RemoveAll(dir)
graph := helperParse(t, dir, ParseOptions{TableMap: true})
// OrderModel → orders table (snake_case + pluralize)
if _, ok := graph.Nodes["table.order_models"]; !ok {
t.Error("Expected table.order_models node")
}
}
func TestExtractTableMap_PluralizesName(t *testing.T) {
dir := helperWriteModule(t, map[string]string{
"model.go": `package testmod
type UserModel struct {
ID int
Name string
}
`,
})
defer os.RemoveAll(dir)
graph := helperParse(t, dir, ParseOptions{TableMap: true})
if _, ok := graph.Nodes["table.user_models"]; !ok {
t.Error("Expected table.user_models node")
}
}
func TestExtractTableMap_GormColumnTag(t *testing.T) {
dir := helperWriteModule(t, map[string]string{
"model.go": `package testmod
type InvoiceModel struct {
ID int ` + "`" + `gorm:"column:invoice_id"` + "`" + `
Reference string ` + "`" + `gorm:"column:ref_no"` + "`" + `
}
`,
})
defer os.RemoveAll(dir)
graph := helperParse(t, dir, ParseOptions{TableMap: true})
// Table should be created
var tableNode *Node
for _, n := range graph.Nodes {
if n.Kind == KindTable {
tableNode = n
break
}
}
if tableNode == nil {
t.Fatal("Expected a KindTable node")
}
if tableNode.Meta["columns"] == "" {
t.Error("Expected columns metadata on table node")
}
}
func TestExtractTableMap_TableNameMethod(t *testing.T) {
dir := helperWriteModule(t, map[string]string{
"model.go": `package testmod
type PaymentModel struct {
ID int
}
func (PaymentModel) TableName() string {
return "payments"
}
`,
})
defer os.RemoveAll(dir)
graph := helperParse(t, dir, ParseOptions{TableMap: true})
if _, ok := graph.Nodes["table.payments"]; !ok {
t.Error("Expected table.payments from TableName() override")
}
}
func TestExtractTableMap_EdgeMapsTo(t *testing.T) {
dir := helperWriteModule(t, map[string]string{
"model.go": `package testmod
type ProductModel struct {
ID int
}
`,
})
defer os.RemoveAll(dir)
graph := helperParse(t, dir, ParseOptions{TableMap: true})
hasEdge := false
for _, edge := range graph.Edges {
if edge.Kind == EdgeMapsTo && edge.From == "testmod.ProductModel" {
hasEdge = true
break
}
}
if !hasEdge {
t.Error("Expected EdgeMapsTo from ProductModel to its table")
}
}
func TestExtractTableMap_OnlyModels(t *testing.T) {
dir := helperWriteModule(t, map[string]string{
"app.go": `package testmod
type UserHandler struct{}
type UserService struct{}
type UserModel struct{ ID int }
`,
})
defer os.RemoveAll(dir)
graph := helperParse(t, dir, ParseOptions{TableMap: true})
for _, node := range graph.Nodes {
if node.Kind == KindTable {
// Table should be linked to the model, not handler/service
var linkedFrom string
for _, edge := range graph.Edges {
if edge.To == node.ID && edge.Kind == EdgeMapsTo {
linkedFrom = edge.From
}
}
if linkedFrom == "" {
t.Errorf("Table %s has no incoming EdgeMapsTo", node.ID)
}
modelNode := graph.Nodes[linkedFrom]
if modelNode.Kind != KindModel {
t.Errorf("Table %s is linked from non-model node %s (%s)", node.ID, linkedFrom, modelNode.Kind)
}
}
}
}
func TestExtractTableMap_DbTag(t *testing.T) {
dir := helperWriteModule(t, map[string]string{
"model.go": `package testmod
type AccountModel struct {
UserID int ` + "`" + `db:"user_id"` + "`" + `
Email string ` + "`" + `db:"email_address"` + "`" + `
}
`,
})
defer os.RemoveAll(dir)
graph := helperParse(t, dir, ParseOptions{TableMap: true})
var tableNode *Node
for _, n := range graph.Nodes {
if n.Kind == KindTable {
tableNode = n
break
}
}
if tableNode == nil {
t.Fatal("Expected KindTable node")
}
}
func TestExtractTableMap_NotRunWithoutFlag(t *testing.T) {
dir := helperWriteModule(t, map[string]string{
"model.go": `package testmod
type ItemModel struct{ ID int }
`,
})
defer os.RemoveAll(dir)
graph := helperParse(t, dir, ParseOptions{TableMap: false})
for _, n := range graph.Nodes {
if n.Kind == KindTable {
t.Errorf("Found unexpected KindTable node %s when TableMap=false", n.ID)
}
}
}