forked from blockloop/scan
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcolumns_test.go
153 lines (124 loc) · 3.78 KB
/
columns_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
146
147
148
149
150
151
152
153
package scan
import (
"reflect"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestColumnsErrorsWhenNotAPointer(t *testing.T) {
_, err := Columns(1)
require.Error(t, err)
assert.Contains(t, err.Error(), "pointer")
}
func TestColumnsErrorsWhenNotAStruct(t *testing.T) {
var num int
_, err := Columns(&num)
require.Error(t, err)
assert.Contains(t, err.Error(), "struct")
}
func TestColumnsReturnsFieldNames(t *testing.T) {
type person struct {
Name string
}
cols, err := Columns(&person{})
assert.NoError(t, err)
assert.EqualValues(t, []string{"Name"}, cols)
}
func TestColumnsReturnsStructTags(t *testing.T) {
type person struct {
Name string `db:"name"`
}
cols, err := Columns(&person{})
assert.NoError(t, err)
assert.EqualValues(t, []string{"name"}, cols)
}
func TestColumnsReturnsStructTagsAndFieldNames(t *testing.T) {
type person struct {
Name string `db:"name"`
Age int
}
cols, err := Columns(&person{})
assert.NoError(t, err)
assert.EqualValues(t, []string{"name", "Age"}, cols)
}
func TestColumnsIgnoresPrivateFields(t *testing.T) {
type person struct {
name string `db:"name"`
Age int
}
cols, err := Columns(&person{})
assert.NoError(t, err)
assert.EqualValues(t, []string{"Age"}, cols)
}
func TestColumnsAddsComplexTypesWhenStructTag(t *testing.T) {
type person struct {
Address struct {
Street string
} `db:"address"`
}
cols, err := Columns(&person{})
assert.NoError(t, err)
assert.EqualValues(t, []string{"address"}, cols)
}
func TestColumnsIgnoresComplexTypesWhenNoStructTag(t *testing.T) {
type person struct {
Address struct {
Street string
}
}
cols, err := Columns(&person{})
assert.NoError(t, err)
assert.EqualValues(t, []string{}, cols)
}
func TestColumnsExcludesFields(t *testing.T) {
type person struct {
Name string `db:"name"`
Age int `db:"age"`
}
cols, err := ColumnsStrict(&person{}, "name")
assert.NoError(t, err)
assert.EqualValues(t, []string{"age"}, cols)
}
func TestColumnsStrictExcludesUntaggedFields(t *testing.T) {
type person struct {
Name string `db:"name"`
Age int
}
cols, err := ColumnsStrict(&person{})
assert.NoError(t, err)
assert.EqualValues(t, []string{"name"}, cols)
}
func TestColumnsIgnoresDashTag(t *testing.T) {
type person struct {
Name string `db:"name"`
Age int `db:"-"`
}
cols, err := ColumnsStrict(&person{})
assert.NoError(t, err)
assert.EqualValues(t, []string{"name"}, cols)
}
func TestColumnsReturnsAllFieldNames(t *testing.T) {
s := new(largeStruct)
exp := reflect.Indirect(reflect.ValueOf(s)).NumField()
cols, err := Columns(s)
assert.NoError(t, err)
assert.EqualValues(t, exp, len(cols))
}
func TestColumnsReadsFromCacheFirst(t *testing.T) {
var person struct {
ID int64
Name string
}
v := reflect.Indirect(reflect.ValueOf(&person))
expected := []string{"fake"}
columnsCache.Store(v, expected)
cols, err := Columns(&person)
assert.NoError(t, err)
assert.EqualValues(t, expected, cols)
}
func BenchmarkColumnsLargeStruct(b *testing.B) {
ls := &largeStruct{ID: "test", Index: 88, UUID: "test", IsActive: false, Balance: "test", Picture: "test", Age: 88, EyeColor: "test", Name: "test", Gender: "test", Company: "test", Email: "test", Phone: "test", Address: "test", About: "test", Registered: "test", Latitude: 0.566439688205719, Longitude: 0.48440760374069214, Greeting: "test", FavoriteFruit: "test", AID: "test", AIndex: 19, AUUID: "test", AIsActive: true, ABalance: "test", APicture: "test", AAge: 12, AEyeColor: "test", AName: "test", AGender: "test", ACompany: "test", AEmail: "test", APhone: "test", AAddress: "test", AAbout: "test", ARegistered: "test", ALatitude: 0.16338545083999634, ALongitude: 0.24648870527744293, AGreeting: "test", AFavoriteFruit: "test"}
for i := 0; i < b.N; i++ {
Columns(ls)
}
}