forked from square/squalor
-
Notifications
You must be signed in to change notification settings - Fork 0
/
table_test.go
130 lines (112 loc) · 3.61 KB
/
table_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
// Copyright 2014 Square Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package squalor
import (
"fmt"
"strings"
"testing"
)
func mustLoadTable(t *testing.T, name string) *Table {
db := makeTestDB(t, objectsDDL)
defer db.Close()
table, err := LoadTable(db.DB, name)
if err != nil {
t.Fatal(err)
}
return table
}
func TestLoadTable(t *testing.T) {
table := mustLoadTable(t, "objects")
fmt.Printf("%s\n", table)
}
func TestLoadTableNameInjection(t *testing.T) {
db := makeTestDB(t, objectsDDL)
defer db.Close()
// Ensure the table name is quoted to avoid possible SQL injection.
table, err := LoadTable(db.DB, "objects WHERE false")
if table != nil {
t.Fatalf("Expected nil table returned from injection attempt, got %v", table)
}
expectedError := "Error 1146: Table 'squalor_test.objects where false' doesn't exist"
if err == nil {
t.Fatalf("Expected error %q from injection attempt, got nil", expectedError)
}
// Use strings.ToLower in order to prevent error message discrepancies
// between running tests locally through integration_test.sh and the
// build running through circle.ci
if strings.ToLower(err.Error()) != strings.ToLower(expectedError) {
t.Fatalf("Expected error %q from injection attempt, got %q", expectedError, err.Error())
}
// Ensure the table name is quoted to avoid possible SQL injection.
table, err = LoadTable(db.DB, "foo`;bar")
if table != nil {
t.Fatalf("Expected nil table returned from injection attempt, got %v", table)
}
expectedError = "Error 1146: Table 'squalor_test.foo`;bar' doesn't exist"
if err == nil {
t.Fatalf("Expected error %q from injection attempt, got nil", expectedError)
}
if err.Error() != expectedError {
t.Fatalf("Expected error %q from injection attempt, got %q", expectedError, err.Error())
}
}
func TestGetKey(t *testing.T) {
table := mustLoadTable(t, "objects")
testCases := []struct {
cols []string
result bool
}{
{[]string{"user_id", "object_id"}, true},
{[]string{"USER_ID", "object_id"}, false},
{[]string{"user_id", "timestamp"}, true},
{[]string{"timestamp", "user_id"}, false},
}
for _, c := range testCases {
key := table.GetKey(c.cols...)
if c.result && key == nil {
t.Errorf("Unable to find key (%s)", strings.Join(c.cols, ","))
} else if !c.result && key != nil {
t.Errorf("Expected to not find key, but got %s", key)
}
}
}
func TestValidateModel(t *testing.T) {
table := mustLoadTable(t, "objects")
type BaseModel struct {
UserID int64 `db:"user_id"`
ID string `db:"object_id"`
Timestamp int64 `db:"timestamp"`
}
type ObjectModel struct {
BaseModel
Value string `db:"value"`
Ignored int `db:"-"`
ignored int
}
if err := table.ValidateModel(ObjectModel{}); err != nil {
t.Fatal(err)
}
// BaseModel doesn't map all of the table's columns.
if err := table.ValidateModel(BaseModel{}); err == nil {
t.Fatal("Expected failure, but found success")
}
type BadModel struct {
ObjectModel
Extra string `db:"extra"`
}
// BadModel maps columns that are not in the table.
if err := table.ValidateModel(BadModel{}); err == nil {
t.Fatal("Expected failure, but found success")
}
}