toasty_driver_integration_suite/tests/
batch_query.rs

1use 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    // Verify Bob was actually persisted
198    let bob = User::filter_by_name("Bob").first(&mut db).await?;
199    assert!(bob.is_some());
200
201    Ok(())
202}