[#26] Moved lib & bin to own folders; Moved server tests; wrote some readmes
This commit is contained in:
parent
4b51ee20ca
commit
45c4a4e257
13 changed files with 46 additions and 31 deletions
6
src/server/catchers.rs
Normal file
6
src/server/catchers.rs
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
use rocket::Request;
|
||||
|
||||
#[catch(404)]
|
||||
pub fn not_found(_: &Request) -> String {
|
||||
String::from("This route doesn't exist or doesn't use the specified parameters.")
|
||||
}
|
||||
48
src/server/main.rs
Normal file
48
src/server/main.rs
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
#![feature(proc_macro_hygiene, decl_macro)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rocket;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
mod catchers;
|
||||
mod routes;
|
||||
|
||||
// Very temporary solution for CORS
|
||||
// https://stackoverflow.com/questions/62412361/how-to-set-up-cors-or-options-for-rocket-rs
|
||||
use rocket::fairing::{Fairing, Info, Kind};
|
||||
use rocket::http::Header;
|
||||
use rocket::{Request, Response};
|
||||
|
||||
pub struct CORS;
|
||||
|
||||
impl Fairing for CORS {
|
||||
fn info(&self) -> Info {
|
||||
Info {
|
||||
name: "Add CORS headers to responses",
|
||||
kind: Kind::Response,
|
||||
}
|
||||
}
|
||||
|
||||
fn on_response(&self, _: &Request, response: &mut Response) {
|
||||
response.set_header(Header::new("Access-Control-Allow-Origin", "*"));
|
||||
response.set_header(Header::new(
|
||||
"Access-Control-Allow-Methods",
|
||||
"POST, GET, PATCH, OPTIONS",
|
||||
));
|
||||
response.set_header(Header::new("Access-Control-Allow-Headers", "*"));
|
||||
response.set_header(Header::new("Access-Control-Allow-Credentials", "true"));
|
||||
}
|
||||
}
|
||||
|
||||
fn rocket() -> rocket::Rocket {
|
||||
rocket::ignite()
|
||||
.attach(CORS)
|
||||
.mount("/ivago", routes::ivago())
|
||||
.register(catchers![catchers::not_found])
|
||||
}
|
||||
|
||||
fn main() {
|
||||
rocket().launch();
|
||||
}
|
||||
38
src/server/routes/ivago.rs
Normal file
38
src/server/routes/ivago.rs
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
use fej::ivago::{get_pickup_times, search_streets, BasicDate, PickupTime, Street};
|
||||
use rocket::http::Status;
|
||||
use rocket_contrib::json::Json;
|
||||
|
||||
/// This route handles the Ivago search endpoint. It returns a list of streets,
|
||||
/// consisting of a street name & a city.
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `search_term` - Search term to use to look for streets
|
||||
#[get("/search?<q>")]
|
||||
pub fn route_search_streets(q: String) -> Result<Json<Vec<Street>>, Status> {
|
||||
Ok(Json(search_streets(q.as_str())?))
|
||||
}
|
||||
|
||||
/// Handles returning of pickup times for a specific address. It returns a list
|
||||
/// of pickup times, containing a date and a description of the trash type.
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `street` - Street to look up
|
||||
/// * `number` - House number in the given street
|
||||
/// * `start_date` - Earliest date that can be returned
|
||||
/// * `end_date` - Latest date that can be returned
|
||||
#[get("/?<street>&<number>&<start_date>&<end_date>")]
|
||||
pub fn route_get_pickup_times(
|
||||
street: Street,
|
||||
number: u32,
|
||||
start_date: BasicDate,
|
||||
end_date: BasicDate,
|
||||
) -> Result<Json<Vec<PickupTime>>, Status> {
|
||||
Ok(Json(get_pickup_times(
|
||||
&street,
|
||||
&number,
|
||||
&start_date.0,
|
||||
&end_date.0,
|
||||
)?))
|
||||
}
|
||||
5
src/server/routes/mod.rs
Normal file
5
src/server/routes/mod.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
mod ivago;
|
||||
|
||||
pub fn ivago() -> Vec<rocket::Route> {
|
||||
routes![ivago::route_search_streets, ivago::route_get_pickup_times]
|
||||
}
|
||||
29
src/server/tests.rs
Normal file
29
src/server/tests.rs
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
/// In here, any non-unit tests are placed.
|
||||
use rocket::http::Status;
|
||||
use rocket::local::Client;
|
||||
|
||||
fn rocket() -> rocket::Rocket {
|
||||
rocket::ignite().mount("/", super::routes::ivago())
|
||||
}
|
||||
|
||||
/// Test 404 response
|
||||
#[test]
|
||||
fn test_404_response() {
|
||||
let client = Client::new(rocket()).expect("valid rocket instance");
|
||||
let response = client.get("/").dispatch();
|
||||
|
||||
assert_eq!(response.status(), Status::NotFound);
|
||||
// TODO add text check as well
|
||||
}
|
||||
|
||||
/// Test 404 on invalid parameters
|
||||
// TODO make this check a 400 instead
|
||||
#[test]
|
||||
fn test_invalid_parameters() {
|
||||
let client = Client::new(rocket()).expect("valid rocket instance");
|
||||
let response = client
|
||||
.get("/?street=astreet+(city)&number=500&start_date=2021-04-04&end_date=2021-04-555")
|
||||
.dispatch();
|
||||
|
||||
assert_eq!(response.status(), Status::NotFound);
|
||||
}
|
||||
Reference in a new issue