media_catalogue/repository/
test.rs1#[cfg(test)]
2mod tests_repository {
3 use crate::domain;
4 use crate::domain::media;
5 use crate::repository::json::JsonRepository;
6 use crate::repository::Error;
7 use crate::repository::Repository;
8 use std::collections::{HashMap, VecDeque};
9 use std::fs;
10 use std::string::String;
11 use std::vec::Vec;
12
13 #[test]
14 fn test_save_a_user() -> Result<(), Error> {
15 let file = format!("{}/test_save_a_user.json", DIRECTORY);
16 let _ = fs::remove_file(file.clone());
17 let mut repo = JsonRepository::new(&file)?;
18 let name = String::from("foo");
19 let medias: HashMap<String, media::Media> = [
20 (
21 String::from("bar"),
22 media::Media {
23 name: String::from("bar"),
24 chapters: Vec::new(),
25 cursor: media::Cursor::default(),
26 source: Some(String::from("alpha")),
27 },
28 ),
29 (
30 String::from("too"),
31 media::Media {
32 name: String::from("too"),
33 chapters: Vec::new(),
34 cursor: media::Cursor::default(),
35 source: None,
36 },
37 ),
38 ]
39 .iter()
40 .cloned()
41 .collect();
42 let user = domain::User::new(name.clone(), medias);
43
44 match repo.save(&user) {
45 Err(e) => panic!("{:?}", e),
46 Ok(_) => assert_eq!(repo.users()[&(name.clone())], user),
47 };
48 Ok(())
49 }
50
51 #[test]
52 fn test_load_a_user() -> Result<(), Error> {
53 let file = format!("{}/test_load_a_user.json", DIRECTORY);
54 let _ = fs::remove_file(file.clone());
55 let mut repo = JsonRepository::new(&file)?;
56 let name = String::from("foo");
57 let user = domain::User::new(name.clone(), HashMap::new());
58 match repo.save(&user) {
59 Ok(_) => match repo.load(&name) {
60 Ok(resp) => assert_eq!(resp, user),
61 Err(e) => panic!("{:?}", e),
62 },
63 Err(e) => panic!("{:?}", e),
64 }
65
66 Ok(())
67 }
68
69 #[test]
70 fn test_load_multiple_users() -> Result<(), Error> {
71 let file = format!("{}/test_load_multiple_users.json", DIRECTORY);
72 let _ = fs::remove_file(file.clone());
73 let mut repo = JsonRepository::new(&file)?;
74
75 let users = vec![
76 domain::User::new(String::from("foo"), HashMap::new()),
77 domain::User::new(String::from("bar"), HashMap::new()),
78 domain::User::new(String::from("too"), HashMap::new()),
79 ];
80
81 for user in users.iter() {
82 if let Err(e) = repo.save(user) {
83 panic!("{:?}", e)
84 }
85 }
86
87 for user in users.iter() {
88 match repo.load(user.name()) {
89 Ok(u) => assert_eq!(u, *user),
90 Err(e) => panic!("{:?}", e),
91 }
92 }
93 Ok(())
94 }
95
96 #[test]
97 fn test_persistance() -> Result<(), Error> {
98 let file = format!("{}/test_persistance.json", DIRECTORY);
99 let _ = fs::remove_file(file.clone());
100 let mut repo = JsonRepository::new(&file.clone())?;
101
102 let users = vec![
103 domain::User::new(String::from("foo"), HashMap::new()),
104 domain::User::new(String::from("bar"), HashMap::new()),
105 domain::User::new(String::from("too"), HashMap::new()),
106 ];
107
108 for user in users.iter() {
109 if let Err(e) = repo.save(user) {
110 panic!("{:?}", e)
111 }
112 }
113
114 let new_repo = JsonRepository::new(&file.clone())?;
115 for user in users.iter() {
116 match new_repo.load(user.name()) {
117 Ok(u) => assert_eq!(u, *user),
118 Err(e) => panic!("{:?}", e),
119 }
120 }
121
122 Ok(())
123 }
124
125 #[test]
126 fn test_update_a_user() -> Result<(), Error> {
127 let file = format!("{}/test_update_a_user.json", DIRECTORY);
128 let _ = fs::remove_file(file.clone());
129 let mut repo = JsonRepository::new(&file)?;
130 let name = String::from("foo");
131 let user = domain::User::new(name.clone(), HashMap::new());
132 let medias: HashMap<String, media::Media> = [
133 (
134 String::from("bar"),
135 media::Media {
136 name: String::from("bar"),
137 chapters: Vec::new(),
138 cursor: media::Cursor::default(),
139 source: None,
140 },
141 ),
142 (
143 String::from("too"),
144 media::Media {
145 name: String::from("too"),
146 chapters: Vec::new(),
147 cursor: media::Cursor {
148 current: None,
149 history: VecDeque::new(),
150 },
151 source: None,
152 },
153 ),
154 ]
155 .iter()
156 .cloned()
157 .collect();
158
159 let _ = repo.save(&user).expect("unable to save");
160 let mut user_modified = user.clone();
161 user_modified.medias = medias;
162 user_modified.name = String::from("bar");
163
164 match repo.update(&user.name, &user_modified) {
165 Ok(_) => match repo.load(&user_modified.name) {
166 Ok(u) => assert_eq!(u, user_modified),
167 Err(e) => panic!("{:?}", e),
168 },
169 Err(e) => panic!("{:?}", e),
170 }
171 Ok(())
172 }
173
174 #[test]
175 fn test_update_a_non_existant_user() -> Result<(), Error> {
176 let file = format!("{}/test_update_a_non_existant_user.json", DIRECTORY);
177 let _ = fs::remove_file(file.clone());
178 let mut repo = JsonRepository::new(&file)?;
179 let name = String::from("foo");
180 let user = domain::User::new(name.clone(), HashMap::new());
181
182 let _ = repo.save(&user).expect("unable to save");
183
184 let mut user_modified = user.clone();
185 user_modified.name = String::from("bar");
186
187 match repo.update(&String::from("do not exist"), &user_modified) {
188 Ok(_) => panic!("should not have been able to update"),
189 Err(_) => return Ok(()),
190 }
191 }
192
193 #[test]
194 fn test_delete_a_user_with_one_user() -> Result<(), Error> {
195 let file = format!("{}/test_delete_a_user_with_one_user.json", DIRECTORY);
196 let _ = fs::remove_file(file.clone());
197 let mut repo = JsonRepository::new(&file)?;
198 let name = String::from("foo");
199 let user = domain::User::new(name.clone(), HashMap::new());
200
201 let _ = repo.save(&user).expect("unable to save");
202 let _ = repo.delete(&user.name).expect("unable to delete a user");
203
204 match repo.size() {
205 Ok(size) => {
206 assert_eq!(size, 0);
207 Ok(())
208 }
209 Err(e) => panic!("{:?}", e),
210 }
211 }
212
213 #[test]
214 fn test_delete_a_user_with_multiple_user() -> Result<(), Error> {
215 let file = format!("{}/test_delete_a_user_with_only_one_user.json", DIRECTORY);
216 let _ = fs::remove_file(file.clone());
217 let mut repo = JsonRepository::new(&file)?;
218 let user_to_delete = String::from("to delete");
219 let users = vec![
220 domain::User::new(user_to_delete.clone(), HashMap::new()),
221 domain::User::new(String::from("bar"), HashMap::new()),
222 domain::User::new(String::from("too"), HashMap::new()),
223 domain::User::new(String::from("zoo"), HashMap::new()),
224 ];
225
226 for user in users.iter() {
227 let _ = repo.save(&user).expect("unable to save");
228 }
229
230 let _ = repo
231 .delete(&user_to_delete)
232 .expect("unable to delete a user");
233
234 match repo.size() {
235 Ok(size) => {
236 assert_eq!(size, users.len() - 1);
237 Ok(())
238 }
239 Err(e) => panic!("{:?}", e),
240 }
241 }
242
243 #[test]
244 fn test_clear_repository_with_users() -> Result<(), Error> {
245 let file = format!("{}/test_clear_repository_with_users.json", DIRECTORY);
246 let _ = fs::remove_file(file.clone());
247 let mut repo = JsonRepository::new(&file)?;
248 let user_to_delete = String::from("to delete");
249 let users = vec![
250 domain::User::new(user_to_delete.clone(), HashMap::new()),
251 domain::User::new(String::from("bar"), HashMap::new()),
252 domain::User::new(String::from("too"), HashMap::new()),
253 domain::User::new(String::from("zoo"), HashMap::new()),
254 ];
255
256 for user in users.iter() {
257 let _ = repo.save(&user).expect("unable to save");
258 }
259
260 match repo.clear() {
261 Err(e) => panic!("{:?}", e),
262 Ok(_) => match repo.size() {
263 Ok(size) => {
264 assert_eq!(size, 0);
265 Ok(())
266 }
267 Err(e) => panic!("{:?}", e),
268 },
269 }
270 }
271 #[test]
272 fn test_clear_empty_repository() -> Result<(), Error> {
273 let file = format!("{}/test_clear_empty_repository.json", DIRECTORY);
274 let _ = fs::remove_file(file.clone());
275 let mut repo = JsonRepository::new(&file)?;
276
277 match repo.clear() {
278 Err(e) => panic!("{:?}", e),
279 Ok(_) => match repo.size() {
280 Ok(size) => {
281 assert_eq!(size, 0);
282 Ok(())
283 }
284 Err(e) => panic!("{:?}", e),
285 },
286 }
287 }
288
289 const DIRECTORY: &str = "./src/repository/test_files";
290}