toasty_driver_integration_suite/tests/
relation_has_many_link_unlink.rs1use crate::prelude::*;
4
5#[driver_test(scenario(crate::scenarios::has_many_nullable_fk))]
6pub async fn remove_add_single_relation_option_belongs_to(test: &mut Test) -> Result<()> {
7 let mut db = setup(test).await;
8
9 let user = User::create()
11 .todos([Todo::create().title("todo")])
12 .todos([Todo::create().title("todo")])
13 .exec(&mut db)
14 .await?;
15
16 let todos: Vec<_> = user.todos().exec(&mut db).await?;
17 assert_eq!(2, todos.len());
18
19 user.todos().remove(&todos[0]).exec(&mut db).await?;
21
22 let todos_reloaded: Vec<_> = user.todos().exec(&mut db).await?;
23 assert_eq!(1, todos_reloaded.len());
24 assert_eq!(todos[1].id, todos_reloaded[0].id);
25
26 assert_err!(user.todos().get_by_id(&mut db, &todos[0].id).await);
28
29 let todo = Todo::get_by_id(&mut db, todos[0].id).await?;
31 assert_none!(todo.user_id);
32
33 let u2 = User::create()
36 .todos([Todo::create().title("todo")])
37 .exec(&mut db)
38 .await?;
39 let u2_todos = u2.todos().exec(&mut db).await?;
40
41 assert_err!(user.todos().remove(&u2_todos[0]).exec(&mut db).await);
43
44 let u2_todo = Todo::get_by_id(&mut db, u2_todos[0].id).await?;
46 assert_eq!(*u2_todo.user_id.as_ref().unwrap(), u2.id);
47
48 user.todos().insert(&todos[0]).exec(&mut db).await?;
50
51 let todos_reloaded: Vec<_> = user.todos().exec(&mut db).await?;
53 assert!(todos_reloaded.iter().any(|t| t.id == todos[0].id));
54 assert_ok!(user.todos().get_by_id(&mut db, todos[0].id).await);
55 Ok(())
56}
57
58#[driver_test(scenario(crate::scenarios::has_many_belongs_to::id_uuid))]
59pub async fn add_remove_single_relation_required_belongs_to(test: &mut Test) -> Result<()> {
60 let mut db = setup(test).await;
61
62 let user = User::create().name("User 1").exec(&mut db).await?;
64
65 let t1 = user.todos().create().title("todo 1").exec(&mut db).await?;
67 let t2 = user.todos().create().title("todo 2").exec(&mut db).await?;
68 let t3 = user.todos().create().title("todo 3").exec(&mut db).await?;
69
70 let ids = vec![t1.id, t2.id, t3.id];
71
72 let todos_reloaded: Vec<_> = user.todos().exec(&mut db).await?;
73 assert_eq!(todos_reloaded.len(), 3);
74
75 for id in ids {
76 assert!(todos_reloaded.iter().any(|t| t.id == id));
77 }
78
79 user.todos()
81 .remove(&todos_reloaded[0])
82 .exec(&mut db)
83 .await?;
84
85 assert_err!(Todo::get_by_id(&mut db, todos_reloaded[0].id).await);
87
88 let todos_reloaded: Vec<_> = user.todos().exec(&mut db).await?;
90 assert_eq!(todos_reloaded.len(), 2);
91 Ok(())
92}
93
94#[driver_test(scenario(crate::scenarios::has_many_belongs_to::id_uuid))]
95pub async fn reassign_relation_required_belongs_to(test: &mut Test) -> Result<()> {
96 let mut db = setup(test).await;
97
98 let u1 = User::create().name("User 1").exec(&mut db).await?;
100 let u2 = User::create().name("User 2").exec(&mut db).await?;
101
102 let t1 = u1.todos().create().title("a todo").exec(&mut db).await?;
104
105 u2.todos().insert(&t1).exec(&mut db).await?;
107
108 assert!(u1.todos().exec(&mut db).await?.is_empty());
110
111 let todos = u2.todos().exec(&mut db).await?;
113 assert_eq!(1, todos.len());
114 assert_eq!(t1.id, todos[0].id);
115 Ok(())
116}
117
118#[driver_test(scenario(crate::scenarios::has_many_nullable_fk))]
119pub async fn add_remove_multiple_relation_option_belongs_to(test: &mut Test) -> Result<()> {
120 let mut db = setup(test).await;
121
122 let user = User::create().exec(&mut db).await?;
124
125 let t1 = Todo::create().title("todo").exec(&mut db).await?;
127 let t2 = Todo::create().title("todo").exec(&mut db).await?;
128 let t3 = Todo::create().title("todo").exec(&mut db).await?;
129
130 let ids = vec![t1.id, t2.id, t3.id];
131
132 user.todos().insert(&t1).exec(&mut db).await?;
134 user.todos().insert(&t2).exec(&mut db).await?;
135 user.todos().insert(&t3).exec(&mut db).await?;
136
137 let todos_reloaded: Vec<_> = user.todos().exec(&mut db).await?;
138 assert_eq!(todos_reloaded.len(), 3);
139
140 for id in ids {
141 assert!(todos_reloaded.iter().any(|t| t.id == id));
142 }
143 Ok(())
144}