Skip to main content

toasty_driver_integration_suite/tests/
clone_query.rs

1//! Test that generated query, create, and update structs implement Clone.
2
3use crate::prelude::*;
4
5/// Clone a filtered query and apply different modifiers to each copy.
6#[driver_test(id(ID), scenario(crate::scenarios::two_models), requires(scan))]
7pub async fn clone_query_with_different_modifiers(t: &mut Test) -> Result<()> {
8    let mut db = setup(t).await;
9
10    for _ in 0..10 {
11        User::create().name("a").exec(&mut db).await?;
12    }
13    User::create().name("b").exec(&mut db).await?;
14
15    let query = User::filter_by_name("a");
16    let limited: Vec<_> = query.clone().limit(3).exec(&mut db).await?;
17    let all: Vec<_> = query.exec(&mut db).await?;
18
19    assert_eq!(limited.len(), 3);
20    assert_eq!(all.len(), 10);
21
22    Ok(())
23}
24
25/// Clone a create builder, then override a field on the second copy.
26#[driver_test(id(ID), scenario(crate::scenarios::two_models))]
27pub async fn clone_create_builder(t: &mut Test) -> Result<()> {
28    let mut db = setup(t).await;
29
30    let builder = User::create().name("original");
31    let a = builder.clone().exec(&mut db).await?;
32    let b = builder.name("overridden").exec(&mut db).await?;
33
34    assert_eq!(a.name, "original");
35    assert_eq!(b.name, "overridden");
36
37    Ok(())
38}
39
40/// Clone a query-based update builder, then change the value on the second copy.
41#[driver_test(id(ID), scenario(crate::scenarios::two_models), requires(scan))]
42pub async fn clone_update_builder(t: &mut Test) -> Result<()> {
43    let mut db = setup(t).await;
44
45    let a = User::create().name("a").exec(&mut db).await?;
46    User::create().name("b").exec(&mut db).await?;
47
48    let update = User::filter_by_id(a.id).update();
49    update.clone().name("x").exec(&mut db).await?;
50
51    let items: Vec<_> = User::filter_by_name("x").exec(&mut db).await?;
52    assert_eq!(items.len(), 1);
53
54    update.name("y").exec(&mut db).await?;
55
56    let items: Vec<_> = User::filter_by_name("y").exec(&mut db).await?;
57    assert_eq!(items.len(), 1);
58
59    // "b" is untouched
60    let items: Vec<_> = User::filter_by_name("b").exec(&mut db).await?;
61    assert_eq!(items.len(), 1);
62
63    Ok(())
64}