diff --git a/src/main.rs b/src/main.rs index e0ff447..256950f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -#![feature(plugin)] +#![feature(plugin, custom_derive)] #![plugin(rocket_codegen)] extern crate rocket; diff --git a/src/sentences.rs b/src/sentences.rs index 464ece6..a74a89f 100644 --- a/src/sentences.rs +++ b/src/sentences.rs @@ -2,7 +2,10 @@ extern crate uuid; extern crate xml; use rocket::Response; -use rocket_contrib::Json; +use rocket_contrib::{ + Json, + UUID, +}; use rocket::http::{ Status, ContentType, @@ -13,6 +16,7 @@ use postgres::error::{ }; use self::xml::reader::EventReader; use self::xml::reader::XmlEvent::{Characters, Whitespace}; +use self::uuid::Uuid; use std::io::Cursor; @@ -26,6 +30,11 @@ pub struct Sentence { pub structure: Option, } +#[derive(FromForm)] +struct LastId { + pub id: UUID, +} + #[post("/sentences", format="application/json", data="")] fn create_sentence<'r>( connection: db::DbConnection, @@ -113,12 +122,14 @@ fn create_sentence<'r>( .finalize() } - -#[get("/sentences")] +#[get("/sentences?")] fn get_all_sentences<'r>( connection: db::DbConnection, + last_id: LastId, ) -> Response<'r> { + let real_uuid : Uuid = *last_id.id; + let result = connection.query( r#" SELECT @@ -128,19 +139,19 @@ fn get_all_sentences<'r>( structure::text FROM sentence JOIN language ON (sentence.language_id = language.id) + WHERE sentence.id > $1 ORDER BY added_at, sentence.id - LIMIT 100 + LIMIT 10 "#, - &[], + &[&real_uuid], ); let rows = result.expect("problem while getting sentence"); let mut sentences : Vec = Vec::with_capacity(100); - for row in rows.iter() { let sentence = Sentence { id: row.get(0), diff --git a/tests/test_get_all_sentences.rs b/tests/test_get_all_sentences.rs index e685c39..8564430 100644 --- a/tests/test_get_all_sentences.rs +++ b/tests/test_get_all_sentences.rs @@ -3,7 +3,12 @@ extern crate uuid; #[macro_use] extern crate serde_derive; -use reqwest::StatusCode; +use reqwest::{ + StatusCode, + Url, +}; + +use std::str::FromStr; mod db; @@ -51,7 +56,12 @@ fn test_get_all_sentences_returns_200() { tests_commons::SERVICE_URL, ); - let mut response = reqwest::get(&url).unwrap(); + let url = Url::parse_with_params( + &url, + &[("id", "00000000-0000-0000-0000-000000000000")], + ).unwrap(); + + let mut response = reqwest::get(url).unwrap(); assert_eq!( response.status(), @@ -65,3 +75,88 @@ fn test_get_all_sentences_returns_200() { 2, ); } + +#[test] +fn test_get_paginated_sentences() { + + let connection = db::get_connection(); + db::clear(&connection); + + let english_iso639_3 = "eng"; + db::insert_language( + &connection, + &english_iso639_3, + ); + + let base_url = format!( + "{}/sentences", + tests_commons::SERVICE_URL, + ); + + /* insert multiple sentences with different + content and "consecutives" uuids, + from a full-zeros uuid to x-x-x-x-...13 */ + + let uuid_common = "00000000-0000-0000-0000-0000000000"; + + const SENTENCE_MAX_INDEX: usize = 15; + for id in 1..SENTENCE_MAX_INDEX { + + /* ensure the uuids strings are all valid uuids */ + + const UUIDS_PER_SET: usize = 10; + let uuid = if id >= UUIDS_PER_SET { + format!("{}{}0", uuid_common, id - UUIDS_PER_SET) + } else { + format!("{}0{}", uuid_common, id) + }; + + db::insert_sentence( + &connection, + &uuid::Uuid::from_str(&uuid).unwrap(), + &format!("Sentence {}", id), + &english_iso639_3, + ); + } + + let url = Url::parse_with_params( + &base_url, + &[("id", "00000000-0000-0000-0000-000000000000")], + ).unwrap(); + + let mut response = reqwest::get(url).unwrap(); + + assert_eq!( + response.status(), + StatusCode::Ok, + ); + + let sentences = response.json::().unwrap(); + + assert_eq!( + sentences.len(), + 10, + ); + + let last_sentence = sentences.last().unwrap(); + let last_id = last_sentence.id.unwrap().to_string(); + + let url = Url::parse_with_params( + &base_url, + &[("id", last_id)], + ).unwrap(); + + let mut response = reqwest::get(url).unwrap(); + + assert_eq!( + response.status(), + StatusCode::Ok, + ); + + let sentences = response.json::().unwrap(); + + assert_eq!( + sentences.len(), + 3, + ); +}