| 1 | // vtest retry: 3 |
| 2 | import db.sqlite |
| 3 | import x.json2 as json |
| 4 | import os |
| 5 | import time |
| 6 | import x.sessions |
| 7 | |
| 8 | const max_age = time.second |
| 9 | const db_path = os.join_path(os.vtmp_dir(), 'x_sessions_db_test.db') |
| 10 | |
| 11 | fn testsuite_begin() { |
| 12 | os.rm(db_path) or {} |
| 13 | } |
| 14 | |
| 15 | fn testsuite_end() { |
| 16 | os.rm(db_path) or {} |
| 17 | } |
| 18 | |
| 19 | pub struct User { |
| 20 | name string |
| 21 | age int |
| 22 | } |
| 23 | |
| 24 | const default_user = User{ |
| 25 | name: 'john' |
| 26 | age: 99 |
| 27 | } |
| 28 | const default_user_encoded = json.encode(default_user) |
| 29 | |
| 30 | fn 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 | |
| 58 | fn 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 | |
| 75 | fn 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 | |
| 97 | fn get_connection() !sqlite.DB { |
| 98 | return sqlite.connect(db_path)! |
| 99 | } |
| 100 | |