Skip to main content

toasty_driver_integration_suite/tests/
relation_belongs_to_configured.rs

1use crate::prelude::*;
2
3#[driver_test(id(ID))]
4pub async fn different_field_name(test: &mut Test) -> Result<()> {
5    #[derive(Debug, toasty::Model)]
6    struct User {
7        #[key]
8        #[auto]
9        id: ID,
10
11        #[has_many(pair = owner)]
12        todos: toasty::HasMany<Todo>,
13    }
14
15    #[derive(Debug, toasty::Model)]
16    struct Todo {
17        #[key]
18        #[auto]
19        id: ID,
20
21        #[belongs_to(key = owner_id, references = id)]
22        owner: toasty::BelongsTo<User>,
23
24        #[index]
25        owner_id: ID,
26
27        title: String,
28    }
29
30    let mut db = test.setup_db(models!(User, Todo)).await;
31
32    // Create a user
33    let user = User::create().exec(&mut db).await?;
34
35    // Create a Todo associated with the user
36    let todo = user
37        .todos()
38        .create()
39        .title("hello world")
40        .exec(&mut db)
41        .await?;
42
43    assert_eq!(todo.title, "hello world");
44
45    // Load the user
46    let user_reloaded = todo.owner().exec(&mut db).await?;
47
48    assert_eq!(user.id, user_reloaded.id);
49    Ok(())
50}
51
52// Regression test for https://github.com/tokio-rs/toasty/issues/924:
53// `#[has_one(pair = <field>)]` was accepted but ignored, so the generated
54// back-reference check still looked for a `BelongsTo` field named after the
55// parent model instead of the configured pair.
56#[driver_test(id(ID))]
57pub async fn has_one_different_field_name(test: &mut Test) -> Result<()> {
58    #[derive(Debug, toasty::Model)]
59    struct Parent {
60        #[key]
61        #[auto]
62        id: ID,
63
64        #[has_one(pair = owner)]
65        other: toasty::HasOne<Child>,
66    }
67
68    #[derive(Debug, toasty::Model)]
69    struct Child {
70        #[key]
71        #[auto]
72        id: ID,
73
74        #[belongs_to(key = owner_id, references = id)]
75        owner: toasty::BelongsTo<Parent>,
76
77        #[unique]
78        owner_id: ID,
79    }
80
81    let mut db = test.setup_db(models!(Parent, Child)).await;
82
83    let parent = Parent::create()
84        .other(Child::create())
85        .exec(&mut db)
86        .await?;
87
88    let child = parent.other().exec(&mut db).await?;
89    assert_eq!(child.owner_id, parent.id);
90
91    let parent_reloaded = child.owner().exec(&mut db).await?;
92    assert_eq!(parent.id, parent_reloaded.id);
93
94    Ok(())
95}