v / vlib / orm / orm_fk_test.v
168 lines · 142 sloc · 2.52 KB · 8198e9ecda84101484435df6f612e3609e9aec37
Raw
1// vtest retry: 3
2import db.sqlite
3
4struct Person {
5 id int @[primary; sql: serial]
6 age int
7 brothers []Brother @[fkey: 'person_id']
8 sisters []Sister @[fkey: 'person_id']
9 field_after_fkeys string
10}
11
12struct Brother {
13 id int @[primary; sql: serial]
14 person_id int
15 name string
16}
17
18struct Sister {
19 id int @[primary; sql: serial]
20 person_id int
21 name string
22}
23
24fn test_field_after_fkeys() {
25 db := sqlite.connect(':memory:') or { panic(err) }
26
27 sql db {
28 create table Brother
29 create table Sister
30 create table Person
31 }!
32
33 person := Person{
34 age: 21
35 brothers: [Brother{
36 name: 'aaa'
37 }, Brother{
38 name: 'bbb'
39 }]
40 sisters: [Sister{
41 name: 'ccc'
42 }, Sister{
43 name: 'ddd'
44 }]
45 field_after_fkeys: 'eee'
46 }
47
48 sql db {
49 insert person into Person
50 }!
51
52 persons := sql db {
53 select from Person
54 }!
55 assert persons[0].age == 21
56 assert persons[0].field_after_fkeys == 'eee'
57}
58
59@[table: 'foos']
60struct Foo {
61 id int @[primary; sql: serial]
62 name string
63 children []Child @[fkey: 'parent_id']
64}
65
66struct Child {
67 id int @[primary; sql: serial]
68 parent_id int
69 name string
70}
71
72fn test_fkey_insert_as_assignment_expr() {
73 db := sqlite.connect(':memory:')!
74
75 sql db {
76 create table Foo
77 create table Child
78 }!
79
80 foo := Foo{
81 name: 'abc'
82 children: [
83 Child{
84 name: 'abc'
85 },
86 Child{
87 name: 'def'
88 },
89 ]
90 }
91 // use insert as an assigment expr
92 _ := sql db {
93 insert foo into Foo
94 }!
95
96 result := sql db {
97 select from Foo where id == 1
98 }!
99 assert result[0].children.len == 2
100
101 res := sql db {
102 select from Child
103 }!
104 assert res.len == 2
105}
106
107struct Foo2 {
108 id int @[primary; sql: serial]
109 name string
110 children []Child2 @[fkey: 'parent_id']
111}
112
113struct Child2 {
114 id int @[primary; sql: serial]
115 parent_id int
116 name string
117 bar ?Bar2 @[fkey: 'child_id']
118}
119
120struct Bar2 {
121 id int @[primary; sql: serial]
122 child_id int
123 name string
124}
125
126fn test_double_fkey_insert() {
127 db := sqlite.connect(':memory:')!
128
129 sql db {
130 create table Foo2
131 create table Child2
132 create table Bar2
133 }!
134
135 child_one := Child2{
136 name: 'abc'
137 }
138
139 child_two := Child2{
140 name: 'def'
141 }
142
143 bar_one := Bar2{
144 id: 0
145 name: 'name'
146 }
147
148 foo := Foo2{
149 name: 'abc'
150 children: [
151 child_one,
152 child_two,
153 ]
154 }
155 _ := sql db {
156 insert foo into Foo2
157 }!
158
159 result := sql db {
160 select from Foo2 where id == 1
161 }!
162 assert result[0].children.len == 2
163
164 res := sql db {
165 select from Child2
166 }!
167 assert res.len == 2
168}
169