toasty_driver_integration_suite/tests/
relation_belongs_to_inferred.rs1use crate::prelude::*;
2
3#[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#[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#[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}