toasty_driver_integration_suite/tests/
batch_query.rs

1use 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    // Verify Bob was actually persisted
117    let res = User::filter_by_name("Bob").exec(&mut db).await?;
118    assert_struct!(res, [{ name: "Bob" }]);
119
120    Ok(())
121}