/
testing.go
133 lines (107 loc) · 2.39 KB
/
testing.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
package main
import (
"fmt"
"github.com/op/go-logging"
"os"
"testing"
)
func failTestOnError(t *testing.T, err error) {
if err != nil {
t.Errorf("failed test: %v", err)
}
}
func getPublicTables() ([]string, error) {
statement := `
SELECT tablename
FROM pg_tables
WHERE schemaname='public';
`
rows, err := db.Query(statement)
if err != nil {
fmt.Fprintf(os.Stderr, "cannot query public tables: %v", err)
return []string{}, err
}
defer rows.Close()
tables := []string{}
for rows.Next() {
var table string
if err = rows.Scan(&table); err != nil {
fmt.Fprintf(os.Stderr, "cannot scan table name: %v", err)
return []string{}, err
}
tables = append(tables, table)
}
return tables, nil
}
func dropTables() error {
tables, err := getPublicTables()
if err != nil {
return err
}
for _, table := range tables {
if table != "migrations" {
_, err = db.Exec(fmt.Sprintf("DROP TABLE %s;", table))
if err != nil {
fmt.Fprintf(os.Stderr, "cannot drop %s: %v", table, err)
return err
}
}
}
return nil
}
func setupTestDatabase() error {
if os.Getenv("COMMENTO_POSTGRES") != "" {
// set it manually because we need to use commento_test, not commento, by mistake
os.Setenv("POSTGRES", os.Getenv("COMMENTO_POSTGRES"))
} else {
os.Setenv("POSTGRES", "postgres://postgres:postgres@localhost/commento_test?sslmode=disable")
}
if err := dbConnect(0); err != nil {
return err
}
if err := dropTables(); err != nil {
return err
}
if err := migrateFromDir("../db/"); err != nil {
return err
}
return nil
}
func clearTables() error {
tables, err := getPublicTables()
if err != nil {
return err
}
for _, table := range tables {
_, err = db.Exec(fmt.Sprintf("DELETE FROM %s;", table))
if err != nil {
fmt.Fprintf(os.Stderr, "cannot clear %s: %v", table, err)
return err
}
}
return nil
}
var setupComplete bool
func setupTestEnv() error {
if !setupComplete {
setupComplete = true
if err := loggerCreate(); err != nil {
return err
}
// Print messages to console only if verbose. Sounds like a good idea to
// keep the console clean on `go test`.
if !testing.Verbose() {
logging.SetLevel(logging.CRITICAL, "")
}
if err := setupTestDatabase(); err != nil {
return err
}
if err := markdownRendererCreate(); err != nil {
return err
}
}
if err := clearTables(); err != nil {
return err
}
return nil
}