@@ -8,13 +8,17 @@ import (
88 "log"
99 "os"
1010 "testing"
11+ "time"
1112
1213 _ "github.com/lib/pq"
1314 "github.com/stretchr/testify/assert"
1415)
1516
17+ const testTable = "sessions"
18+
1619var (
1720 st * Store
21+ db * sql.DB
1822 randID , _ = generateID (sessionIDLen )
1923)
2024
@@ -26,18 +30,20 @@ func init() {
2630
2731 p := fmt .Sprintf ("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable" ,
2832 os .Getenv ("PG_HOST" ), os .Getenv ("PG_PORT" ), os .Getenv ("PG_USER" ), os .Getenv ("PG_PASSWORD" ), os .Getenv ("PG_DB" ))
29- db , err := sql .Open ("postgres" , p )
30- if err != nil {
33+ if d , err := sql .Open ("postgres" , p ); err != nil {
3134 log .Fatal (err )
35+ } else {
36+ db = d
3237 }
3338
3439 if err := db .Ping (); err != nil {
3540 log .Fatal (err )
3641 }
3742
38- st , err = New (Opt {}, db )
39- if err != nil {
43+ if s , err := New (Opt {TTL : time .Second * 2 , Table : testTable }, db ); err != nil {
4044 log .Fatal (err )
45+ } else {
46+ st = s
4147 }
4248}
4349
@@ -119,3 +125,47 @@ func TestSet(t *testing.T) {
119125 v , err = st .Get (id , "str" )
120126 assert .Error (t , err , ErrFieldNotFound )
121127}
128+
129+ func TestPrune (t * testing.T ) {
130+ // Create a new session.
131+ id , err := st .Create ()
132+ assert .NoError (t , err )
133+ assert .NotEmpty (t , id )
134+
135+ // Set value.
136+ assert .NoError (t , st .Set (id , "str" , "hello 123" ))
137+ assert .NoError (t , st .Commit (id ))
138+
139+ // Get value and verify.
140+ v , err := st .Get (id , "str" )
141+ assert .NoError (t , err )
142+ assert .Equal (t , v , "hello 123" )
143+
144+ // Wait until the 2 sec TTL expires and run prune.
145+ time .Sleep (time .Second * 3 )
146+
147+ // Session shouldn't be returned.
148+ _ , err = st .Get (id , "str" )
149+ assert .ErrorIs (t , err , ErrInvalidSession )
150+
151+ // Create one more session and immediately run prune. Except for this,
152+ // all previous sessions should be gone.
153+ id , err = st .Create ()
154+ assert .NoError (t , err )
155+ assert .NoError (t , st .Set (id , "str" , "hello 123" ))
156+ assert .NoError (t , st .Commit (id ))
157+
158+ // Run prune. All previously created sessions should be gone.
159+ assert .NoError (t , st .Prune ())
160+
161+ var num int
162+ err = db .QueryRow (fmt .Sprintf ("SELECT COUNT(*) FROM %s" , testTable )).Scan (& num )
163+ assert .NoError (t , err )
164+ assert .Equal (t , num , 1 )
165+
166+ // The last created session shouldn't have been pruned.
167+ v , err = st .Get (id , "str" )
168+ assert .NoError (t , err )
169+ assert .Equal (t , v , "hello 123" )
170+
171+ }
0 commit comments