-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathohm_test.lua
142 lines (108 loc) · 3.65 KB
/
ohm_test.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
local resp = require("lib/resp-6e21869")
local user = require("examples/user")
local attributes = {
email = "[email protected]",
fname = "John",
lname = "Doe",
full_name = "John Doe",
}
local db = resp.new("localhost", 6379)
-- setup
assert(db:call("FLUSHDB"))
-- case 1: saving a new entry
local id = assert(user:save(db, attributes))
assert(id == "1")
-- case 1.1: verify the hash
local values = db:call("HMGET", "User:1", "email", "fname", "lname")
assert(3 == db:call("HLEN", "User:1"))
assert(values[1] == "[email protected]")
assert(values[2] == "John")
assert(values[3] == "Doe")
-- case 1.2: verify indices
local indices = db:call("SMEMBERS", "User:indices:full_name:John Doe")
assert(indices[1] == "1")
local _indices = db:call("SMEMBERS", "User:1:_indices")
assert(_indices[1] == "User:indices:full_name:John Doe")
-- case 1.3: verify uniques
local id = db:call("HGET", "User:uniques:email", "[email protected]")
assert(id == "1")
local _uniques = db:call("HGETALL", "User:1:_uniques")
assert(_uniques[1] == "User:uniques:email")
assert(_uniques[2] == "[email protected]")
-- case 1.4: verify User:all set
local all = db:call("SMEMBERS", "User:all")
assert(#all == 1)
assert(all[1] == "1")
-- case 2: unique index violation
local _, err = user:save(db, attributes)
assert(err.code == "UniqueIndexViolation")
assert(err.attr == "email")
-- case 3: updating an existing entry
attributes = {
id = "1",
fname = "Jane",
lname = "Cruz",
full_name = "Jane Cruz",
email = "[email protected]",
}
assert("1" == user:save(db, attributes))
-- case 3.1: verify the hash
local values = db:call("HMGET", "User:1", "email", "fname", "lname")
assert(3 == db:call("HLEN", "User:1"))
assert(values[1] == "[email protected]")
assert(values[2] == "Jane")
assert(values[3] == "Cruz")
-- case 3.2: verify indices
local indices = db:call("SMEMBERS", "User:indices:full_name:Jane Cruz")
assert(indices[1] == "1")
local _indices = db:call("SMEMBERS", "User:1:_indices")
assert(_indices[1] == "User:indices:full_name:Jane Cruz")
-- case 3.3: verify uniques
local id = db:call("HGET", "User:uniques:email", "[email protected]")
assert(id == "1")
local _uniques = db:call("HGETALL", "User:1:_uniques")
assert(_uniques[1] == "User:uniques:email")
assert(_uniques[2] == "[email protected]")
-- case 3.4: verify User:all set
local all = db:call("SMEMBERS", "User:all")
assert(#all == 1)
assert(all[1] == "1")
-- case 4: delete an entry
-- this key will be purged together with the model since
-- it's tracked
db:call("SET", "User:1:notes", "some notes for user")
local id = user:delete(db, attributes)
assert("1" == id)
keys = db:call("KEYS", "*") -- only User:id remains at this point
assert(#keys == 1)
assert(keys[1] == "User:id")
-- case 5: finding records via index
attributes.full_name = {"Jane Cruz", "JaneC"}
local id = assert(user:save(db, attributes))
local set = user:find(db, {full_name={"Jane Cruz", "JaneC"}})
local u = set[1]
assert(1 == #set)
assert(u.id == "1")
assert(u.email == "[email protected]")
assert(u.fname == "Jane")
assert(u.lname == "Cruz")
-- case 6: finding records via unique
local u = user:with(db, "email", "[email protected]")
assert(u)
assert(u.id == "1")
assert(u.email == "[email protected]")
assert(u.fname == "Jane")
assert(u.lname == "Cruz")
-- case 7: finding records via fetch
local u = user:fetch(db, "1")
assert(u.id == "1")
assert(u.email == "[email protected]")
assert(u.fname == "Jane")
assert(u.lname == "Cruz")
-- case 8: saving a model with nothing but attributes
local comment = require("examples/comment")
local attributes = {name="John", body="Hola Mundo"}
local id = assert(comment:save(db, attributes))
assert(comment:fetch(db, id))
-- We've won ;-)
print("All tests passed.")