v2 / vlib / v / tests / orm_generic_struct_select_test.v
115 lines · 89 sloc · 1.75 KB · bc904b84205117c87b9665d26e9d339bc436964d
Raw
1// vtest build: present_sqlite3?
2module main
3
4import db.sqlite
5
6struct DbValue[T] {
7 id int @[primary; sql: serial]
8 data T
9}
10
11pub fn (row DbValue[T]) str() string {
12 return 'DbValue(id=${row.id})'
13}
14
15struct User {
16 id int @[primary; sql: serial]
17 name string
18}
19
20fn run_generic_orm_query[T](value T) ![]DbValue[T] {
21 mut db := sqlite.connect(':memory:')!
22 defer {
23 db.close() or {}
24 }
25
26 sql db {
27 create table DbValue[T]
28 }!
29
30 row := DbValue[T]{
31 data: value
32 }
33
34 sql db {
35 insert row into DbValue[T]
36 }!
37
38 rows := sql db {
39 select from DbValue[T]
40 }!
41 println(rows)
42
43 return rows
44}
45
46fn run_generic_struct_orm_query[T](mut db sqlite.DB, value T) ![]DbValue[T] {
47 row := DbValue[T]{
48 data: value
49 }
50
51 sql db {
52 insert row into DbValue[T]
53 }!
54
55 rows := sql db {
56 select from DbValue[T]
57 }!
58
59 return rows
60}
61
62fn run_generic_table_orm_query[T](mut db sqlite.DB, value T) ![]T {
63 sql db {
64 create table T
65 }!
66
67 sql db {
68 insert value into T
69 }!
70
71 rows := sql db {
72 select from T
73 }!
74
75 return rows
76}
77
78fn test_orm_generic_struct_select_in_generic_fn() {
79 rows := run_generic_orm_query('test') or { panic(err) }
80 assert rows.len == 1
81 assert rows[0].data == 'test'
82}
83
84fn test_orm_generic_struct_select_with_inferred_struct_type() {
85 mut db := sqlite.connect(':memory:')!
86 defer {
87 db.close() or {}
88 }
89
90 sql db {
91 create table User
92 create table DbValue[User]
93 }!
94
95 rows := run_generic_struct_orm_query(mut db, User{
96 name: 'test'
97 }) or { panic(err) }
98
99 assert rows.len == 1
100 assert rows[0].data.name == 'test'
101}
102
103fn test_orm_generic_table_symbol_in_generic_fn() {
104 mut db := sqlite.connect(':memory:')!
105 defer {
106 db.close() or {}
107 }
108
109 rows := run_generic_table_orm_query(mut db, User{
110 name: 'generic'
111 }) or { panic(err) }
112
113 assert rows.len == 1
114 assert rows[0].name == 'generic'
115}
116