-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathdata_test.go
131 lines (100 loc) · 2.48 KB
/
data_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
package main
import (
"database/sql"
"testing"
"time"
)
func TestUpdateOrAdd(t *testing.T) {
setup()
defer teardown()
cleanDB(t)
d := data{
sourceFile: "etc/VGT2_e.json",
observationFile: "etc/VGT2_e.csv",
}
if err := d.parseAndValidate(); err != nil {
t.Fatal(err)
}
if err := d.saveSite(); err != nil {
t.Fatal(err)
}
if countSites(t) != 1 {
t.Error("didn't find site in the DB.")
}
if err := d.updateOrAdd(); err != nil {
t.Fatal(err)
}
if countObs(t) != 7 {
t.Error("didn't find 7 observations in the DB.")
}
}
func TestDeleteThenSave(t *testing.T) {
setup()
defer teardown()
cleanDB(t)
d := data{
sourceFile: "etc/VGT2_e.json",
observationFile: "etc/VGT2_e.csv",
}
if err := d.parseAndValidate(); err != nil {
t.Fatal(err)
}
if err := d.saveSite(); err != nil {
t.Fatal(err)
}
if countSites(t) != 1 {
t.Error("didn't find site in the DB.")
}
// Save observations with one additional one that is not in the file.
o := obs{
t: time.Now().UTC(),
v: 12.2,
e: 6.6,
}
d.obs = append(d.obs, o)
if err := d.updateOrAdd(); err != nil {
t.Fatal(err)
}
if countObs(t) != 8 {
t.Error("didn't find 8 observations in the DB.")
}
// Add a duplicate obs and try to delete then save. Transaction should roll back leaving
// 8 obs in the DB.
d.obs = append(d.obs, o)
if err := d.deleteThenSave(); err == nil {
t.Fatal("should get transaction error for observation primary key violation.")
}
if countObs(t) != 8 {
t.Error("didn't find 8 observations in the DB.")
}
// reload the data then delete and save. There should be exactly 7 rows in the DB -
// the extra observation we added earlier is not in the observation file and should be gone.
if err := d.parseAndValidate(); err != nil {
t.Fatal(err)
}
if err := d.deleteThenSave(); err != nil {
t.Fatal(err)
}
if countObs(t) != 7 {
t.Error("didn't find 7 observations in the DB.")
}
}
// clean out all sites and observations from the DB.
func cleanDB(t *testing.T) {
if err := db.QueryRow("truncate fits.site cascade").Scan(); err != nil && err != sql.ErrNoRows {
t.Fatal(err)
}
}
// tables have been truncated so we can be lazy with the accuracy of the select
func countObs(t *testing.T) (c int) {
if err := db.QueryRow(` select count(*) from fits.observation`).Scan(&c); err != nil {
t.Fatal(err)
}
return
}
func countSites(t *testing.T) (c int) {
if err := db.QueryRow(` select count(*) from fits.site`).Scan(&c); err != nil {
t.Fatal(err)
}
return
}