toasty_driver_integration_suite/tests/
batch_query.rs1use crate::prelude::*;
2
3#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
4pub async fn batch_two_models(t: &mut Test) -> Result<()> {
5 let mut db = setup(t).await;
6
7 User::create().name("Alice").exec(&mut db).await?;
8 User::create().name("Bob").exec(&mut db).await?;
9 Post::create().title("Hello").exec(&mut db).await?;
10
11 let (users, posts): (Vec<User>, Vec<Post>) = toasty::batch((
12 User::filter_by_name("Alice"),
13 Post::filter_by_title("Hello"),
14 ))
15 .exec(&mut db)
16 .await?;
17
18 assert_struct!(users, [{ name: "Alice" }]);
19 assert_struct!(posts, [{ title: "Hello" }]);
20
21 Ok(())
22}
23
24#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
25pub async fn batch_one_empty(t: &mut Test) -> Result<()> {
26 let mut db = setup(t).await;
27
28 User::create().name("Alice").exec(&mut db).await?;
29
30 let (users, posts): (Vec<User>, Vec<Post>) = toasty::batch((
31 User::filter_by_name("Alice"),
32 Post::filter_by_title("nonexistent"),
33 ))
34 .exec(&mut db)
35 .await?;
36
37 assert_struct!(users, [{ name: "Alice" }]);
38 assert!(posts.is_empty());
39
40 Ok(())
41}
42
43#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
44pub async fn batch_same_model(t: &mut Test) -> Result<()> {
45 let mut db = setup(t).await;
46
47 User::create().name("Alice").exec(&mut db).await?;
48 User::create().name("Bob").exec(&mut db).await?;
49 User::create().name("Carol").exec(&mut db).await?;
50
51 let (alices, bobs): (Vec<User>, Vec<User>) =
52 toasty::batch((User::filter_by_name("Alice"), User::filter_by_name("Bob")))
53 .exec(&mut db)
54 .await?;
55
56 assert_struct!(alices, [{ name: "Alice" }]);
57 assert_struct!(bobs, [{ name: "Bob" }]);
58
59 Ok(())
60}
61
62#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
63pub async fn batch_three_queries(t: &mut Test) -> Result<()> {
64 let mut db = setup(t).await;
65
66 User::create().name("Alice").exec(&mut db).await?;
67 User::create().name("Bob").exec(&mut db).await?;
68 User::create().name("Carol").exec(&mut db).await?;
69
70 let (alices, bobs, carols): (Vec<User>, Vec<User>, Vec<User>) = toasty::batch((
71 User::filter_by_name("Alice"),
72 User::filter_by_name("Bob"),
73 User::filter_by_name("Carol"),
74 ))
75 .exec(&mut db)
76 .await?;
77
78 assert_struct!(alices, [{ name: "Alice" }]);
79 assert_struct!(bobs, [{ name: "Bob" }]);
80 assert_struct!(carols, [{ name: "Carol" }]);
81
82 Ok(())
83}
84
85#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
86pub async fn batch_both_empty(t: &mut Test) -> Result<()> {
87 let mut db = setup(t).await;
88
89 let (users, posts): (Vec<User>, Vec<Post>) = toasty::batch((
90 User::filter_by_name("nobody"),
91 Post::filter_by_title("nothing"),
92 ))
93 .exec(&mut db)
94 .await?;
95
96 assert!(users.is_empty());
97 assert!(posts.is_empty());
98
99 Ok(())
100}
101
102#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
103pub async fn batch_select_and_create(t: &mut Test) -> Result<()> {
104 let mut db = setup(t).await;
105
106 User::create().name("Alice").exec(&mut db).await?;
107
108 let (users, created): (Vec<User>, User) =
109 toasty::batch((User::filter_by_name("Alice"), User::create().name("Bob")))
110 .exec(&mut db)
111 .await?;
112
113 assert_struct!(users, [{ name: "Alice" }]);
114 assert_eq!(created.name, "Bob");
115
116 let res = User::filter_by_name("Bob").exec(&mut db).await?;
118 assert_struct!(res, [{ name: "Bob" }]);
119
120 Ok(())
121}