toasty_driver_integration_suite/tests/
batch_query.rs1use crate::prelude::*;
2
3#[driver_test(id(ID), requires(sql))]
4pub async fn batch_two_models(t: &mut Test) -> Result<()> {
5 #[derive(Debug, toasty::Model)]
6 struct User {
7 #[key]
8 #[auto]
9 id: ID,
10 #[index]
11 name: String,
12 }
13
14 #[derive(Debug, toasty::Model)]
15 struct Post {
16 #[key]
17 #[auto]
18 id: ID,
19 #[index]
20 title: String,
21 }
22
23 let mut db = t.setup_db(models!(User, Post)).await;
24
25 User::create().name("Alice").exec(&mut db).await?;
26 User::create().name("Bob").exec(&mut db).await?;
27 Post::create().title("Hello").exec(&mut db).await?;
28
29 let (users, posts): (Vec<User>, Vec<Post>) = toasty::batch((
30 User::filter_by_name("Alice"),
31 Post::filter_by_title("Hello"),
32 ))
33 .exec(&mut db)
34 .await?;
35
36 assert_struct!(users, [_ { name: "Alice" }]);
37 assert_struct!(posts, [_ { title: "Hello" }]);
38
39 Ok(())
40}
41
42#[driver_test(id(ID), requires(sql))]
43pub async fn batch_one_empty(t: &mut Test) -> Result<()> {
44 #[derive(Debug, toasty::Model)]
45 struct User {
46 #[key]
47 #[auto]
48 id: ID,
49 #[index]
50 name: String,
51 }
52
53 #[derive(Debug, toasty::Model)]
54 struct Post {
55 #[key]
56 #[auto]
57 id: ID,
58 #[index]
59 title: String,
60 }
61
62 let mut db = t.setup_db(models!(User, Post)).await;
63
64 User::create().name("Alice").exec(&mut db).await?;
65
66 let (users, posts): (Vec<User>, Vec<Post>) = toasty::batch((
67 User::filter_by_name("Alice"),
68 Post::filter_by_title("nonexistent"),
69 ))
70 .exec(&mut db)
71 .await?;
72
73 assert_struct!(users, [_ { name: "Alice" }]);
74 assert!(posts.is_empty());
75
76 Ok(())
77}
78
79#[driver_test(id(ID), requires(sql))]
80pub async fn batch_same_model(t: &mut Test) -> Result<()> {
81 #[derive(Debug, toasty::Model)]
82 struct User {
83 #[key]
84 #[auto]
85 id: ID,
86 #[index]
87 name: String,
88 }
89
90 let mut db = t.setup_db(models!(User)).await;
91
92 User::create().name("Alice").exec(&mut db).await?;
93 User::create().name("Bob").exec(&mut db).await?;
94 User::create().name("Carol").exec(&mut db).await?;
95
96 let (alices, bobs): (Vec<User>, Vec<User>) =
97 toasty::batch((User::filter_by_name("Alice"), User::filter_by_name("Bob")))
98 .exec(&mut db)
99 .await?;
100
101 assert_struct!(alices, [_ { name: "Alice" }]);
102 assert_struct!(bobs, [_ { name: "Bob" }]);
103
104 Ok(())
105}
106
107#[driver_test(id(ID), requires(sql))]
108pub async fn batch_three_queries(t: &mut Test) -> Result<()> {
109 #[derive(Debug, toasty::Model)]
110 struct User {
111 #[key]
112 #[auto]
113 id: ID,
114 #[index]
115 name: String,
116 }
117
118 let mut db = t.setup_db(models!(User)).await;
119
120 User::create().name("Alice").exec(&mut db).await?;
121 User::create().name("Bob").exec(&mut db).await?;
122 User::create().name("Carol").exec(&mut db).await?;
123
124 let (alices, bobs, carols): (Vec<User>, Vec<User>, Vec<User>) = toasty::batch((
125 User::filter_by_name("Alice"),
126 User::filter_by_name("Bob"),
127 User::filter_by_name("Carol"),
128 ))
129 .exec(&mut db)
130 .await?;
131
132 assert_struct!(alices, [_ { name: "Alice" }]);
133 assert_struct!(bobs, [_ { name: "Bob" }]);
134 assert_struct!(carols, [_ { name: "Carol" }]);
135
136 Ok(())
137}
138
139#[driver_test(id(ID), requires(sql))]
140pub async fn batch_both_empty(t: &mut Test) -> Result<()> {
141 #[derive(Debug, toasty::Model)]
142 struct User {
143 #[key]
144 #[auto]
145 id: ID,
146 #[index]
147 name: String,
148 }
149
150 #[derive(Debug, toasty::Model)]
151 struct Post {
152 #[key]
153 #[auto]
154 id: ID,
155 #[index]
156 title: String,
157 }
158
159 let mut db = t.setup_db(models!(User, Post)).await;
160
161 let (users, posts): (Vec<User>, Vec<Post>) = toasty::batch((
162 User::filter_by_name("nobody"),
163 Post::filter_by_title("nothing"),
164 ))
165 .exec(&mut db)
166 .await?;
167
168 assert!(users.is_empty());
169 assert!(posts.is_empty());
170
171 Ok(())
172}
173
174#[driver_test(id(ID), requires(sql))]
175pub async fn batch_select_and_create(t: &mut Test) -> Result<()> {
176 #[derive(Debug, toasty::Model)]
177 struct User {
178 #[key]
179 #[auto]
180 id: ID,
181 #[index]
182 name: String,
183 }
184
185 let mut db = t.setup_db(models!(User)).await;
186
187 User::create().name("Alice").exec(&mut db).await?;
188
189 let (users, created): (Vec<User>, User) =
190 toasty::batch((User::filter_by_name("Alice"), User::create().name("Bob")))
191 .exec(&mut db)
192 .await?;
193
194 assert_struct!(users, [_ { name: "Alice" }]);
195 assert_eq!(created.name, "Bob");
196
197 let bob = User::filter_by_name("Bob").first(&mut db).await?;
199 assert!(bob.is_some());
200
201 Ok(())
202}