v2 / vlib / x / sessions / tests / db_store_test.v
99 lines · 83 sloc · 1.9 KB · 99be39cbd15d4bbb5ab14d2f870199908c00bc8d
Raw
1// vtest retry: 3
2import db.sqlite
3import x.json2 as json
4import os
5import time
6import x.sessions
7
8const max_age = time.second
9const db_path = os.join_path(os.vtmp_dir(), 'x_sessions_db_test.db')
10
11fn testsuite_begin() {
12 os.rm(db_path) or {}
13}
14
15fn testsuite_end() {
16 os.rm(db_path) or {}
17}
18
19pub struct User {
20 name string
21 age int
22}
23
24const default_user = User{
25 name: 'john'
26 age: 99
27}
28const default_user_encoded = json.encode(default_user)
29
30fn test_store_set() {
31 mut db := get_connection()!
32 defer {
33 db.close() or {}
34 }
35 mut store := sessions.DBStore.create[User](db)!
36 store.set('a', default_user)!
37
38 mut rows := sql db {
39 select from sessions.DBStoreSessions
40 }!
41 assert rows.len == 1
42
43 // check if created at time is not empty
44 assert rows[0].created_at != time.Time{}
45 assert rows[0].data == default_user_encoded
46
47 first_created := rows[0].created_at
48 store.set('a', User{ age: 99 })!
49
50 rows = sql db {
51 select from sessions.DBStoreSessions
52 }!
53 assert rows.len == 1
54 assert rows[0].created_at == first_created
55 assert rows[0].data == json.encode(User{ age: 99 })
56}
57
58fn test_store_get() {
59 mut db := get_connection()!
60 defer {
61 db.close() or {}
62 }
63 mut store := sessions.DBStore.create[User](db)!
64 store.set('b', default_user)!
65
66 if data := store.get('b', max_age) {
67 assert data == default_user
68 } else {
69 $if !windows {
70 assert false, 'session data should not be none'
71 }
72 }
73}
74
75fn test_store_session_expired() {
76 mut db := get_connection()!
77 defer {
78 db.close() or {}
79 }
80 mut store := sessions.DBStore.create[User](db)!
81 store.set('c', default_user)!
82
83 time.sleep(2 * max_age)
84
85 if data := store.get('c', max_age) {
86 assert false, 'session should be expired!'
87 } else {
88 assert err.msg() == 'session is expired'
89 }
90 // verify that data is deleted
91 rows := sql db {
92 select from sessions.DBStoreSessions where session_id == 'c'
93 }!
94 assert rows.len == 0
95}
96
97fn get_connection() !sqlite.DB {
98 return sqlite.connect(db_path)!
99}
100