db_test.go
1package session
2
3import (
4 "database/sql"
5 "errors"
6 "testing"
7 "time"
8
9 _ "github.com/mattn/go-sqlite3"
10
11 "github.com/stretchr/testify/assert"
12)
13
14func makeDB() *sql.DB {
15 db, err := sql.Open("sqlite3", "file:test.db?cache=shared&mode=memory&_fk=false")
16 //db, err := sql.Open("sqlite3", "file:test.db?_fk=false")
17 if err != nil {
18 panic(err)
19 }
20 if err := Migrate(db); err != nil {
21 panic(err)
22 }
23 return db
24}
25
26func TestInsert(t *testing.T) {
27 db := makeDB()
28 defer db.Close()
29 expires := time.Now().UTC().Add(1 * time.Hour)
30 expires2 := expires.Add(1 * time.Hour)
31 id := NewID()
32 assert.NoError(t, Persist(db, id, int64(0), expires))
33
34 // insert duplicate session with new user id does nothing
35 assert.NoError(t, Persist(db, id, int64(1), expires2))
36 // read back user_id, no change
37 r, err := Read[int64](db, id)
38 assert.NoError(t, err)
39 assert.Equal(t, int64(0), r)
40
41 // update expiration of existing session
42 assert.NoError(t, Persist(db, id, int64(0), expires2))
43 var ti time.Time
44 err = db.QueryRow("SELECT expires FROM sessions WHERE session_hash = ?", hash(decode(id))).Scan(&ti)
45 assert.NoError(t, err)
46 assert.Equal(t, expires2, ti)
47}
48
49func TestExpires(t *testing.T) {
50 db := makeDB()
51 defer db.Close()
52
53 expires := time.Now().UTC().Add(1 * time.Second)
54 id := NewID()
55 assert.NoError(t, Persist(db, id, int64(0), expires))
56 time.Sleep(2 * time.Second)
57 // insert another session to trigger cleanup
58 assert.NoError(t, Persist(db, NewID(), int64(1), expires.Add(1*time.Hour)))
59
60 // read back session, doesn't exist because cleaned up by expired trigger
61 _, err := Read[int64](db, id)
62 assert.Error(t, err)
63 assert.True(t, errors.Is(err, ErrNoSession))
64}
65
66func TestID(t *testing.T) {
67 id := NewID()
68 assert.Equal(t, 16, len(id))
69}