use rocket::fairing::AdHoc; use rocket::http::Status; use rocket::local::blocking::Client; use rocket::serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(crate = "rocket::serde")] struct Post { title: String, text: String, } fn test(base: &str, stage: AdHoc) { // Number of posts we're going to create/read/delete. const N: usize = 20; // NOTE: If we had more than one test running concurently that dispatches // DB-accessing requests, we'd need transactions or to serialize all tests. let client = Client::tracked(rocket::build().attach(stage)).unwrap(); // Clear everything from the database. assert_eq!(client.delete(base).dispatch().status(), Status::Ok); assert_eq!( client.get(base).dispatch().into_json::>(), Some(vec![]) ); // Add some random posts, ensure they're listable and readable. for i in 1..=N { let title = format!("My Post - {}", i); let text = format!("Once upon a time, at {}'o clock...", i); let post = Post { title: title.clone(), text: text.clone(), }; // Create a new post. let response = client.post(base).json(&post).dispatch().into_json::(); assert_eq!(response.unwrap(), post); // Ensure the index shows one more post. let list = client.get(base).dispatch().into_json::>().unwrap(); assert_eq!(list.len(), i); // The last in the index is the new one; ensure contents match. let last = list.last().unwrap(); let response = client.get(format!("{}/{}", base, last)).dispatch(); assert_eq!(response.into_json::().unwrap(), post); } // Now delete all of the posts. for _ in 1..=N { // Get a valid ID from the index. let list = client.get(base).dispatch().into_json::>().unwrap(); let id = list.get(0).expect("have post"); // Delete that post. let response = client.delete(format!("{}/{}", base, id)).dispatch(); assert_eq!(response.status(), Status::Ok); } // Ensure they're all gone. let list = client.get(base).dispatch().into_json::>().unwrap(); assert!(list.is_empty()); // Trying to delete should now 404. let response = client.delete(format!("{}/{}", base, 1)).dispatch(); assert_eq!(response.status(), Status::NotFound); } #[test] fn test_sqlx() { test("/sqlx", crate::sqlx::stage()) }