toasty_driver_integration_suite/tests/
batch_query_dynamic.rs

1use crate::prelude::*;
2
3#[driver_test(id(ID), requires(sql))]
4pub async fn batch_vec_of_queries(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    let mut db = t.setup_db(models!(User)).await;
15
16    User::create().name("Alice").exec(&mut db).await?;
17    User::create().name("Bob").exec(&mut db).await?;
18    User::create().name("Carol").exec(&mut db).await?;
19
20    let results: Vec<Vec<User>> = toasty::batch(vec![
21        User::filter_by_name("Alice"),
22        User::filter_by_name("Bob"),
23        User::filter_by_name("Carol"),
24    ])
25    .exec(&mut db)
26    .await?;
27
28    assert_struct!(results, [[_ { name: "Alice" }], [_ { name: "Bob" }], [_ { name: "Carol" }]]);
29
30    Ok(())
31}
32
33#[driver_test(id(ID), requires(sql))]
34pub async fn batch_array_of_queries(t: &mut Test) -> Result<()> {
35    #[derive(Debug, toasty::Model)]
36    struct User {
37        #[key]
38        #[auto]
39        id: ID,
40        #[index]
41        name: String,
42    }
43
44    let mut db = t.setup_db(models!(User)).await;
45
46    User::create().name("Alice").exec(&mut db).await?;
47    User::create().name("Bob").exec(&mut db).await?;
48
49    let results: Vec<Vec<User>> =
50        toasty::batch([User::filter_by_name("Alice"), User::filter_by_name("Bob")])
51            .exec(&mut db)
52            .await?;
53
54    assert_struct!(results, [[_ { name: "Alice" }], [_ { name: "Bob" }]]);
55
56    Ok(())
57}
58
59#[driver_test(id(ID), requires(sql))]
60pub async fn batch_vec_some_empty(t: &mut Test) -> Result<()> {
61    #[derive(Debug, toasty::Model)]
62    struct User {
63        #[key]
64        #[auto]
65        id: ID,
66        #[index]
67        name: String,
68    }
69
70    let mut db = t.setup_db(models!(User)).await;
71
72    User::create().name("Alice").exec(&mut db).await?;
73
74    let results: Vec<Vec<User>> = toasty::batch(vec![
75        User::filter_by_name("Alice"),
76        User::filter_by_name("nobody"),
77    ])
78    .exec(&mut db)
79    .await?;
80
81    assert_struct!(results, [[_ { name: "Alice" }], []]);
82
83    Ok(())
84}
85
86#[driver_test(id(ID), requires(sql))]
87pub async fn batch_nested_tuple_with_vec(t: &mut Test) -> Result<()> {
88    #[derive(Debug, toasty::Model)]
89    struct User {
90        #[key]
91        #[auto]
92        id: ID,
93        #[index]
94        name: String,
95    }
96
97    #[derive(Debug, toasty::Model)]
98    struct Post {
99        #[key]
100        #[auto]
101        id: ID,
102        #[index]
103        title: String,
104    }
105
106    let mut db = t.setup_db(models!(User, Post)).await;
107
108    User::create().name("Alice").exec(&mut db).await?;
109    User::create().name("Bob").exec(&mut db).await?;
110    Post::create().title("Hello").exec(&mut db).await?;
111    Post::create().title("World").exec(&mut db).await?;
112
113    // Tuple of (Vec-batch of user queries, Vec-batch of post queries)
114    let (users, posts): (Vec<Vec<User>>, Vec<Vec<Post>>) = toasty::batch((
115        vec![User::filter_by_name("Alice"), User::filter_by_name("Bob")],
116        vec![
117            Post::filter_by_title("Hello"),
118            Post::filter_by_title("World"),
119        ],
120    ))
121    .exec(&mut db)
122    .await?;
123
124    assert_struct!(users, [[_ { name: "Alice" }], [_ { name: "Bob" }]]);
125    assert_struct!(posts, [[_ { title: "Hello" }], [_ { title: "World" }]]);
126
127    Ok(())
128}
129
130#[driver_test(id(ID), requires(sql))]
131pub async fn batch_vec_all_empty(t: &mut Test) -> Result<()> {
132    #[derive(Debug, toasty::Model)]
133    struct User {
134        #[key]
135        #[auto]
136        id: ID,
137        #[index]
138        name: String,
139    }
140
141    let mut db = t.setup_db(models!(User)).await;
142
143    let results: Vec<Vec<User>> = toasty::batch(vec![
144        User::filter_by_name("nobody"),
145        User::filter_by_name("ghost"),
146    ])
147    .exec(&mut db)
148    .await?;
149
150    assert_struct!(results, [[], []]);
151
152    Ok(())
153}