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}