v / vlib / orm / orm_join_test.v
156 lines · 136 sloc · 3.04 KB · 796dfe4f51525f9c0ff9c21da3d6747594a798fa
Raw
1// vtest retry: 3
2// vtest build: present_sqlite3? && !windows && !sanitize-memory-clang
3import db.sqlite
4
5// Department table for testing JOINs - using dept_id to avoid column name conflicts
6struct Department {
7 dept_id int @[primary; sql: serial]
8 dept_name string
9}
10
11// User table with a foreign key reference to Department
12struct User {
13 user_id int @[primary; sql: serial]
14 user_name string
15 department_id int
16}
17
18fn test_inner_join() {
19 db := sqlite.connect(':memory:') or { panic(err) }
20
21 // Create tables
22 sql db {
23 create table Department
24 create table User
25 }!
26
27 // Insert departments
28 engineering := Department{
29 dept_name: 'Engineering'
30 }
31 sales := Department{
32 dept_name: 'Sales'
33 }
34 sql db {
35 insert engineering into Department
36 insert sales into Department
37 }!
38
39 // Insert users
40 alice := User{
41 user_name: 'Alice'
42 department_id: 1
43 }
44 bob := User{
45 user_name: 'Bob'
46 department_id: 2
47 }
48 charlie := User{
49 user_name: 'Charlie'
50 department_id: 1
51 }
52 sql db {
53 insert alice into User
54 insert bob into User
55 insert charlie into User
56 }!
57
58 // Test basic INNER JOIN
59 users := sql db {
60 select from User
61 join Department on User.department_id == Department.dept_id
62 }!
63
64 assert users.len == 3
65}
66
67fn test_inner_join_with_where() {
68 db := sqlite.connect(':memory:') or { panic(err) }
69
70 // Create tables
71 sql db {
72 create table Department
73 create table User
74 }!
75
76 // Insert departments
77 engineering := Department{
78 dept_name: 'Engineering'
79 }
80 sales := Department{
81 dept_name: 'Sales'
82 }
83 sql db {
84 insert engineering into Department
85 insert sales into Department
86 }!
87
88 // Insert users
89 alice := User{
90 user_name: 'Alice'
91 department_id: 1
92 }
93 bob := User{
94 user_name: 'Bob'
95 department_id: 2
96 }
97 charlie := User{
98 user_name: 'Charlie'
99 department_id: 1
100 }
101 sql db {
102 insert alice into User
103 insert bob into User
104 insert charlie into User
105 }!
106
107 // Test INNER JOIN with WHERE clause - use simple field name (not Table.field)
108 engineering_users := sql db {
109 select from User
110 join Department on User.department_id == Department.dept_id where department_id == 1
111 }!
112
113 assert engineering_users.len == 2
114 assert engineering_users[0].user_name == 'Alice' || engineering_users[0].user_name == 'Charlie'
115}
116
117fn test_left_join() {
118 db := sqlite.connect(':memory:') or { panic(err) }
119
120 // Create tables
121 sql db {
122 create table Department
123 create table User
124 }!
125
126 // Insert departments
127 engineering := Department{
128 dept_name: 'Engineering'
129 }
130 sql db {
131 insert engineering into Department
132 }!
133
134 // Insert users - one with a department, one without (orphan)
135 alice := User{
136 user_name: 'Alice'
137 department_id: 1
138 }
139 bob := User{
140 user_name: 'Bob'
141 department_id: 999 // No matching department
142 }
143 sql db {
144 insert alice into User
145 insert bob into User
146 }!
147
148 // Test LEFT JOIN - should return all users, even those without matching department
149 users := sql db {
150 select from User
151 left join Department on User.department_id == Department.dept_id
152 }!
153
154 // Both users should be returned since it's a LEFT JOIN
155 assert users.len == 2
156}
157