toasty_driver_integration_suite/tests/
batch_query_dynamic.rs

1use crate::prelude::*;
2
3#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
4pub async fn batch_vec_of_queries(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    User::create().name("Carol").exec(&mut db).await?;
10
11    let results: Vec<Vec<User>> = toasty::batch(vec![
12        User::filter_by_name("Alice"),
13        User::filter_by_name("Bob"),
14        User::filter_by_name("Carol"),
15    ])
16    .exec(&mut db)
17    .await?;
18
19    assert_struct!(results, [[{ name: "Alice" }], [{ name: "Bob" }], [{ name: "Carol" }]]);
20
21    Ok(())
22}
23
24#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
25pub async fn batch_array_of_queries(t: &mut Test) -> Result<()> {
26    let mut db = setup(t).await;
27
28    User::create().name("Alice").exec(&mut db).await?;
29    User::create().name("Bob").exec(&mut db).await?;
30
31    let results: Vec<Vec<User>> =
32        toasty::batch([User::filter_by_name("Alice"), User::filter_by_name("Bob")])
33            .exec(&mut db)
34            .await?;
35
36    assert_struct!(results, [[{ name: "Alice" }], [{ name: "Bob" }]]);
37
38    Ok(())
39}
40
41#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
42pub async fn batch_vec_some_empty(t: &mut Test) -> Result<()> {
43    let mut db = setup(t).await;
44
45    User::create().name("Alice").exec(&mut db).await?;
46
47    let results: Vec<Vec<User>> = toasty::batch(vec![
48        User::filter_by_name("Alice"),
49        User::filter_by_name("nobody"),
50    ])
51    .exec(&mut db)
52    .await?;
53
54    assert_struct!(results, [[{ name: "Alice" }], []]);
55
56    Ok(())
57}
58
59#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
60pub async fn batch_nested_tuple_with_vec(t: &mut Test) -> Result<()> {
61    let mut db = setup(t).await;
62
63    User::create().name("Alice").exec(&mut db).await?;
64    User::create().name("Bob").exec(&mut db).await?;
65    Post::create().title("Hello").exec(&mut db).await?;
66    Post::create().title("World").exec(&mut db).await?;
67
68    // Tuple of (Vec-batch of user queries, Vec-batch of post queries)
69    let (users, posts): (Vec<Vec<User>>, Vec<Vec<Post>>) = toasty::batch((
70        vec![User::filter_by_name("Alice"), User::filter_by_name("Bob")],
71        vec![
72            Post::filter_by_title("Hello"),
73            Post::filter_by_title("World"),
74        ],
75    ))
76    .exec(&mut db)
77    .await?;
78
79    assert_struct!(users, [[{ name: "Alice" }], [{ name: "Bob" }]]);
80    assert_struct!(posts, [[{ title: "Hello" }], [{ title: "World" }]]);
81
82    Ok(())
83}
84
85#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
86pub async fn batch_vec_all_empty(t: &mut Test) -> Result<()> {
87    let mut db = setup(t).await;
88
89    let results: Vec<Vec<User>> = toasty::batch(vec![
90        User::filter_by_name("nobody"),
91        User::filter_by_name("ghost"),
92    ])
93    .exec(&mut db)
94    .await?;
95
96    assert_struct!(results, [[], []]);
97
98    Ok(())
99}