From 9e0e12358ce1902081afbf51808a66e3305a0921 Mon Sep 17 00:00:00 2001 From: Lucien Greathouse Date: Tue, 5 Jun 2018 00:55:46 -0700 Subject: [PATCH] Implement integration tests for web API --- server/src/commands/serve.rs | 6 ++-- server/src/web.rs | 16 ++++----- server/test-projects/empty/rojo.json | 5 +++ server/tests/web.rs | 51 +++++++++++++++++++++++++--- 4 files changed, 63 insertions(+), 15 deletions(-) create mode 100644 server/test-projects/empty/rojo.json diff --git a/server/src/commands/serve.rs b/server/src/commands/serve.rs index 1b488fd6..497c4ccb 100644 --- a/server/src/commands/serve.rs +++ b/server/src/commands/serve.rs @@ -8,12 +8,12 @@ use project::Project; use web::{self, WebConfig}; use session::Session; -pub fn serve(project_path: &PathBuf, override_port: Option) { +pub fn serve(project_dir: &PathBuf, override_port: Option) { let server_id = rand::random::(); - let project = match Project::load(project_path) { + let project = match Project::load(project_dir) { Ok(v) => { - println!("Using project from {}", fs::canonicalize(project_path).unwrap().display()); + println!("Using project from {}", fs::canonicalize(project_dir).unwrap().display()); v }, Err(err) => { diff --git a/server/src/web.rs b/server/src/web.rs index b4c5260e..f188e831 100644 --- a/server/src/web.rs +++ b/server/src/web.rs @@ -32,13 +32,13 @@ impl WebConfig { } } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -struct ServerInfoResponse<'a> { - server_id: &'a str, - server_version: &'static str, - protocol_version: u64, - partitions: &'a HashMap, +pub struct ServerInfoResponse<'a> { + pub server_id: &'a str, + pub server_version: &'a str, + pub protocol_version: u64, + pub partitions: HashMap>, } #[derive(Debug, Serialize)] @@ -92,14 +92,14 @@ impl Server { let mut partitions = HashMap::new(); for partition in self.config.project.partitions.values() { - partitions.insert(partition.name.clone(), partition.target.as_slice()); + partitions.insert(partition.name.clone(), partition.target.clone()); } Response::json(&ServerInfoResponse { server_version: self.server_version, protocol_version: 2, server_id: &self.server_id, - partitions: &partitions, + partitions: partitions, }) }, diff --git a/server/test-projects/empty/rojo.json b/server/test-projects/empty/rojo.json new file mode 100644 index 00000000..51c7917c --- /dev/null +++ b/server/test-projects/empty/rojo.json @@ -0,0 +1,5 @@ +{ + "name": "empty", + "servePort": 23456, + "partitions": {} +} \ No newline at end of file diff --git a/server/tests/web.rs b/server/tests/web.rs index a2c41894..8d15f3e1 100644 --- a/server/tests/web.rs +++ b/server/tests/web.rs @@ -1,11 +1,54 @@ extern crate rouille; +extern crate serde_json; +extern crate serde; extern crate librojo; -use rouille::{Request, Response}; +use std::collections::HashMap; +use std::path::PathBuf; -use librojo::web::{Server, WebConfig}; +use rouille::Request; -fn main() { - println!("Hello, world!"); +use librojo::{ + session::Session, + project::Project, + web::{Server, WebConfig, ServerInfoResponse}, +}; + +fn get(server: &Server, url: &str) -> String { + let info_request = Request::fake_http("GET", url, vec![], vec![]); + let response = server.handle_request(&info_request); + + assert_eq!(response.status_code, 200); + + let (mut reader, _) = response.data.into_reader_and_size(); + let mut body = String::new(); + reader.read_to_string(&mut body).unwrap(); + + body +} + +#[test] +fn empty() { + let project_path = { + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.push("test-projects/empty"); + path + }; + + let project = Project::load(&project_path).unwrap(); + let mut session = Session::new(project.clone()); + session.start(); + + let web_config = WebConfig::from_session(0, project.serve_port, &session); + let server = Server::new(web_config); + + { + let body = get(&server, "/api/rojo"); + let response = serde_json::from_str::(&body).unwrap(); + + assert_eq!(response.server_id, "0"); + assert_eq!(response.protocol_version, 2); + assert_eq!(response.partitions, HashMap::new()); + } } \ No newline at end of file