v2 / vlib / v / tests / orm_update_test.v
224 lines · 183 sloc · 3.8 KB · d13bfa914fa4edd826cf817698cb3a4a231909d5
Raw
1import db.sqlite
2import time
3
4struct Person {
5 name string
6 height Height
7}
8
9enum Height as u8 {
10 tall
11 small
12}
13
14fn test_main() {
15 db := sqlite.connect(':memory:')!
16
17 sql db {
18 create table Person
19 }!
20
21 a := Person{'A', Height.small}
22 b := Person{'A', Height.tall}
23
24 sql db {
25 insert a into Person
26 }!
27
28 sql db {
29 insert b into Person
30 }!
31
32 new_height := Height.small
33 sql db {
34 update Person set height = new_height where height == Height.tall
35 }!
36
37 rows := sql db {
38 select from Person where height == Height.small
39 }!
40
41 assert rows.len == 2
42}
43
44@[table: 'orm_update_users']
45struct OrmUpdateUser {
46pub:
47 id string @[primary]
48 name string
49 updated_at time.Time @[sql_type: 'TIMESTAMP']
50}
51
52struct OrmUpdateReq {
53 updated_at ?time.Time
54}
55
56fn test_orm_update_with_option_selector_or_block() {
57 mut db := sqlite.connect(':memory:')!
58 defer {
59 db.close() or { panic(err) }
60 }
61
62 sql db {
63 create table OrmUpdateUser
64 }!
65
66 user := OrmUpdateUser{
67 id: '100'
68 name: 'Alice'
69 updated_at: time.unix(1_700_000_000)
70 }
71 sql db {
72 insert user into OrmUpdateUser
73 }!
74
75 req := OrmUpdateReq{}
76 expected_updated_at := time.unix(1_700_000_123)
77
78 sql db {
79 update OrmUpdateUser set updated_at = req.updated_at or { expected_updated_at } where id == '100'
80 }!
81
82 rows := sql db {
83 select from OrmUpdateUser where id == '100'
84 }!
85
86 assert rows.len == 1
87 assert rows[0].updated_at.unix() == expected_updated_at.unix()
88}
89
90struct OrmUpdateThing {
91 id int @[primary]
92 value string
93}
94
95struct OrmUpdateCommit {
96 id int @[primary]
97 tag string
98 thing OrmUpdateThing
99}
100
101fn test_orm_update_with_struct_field() {
102 mut db := sqlite.connect(':memory:')!
103 defer {
104 db.close() or { panic(err) }
105 }
106
107 sql db {
108 create table OrmUpdateThing
109 create table OrmUpdateCommit
110 }!
111
112 second := OrmUpdateThing{
113 id: 2
114 value: 'goodbye'
115 }
116 sql db {
117 insert second into OrmUpdateThing
118 }!
119
120 commit := OrmUpdateCommit{
121 id: 1
122 tag: 'head'
123 thing: OrmUpdateThing{
124 id: 1
125 value: 'hello'
126 }
127 }
128 sql db {
129 insert commit into OrmUpdateCommit
130 }!
131
132 sql db {
133 update OrmUpdateCommit set thing = second where tag == 'head'
134 }!
135
136 rows := sql db {
137 select from OrmUpdateCommit where tag == 'head'
138 }!
139
140 assert rows.len == 1
141 assert rows[0].thing.id == second.id
142 assert rows[0].thing.value == 'goodbye'
143}
144
145struct DynamicOrmUser {
146 id int @[primary; sql: serial]
147 simplified_name string
148 currency_code string
149}
150
151struct DynamicOrmRequest {
152 simplified_name ?string
153 currency_code ?string
154}
155
156fn test_dynamic_orm_select_and_update_with_if_guards() {
157 mut db := sqlite.connect(':memory:')!
158 defer {
159 db.close() or { panic(err) }
160 }
161
162 sql db {
163 create table DynamicOrmUser
164 }!
165
166 first := DynamicOrmUser{
167 id: 1
168 simplified_name: 'usd'
169 currency_code: 'USD'
170 }
171 second := DynamicOrmUser{
172 id: 2
173 simplified_name: 'eur'
174 currency_code: 'EUR'
175 }
176
177 sql db {
178 insert first into DynamicOrmUser
179 insert second into DynamicOrmUser
180 }!
181
182 select_req := DynamicOrmRequest{
183 simplified_name: ?string('usd')
184 }
185 where_expr := {
186 if name := select_req.simplified_name {
187 simplified_name == name
188 },
189 if code := select_req.currency_code {
190 currency_code == code
191 }
192 }
193
194 rows := sql db {
195 dynamic select from DynamicOrmUser where where_expr
196 }!
197
198 assert rows.len == 1
199 assert rows[0].id == first.id
200
201 update_req := DynamicOrmRequest{
202 simplified_name: ?string('dollar')
203 }
204 set_expr := {
205 if name := update_req.simplified_name {
206 simplified_name == name
207 },
208 if code := update_req.currency_code {
209 currency_code == code
210 }
211 }
212
213 sql db {
214 dynamic update DynamicOrmUser set set_expr where id == first.id
215 }!
216
217 updated_rows := sql db {
218 select from DynamicOrmUser where id == first.id
219 }!
220
221 assert updated_rows.len == 1
222 assert updated_rows[0].simplified_name == 'dollar'
223 assert updated_rows[0].currency_code == 'USD'
224}
225