forked from tjhowse/cacheodon
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCacheDB_test.go
More file actions
207 lines (190 loc) · 6.24 KB
/
Copy pathCacheDB_test.go
File metadata and controls
207 lines (190 loc) · 6.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
200
201
202
203
204
205
206
207
package main
import (
"os"
"testing"
"time"
)
func TestInit(t *testing.T) {
tempdir := t.TempDir()
// Create an empty DB
if db, err := NewFinderDB(tempdir + "/test.sqlite3"); err != nil {
t.Fatal(err)
} else {
db.Close()
}
}
// Returns a GeocacheLog and Geocache filled with the provided test data
func getTestData(finderName string, findTime time.Time, cacheCode string, logText string) (*GeocacheLog, *Geocache) {
gc := Geocache{
Code: cacheCode,
LastFoundTime: findTime,
}
l := GeocacheLog{
UserName: finderName,
LogText: logText,
}
return &l, &gc
}
func TestAddLog(t *testing.T) {
tempdir := t.TempDir()
// Set the "current time" to midday so we don't run into issues with the midnight rollover.
timeNow := time.Date(2021, 1, 1, 12, 0, 0, 0, time.UTC)
timeMidnight := time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)
// Create an empty DB
if db, err := NewFinderDB(tempdir + "/test.sqlite3"); err != nil {
t.Fatal(err)
} else {
defer db.Close()
// Add a find from right now
db.AddLog(getTestData("testname", timeNow, "GC123", "testlog"))
// Check one find in the last 24 hours.
if want, got := 1, db.FindsSinceTime("testname", timeMidnight); want != got {
t.Fatalf("FindsSinceMidnight returned wrong value: want %d, got %d", want, got)
}
// Add an irrelevant find.
db.AddLog(getTestData("testname2", timeNow, "GC321", "testlog"))
// Add another find ten minutes ago
db.AddLog(getTestData("testname", timeNow.Add(-10*time.Minute), "GC456", "testlog2"))
// Check we now have two finds since midnight
if want, got := 2, db.FindsSinceTime("testname", timeMidnight); want != got {
t.Fatalf("FindsSinceMidnight returned wrong value: want %d, got %d", want, got)
}
// Add a find 24 hours ago and ensure it doesn't count towards today's finds
db.AddLog(getTestData("testname", timeNow.Add(-24*time.Hour), "GC789", "testlog3"))
if want, got := 2, db.FindsSinceTime("testname", timeMidnight); want != got {
t.Fatalf("FindsSinceMidnight returned wrong value: want %d, got %d", want, got)
}
}
}
func TestPersistence(t *testing.T) {
tempdir := t.TempDir()
// Set the "current time" to midday so we don't run into issues with the midnight rollover.
timeNow := time.Date(2021, 1, 1, 12, 0, 0, 0, time.UTC)
timeMidnight := time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)
gc := Geocache{
Code: "GC123",
PlacedDate: "2023-03-02T16:44:59",
}
// Create an empty DB
if db, err := NewFinderDB(tempdir + "/test.sqlite3"); err != nil {
t.Fatal(err)
} else {
defer db.Close()
db.AddLog(getTestData("testname", timeNow, "GC123", "testlog"))
db.UpdateCache(&gc)
}
if db, err := NewFinderDB(tempdir + "/test.sqlite3"); err != nil {
t.Fatal(err)
} else {
defer db.Close()
if want, got := 1, db.FindsSinceTime("testname", timeMidnight); want != got {
t.Fatalf("FindsSinceMidnight returned wrong value: want %d, got %d", want, got)
}
if new, _ := db.UpdateCache(&gc); new {
t.Fatal("Cache should not be new")
}
}
}
func TestUpdateCache(t *testing.T) {
tempdir := t.TempDir()
// Create an empty DB
if db, err := NewFinderDB(tempdir + "/test.sqlite3"); err != nil {
t.Fatal(err)
} else {
defer db.Close()
// Add a cache
gc := Geocache{
Code: "GC123",
PlacedDate: "2023-03-02T16:44:59",
}
if new, _ := db.UpdateCache(&gc); !new {
t.Fatal("Cache should be new")
}
// Check the cache is there
{
new, updated := db.UpdateCache(&gc)
if new {
t.Fatal("Cache should not be new")
}
if updated {
t.Fatal("Cache should not be updated")
}
}
gc.LastFoundTime = gc.LastFoundTime.Add(time.Hour)
{
new, updated := db.UpdateCache(&gc)
if new {
t.Fatal("Cache should not be new")
}
if !updated {
t.Fatal("Cache should be updated")
}
}
}
}
func TestLastPostedFoundTime(t *testing.T) {
tempdir := t.TempDir()
// Set the "current time" to midday so we don't run into issues with the midnight rollover.
timeNow := time.Date(2021, 1, 1, 12, 0, 0, 0, time.UTC)
timeLater := time.Date(2022, 1, 1, 12, 0, 0, 0, time.UTC)
// Create an empty DB
if db, err := NewFinderDB(tempdir + "/test.sqlite3"); err != nil {
t.Fatal(err)
} else {
defer db.Close()
// These should be overridden
db.SetLastPostedFoundTime(timeLater.Add(-1 * time.Hour))
db.GetLastPostedFoundTime(timeLater)
db.SetLastPostedFoundTime(timeLater.Add(1 * time.Hour))
db.GetLastPostedFoundTime(timeLater)
db.SetLastPostedFoundTime(timeNow)
if want, got := timeNow, db.GetLastPostedFoundTime(timeLater); want != got {
t.Fatalf("LastPostedFoundTime returned wrong value: want %s, got %s", want, got)
}
}
// Check the value is persisted
if db, err := NewFinderDB(tempdir + "/test.sqlite3"); err != nil {
t.Fatal(err)
} else {
defer db.Close()
// Read out the current state
if want, got := timeNow, db.GetLastPostedFoundTime(timeLater); want != got {
t.Fatalf("LastPostedFoundTime didn't remember the right value: want %s, got %s", want, got)
}
// Check that the State table only has one row
var got int64
db.db.Model(&State{}).Count(&got)
if got != 1 {
t.Fatalf("State table has wrong number of rows: want 1, got %d", got)
}
}
// Copy the temp db to /tmp/ so we can inspect it
if err := os.Rename(tempdir+"/test.sqlite3", "/tmp/test.sqlite3"); err != nil {
t.Fatal(err)
}
}
func TestLastPostedFoundTimeDefault(t *testing.T) {
tempdir := t.TempDir()
// Set the "current time" to midday so we don't run into issues with the midnight rollover.
timeNow := time.Date(2021, 1, 1, 12, 0, 0, 0, time.UTC)
timeLater := time.Date(2022, 1, 1, 12, 0, 0, 0, time.UTC)
// Create an empty DB
if db, err := NewFinderDB(tempdir + "/test.sqlite3"); err != nil {
t.Fatal(err)
} else {
defer db.Close()
if want, got := timeLater, db.GetLastPostedFoundTime(timeLater); want != got {
t.Fatalf("LastPostedFoundTime returned wrong value: want %s, got %s", want, got)
}
}
// Check the value is persisted, and that the default timeNow is ignored in favour
// of returning the stored value.
if db, err := NewFinderDB(tempdir + "/test.sqlite3"); err != nil {
t.Fatal(err)
} else {
defer db.Close()
if want, got := timeLater, db.GetLastPostedFoundTime(timeNow); want != got {
t.Fatalf("LastPostedFoundTime didn't remember the right value: want %s, got %s", want, got)
}
}
}