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), requires(sql))]
7pub async fn clone_query_with_different_modifiers(t: &mut Test) -> Result<()> {
8    #[derive(toasty::Model)]
9    struct Item {
10        #[key]
11        #[auto]
12        id: ID,
13
14        #[index]
15        name: String,
16    }
17
18    let mut db = t.setup_db(models!(Item)).await;
19
20    for _ in 0..10 {
21        Item::create().name("a").exec(&mut db).await?;
22    }
23    Item::create().name("b").exec(&mut db).await?;
24
25    let query = Item::filter_by_name("a");
26    let limited: Vec<_> = query.clone().limit(3).exec(&mut db).await?;
27    let all: Vec<_> = query.exec(&mut db).await?;
28
29    assert_eq!(limited.len(), 3);
30    assert_eq!(all.len(), 10);
31
32    Ok(())
33}
34
35/// Clone a create builder, then override a field on the second copy.
36#[driver_test(id(ID))]
37pub async fn clone_create_builder(t: &mut Test) -> Result<()> {
38    #[derive(toasty::Model)]
39    struct Item {
40        #[key]
41        #[auto]
42        id: ID,
43
44        name: String,
45    }
46
47    let mut db = t.setup_db(models!(Item)).await;
48
49    let builder = Item::create().name("original");
50    let a = builder.clone().exec(&mut db).await?;
51    let b = builder.name("overridden").exec(&mut db).await?;
52
53    assert_eq!(a.name, "original");
54    assert_eq!(b.name, "overridden");
55
56    Ok(())
57}
58
59/// Clone a query-based update builder, then change the value on the second copy.
60#[driver_test(id(ID), requires(sql))]
61pub async fn clone_update_builder(t: &mut Test) -> Result<()> {
62    #[derive(toasty::Model)]
63    struct Item {
64        #[key]
65        #[auto]
66        id: ID,
67
68        #[index]
69        name: String,
70    }
71
72    let mut db = t.setup_db(models!(Item)).await;
73
74    let a = Item::create().name("a").exec(&mut db).await?;
75    Item::create().name("b").exec(&mut db).await?;
76
77    let update = Item::filter_by_id(a.id).update();
78    update.clone().name("x").exec(&mut db).await?;
79
80    let items: Vec<_> = Item::filter_by_name("x").exec(&mut db).await?;
81    assert_eq!(items.len(), 1);
82
83    update.name("y").exec(&mut db).await?;
84
85    let items: Vec<_> = Item::filter_by_name("y").exec(&mut db).await?;
86    assert_eq!(items.len(), 1);
87
88    // "b" is untouched
89    let items: Vec<_> = Item::filter_by_name("b").exec(&mut db).await?;
90    assert_eq!(items.len(), 1);
91
92    Ok(())
93}