v / vlib / orm / orm_save_test.v
74 lines · 64 sloc · 1.45 KB · 68cdf32290e0ca67b2f8f1f6293663a35b008d68
Raw
1// vtest retry: 3
2// vtest build: present_sqlite3?
3import db.sqlite
4import orm
5import time
6
7@[table: 'save_users']
8struct SaveUser {
9mut:
10 id int @[primary; sql: serial]
11 name string
12 age int
13 nickname ?string
14 updated_at time.Time
15}
16
17fn test_save_updates_all_mapped_fields_using_primary_key() {
18 mut db := sqlite.connect(':memory:') or { panic(err) }
19 defer {
20 db.close() or {}
21 }
22
23 sql db {
24 create table SaveUser
25 }!
26
27 first := SaveUser{
28 name: 'Alice'
29 age: 30
30 nickname: 'ally'
31 updated_at: time.unix(100)
32 }
33 second := SaveUser{
34 name: 'Bob'
35 age: 28
36 nickname: 'b'
37 updated_at: time.unix(150)
38 }
39
40 sql db {
41 insert first into SaveUser
42 insert second into SaveUser
43 }!
44
45 mut selected := sql db {
46 select from SaveUser where name == 'Alice'
47 }!
48 assert selected.len == 1
49
50 mut updated := selected[0]
51 updated.name = 'Alice Updated'
52 updated.age = 31
53 updated.nickname = none
54 updated.updated_at = time.unix(200)
55
56 orm.save(db, updated)!
57
58 selected = sql db {
59 select from SaveUser where id == updated.id
60 }!
61 assert selected.len == 1
62 assert selected[0].id == updated.id
63 assert selected[0].name == 'Alice Updated'
64 assert selected[0].age == 31
65 assert selected[0].nickname == none
66 assert selected[0].updated_at == time.unix(200)
67
68 untouched := sql db {
69 select from SaveUser where name == 'Bob'
70 }!
71 assert untouched.len == 1
72 assert untouched[0].age == 28
73 assert untouched[0].nickname or { '' } == 'b'
74}
75