[#26] Moved lib & bin to own folders; Moved server tests; wrote some readmes

This commit is contained in:
Jef Roosens 2021-04-16 09:18:50 +02:00
parent 4b51ee20ca
commit 45c4a4e257
Signed by: Jef Roosens
GPG key ID: 955C0660072F691F
13 changed files with 46 additions and 31 deletions

6
src/server/catchers.rs Normal file
View 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
View 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();
}

View 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
View 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
View 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);
}