Skip to main content

toasty_driver_integration_suite/tests/
relation_belongs_to_inferred.rs

1use crate::prelude::*;
2
3// A bare `#[belongs_to]` infers `key` from the field name (`user` -> `user_id`)
4// and `references` from the target's primary key.
5#[driver_test(id(ID))]
6pub async fn infers_key_and_references(test: &mut Test) -> Result<()> {
7    #[derive(Debug, toasty::Model)]
8    struct User {
9        #[key]
10        #[auto]
11        id: ID,
12
13        #[has_many]
14        posts: toasty::Deferred<Vec<Post>>,
15    }
16
17    #[derive(Debug, toasty::Model)]
18    struct Post {
19        #[key]
20        #[auto]
21        id: ID,
22
23        #[index]
24        user_id: ID,
25
26        #[belongs_to]
27        user: toasty::Deferred<User>,
28
29        title: String,
30    }
31
32    let mut db = test.setup_db(models!(User, Post)).await;
33
34    let user = User::create().exec(&mut db).await?;
35    let post = user.posts().create().title("hello").exec(&mut db).await?;
36
37    assert_eq!(post.user_id, user.id);
38
39    let reloaded = post.user().exec(&mut db).await?;
40    assert_eq!(reloaded.id, user.id);
41
42    Ok(())
43}
44
45// A nullable `#[belongs_to]` also infers `key` and `references`.
46#[driver_test(id(ID))]
47pub async fn infers_optional_relation(test: &mut Test) -> Result<()> {
48    #[derive(Debug, toasty::Model)]
49    struct User {
50        #[key]
51        #[auto]
52        id: ID,
53    }
54
55    #[derive(Debug, toasty::Model)]
56    struct Post {
57        #[key]
58        #[auto]
59        id: ID,
60
61        #[index]
62        user_id: Option<ID>,
63
64        #[belongs_to]
65        user: toasty::Deferred<Option<User>>,
66    }
67
68    let mut db = test.setup_db(models!(User, Post)).await;
69
70    let orphan = toasty::create!(Post {}).exec(&mut db).await?;
71    assert_eq!(orphan.user_id, None);
72
73    let user = User::create().exec(&mut db).await?;
74    let post = toasty::create!(Post { user: &user }).exec(&mut db).await?;
75    assert_eq!(post.user_id, Some(user.id));
76
77    let loaded = post.user().exec(&mut db).await?;
78    assert_struct!(loaded, Some(_ { id: == user.id }));
79
80    Ok(())
81}
82
83// An explicit `key` with `references` omitted still infers the target's primary
84// key.
85#[driver_test(id(ID))]
86pub async fn infers_references_only(test: &mut Test) -> Result<()> {
87    #[derive(Debug, toasty::Model)]
88    struct User {
89        #[key]
90        #[auto]
91        id: ID,
92    }
93
94    #[derive(Debug, toasty::Model)]
95    struct Post {
96        #[key]
97        #[auto]
98        id: ID,
99
100        #[index]
101        owner_id: ID,
102
103        #[belongs_to(key = owner_id)]
104        owner: toasty::Deferred<User>,
105    }
106
107    let mut db = test.setup_db(models!(User, Post)).await;
108
109    let user = User::create().exec(&mut db).await?;
110    let post = toasty::create!(Post { owner: &user }).exec(&mut db).await?;
111
112    assert_eq!(post.owner_id, user.id);
113
114    let reloaded = post.owner().exec(&mut db).await?;
115    assert_eq!(reloaded.id, user.id);
116
117    Ok(())
118}