v / vlib / orm / orm_aggregate_test.v
156 lines · 134 sloc · 2.85 KB · eed19e05ac08b534f0cade2f6b55d9f358a0bc64
Raw
1// vtest retry: 3
2// vtest build: present_sqlite3? && !windows && !sanitize-memory-clang
3import orm
4import time
5import db.sqlite
6
7struct AggregateEntry {
8 id int @[primary; sql: serial]
9 age int
10 score f64
11 label string
12 created time.Time
13}
14
15fn test_sql_orm_aggregates() {
16 mut db := sqlite.connect(':memory:') or { panic(err) }
17 defer {
18 db.close() or {}
19 }
20
21 sql db {
22 create table AggregateEntry
23 }!
24
25 first_created := time.unix(1_700_000_000)
26 second_created := time.unix(1_700_000_100)
27 third_created := time.unix(1_700_000_200)
28 entries := [
29 AggregateEntry{
30 age: 20
31 score: 7.5
32 label: 'bravo'
33 created: second_created
34 },
35 AggregateEntry{
36 age: 30
37 score: 8.25
38 label: 'alpha'
39 created: first_created
40 },
41 AggregateEntry{
42 age: 40
43 score: 9.75
44 label: 'charlie'
45 created: third_created
46 },
47 ]
48
49 for entry in entries {
50 sql db {
51 insert entry into AggregateEntry
52 }!
53 }
54
55 total_age := sql db {
56 select sum(age) from AggregateEntry
57 }!
58 if value := total_age {
59 assert value == 90
60 } else {
61 assert false
62 }
63
64 average_age := sql db {
65 select avg(age) from AggregateEntry where age >= 20
66 }!
67 if value := average_age {
68 assert value == 30.0
69 } else {
70 assert false
71 }
72
73 min_label := sql db {
74 select min(label) from AggregateEntry
75 }!
76 if value := min_label {
77 assert value == 'alpha'
78 } else {
79 assert false
80 }
81
82 max_created := sql db {
83 select max(created) from AggregateEntry
84 }!
85 if value := max_created {
86 assert value == third_created
87 } else {
88 assert false
89 }
90
91 empty_sum := sql db {
92 select sum(age) from AggregateEntry where age > 100
93 }!
94 assert empty_sum == none
95
96 empty_avg := sql db {
97 select avg(score) from AggregateEntry where age > 100
98 }!
99 assert empty_avg == none
100}
101
102fn test_query_builder_aggregates() {
103 mut db := sqlite.connect(':memory:') or { panic(err) }
104 defer {
105 db.close() or {}
106 }
107
108 mut qb := orm.new_query[AggregateEntry](db)
109 qb.create()!
110
111 first_created := time.unix(1_800_000_000)
112 second_created := time.unix(1_800_000_100)
113 entries := [
114 AggregateEntry{
115 age: 10
116 score: 1.5
117 label: 'delta'
118 created: second_created
119 },
120 AggregateEntry{
121 age: 25
122 score: 2.5
123 label: 'beta'
124 created: first_created
125 },
126 ]
127
128 qb.insert_many(entries)!
129
130 assert qb.count()! == 2
131
132 sum_age := qb.sum('age')!
133 assert sum_age.has_value
134 assert sum_age.as_int()? == 35
135
136 avg_score := qb.avg('score')!
137 assert avg_score.has_value
138 assert avg_score.as_f64()? == 2.0
139
140 min_label := qb.min('label')!
141 assert min_label.has_value
142 assert min_label.as_string()? == 'beta'
143
144 max_created := qb.max('created')!
145 assert max_created.has_value
146 assert max_created.as_time()? == second_created
147
148 empty_max := qb.where('age > ?', 100)!.max('age')!
149 assert !empty_max.has_value
150
151 if _ := qb.sum('label') {
152 assert false
153 } else {
154 assert err.msg().contains('requires a numeric field')
155 }
156}
157