Implement integration tests for web API

This commit is contained in:
Lucien Greathouse 2018-06-05 00:55:46 -07:00
parent 473edad399
commit 9e0e12358c
4 changed files with 63 additions and 15 deletions

View file

@ -8,12 +8,12 @@ use project::Project;
use web::{self, WebConfig}; use web::{self, WebConfig};
use session::Session; use session::Session;
pub fn serve(project_path: &PathBuf, override_port: Option<u64>) { pub fn serve(project_dir: &PathBuf, override_port: Option<u64>) {
let server_id = rand::random::<u64>(); let server_id = rand::random::<u64>();
let project = match Project::load(project_path) { let project = match Project::load(project_dir) {
Ok(v) => { Ok(v) => {
println!("Using project from {}", fs::canonicalize(project_path).unwrap().display()); println!("Using project from {}", fs::canonicalize(project_dir).unwrap().display());
v v
}, },
Err(err) => { Err(err) => {

View file

@ -32,13 +32,13 @@ impl WebConfig {
} }
} }
#[derive(Debug, Serialize)] #[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
struct ServerInfoResponse<'a> { pub struct ServerInfoResponse<'a> {
server_id: &'a str, pub server_id: &'a str,
server_version: &'static str, pub server_version: &'a str,
protocol_version: u64, pub protocol_version: u64,
partitions: &'a HashMap<String, &'a [String]>, pub partitions: HashMap<String, Vec<String>>,
} }
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
@ -92,14 +92,14 @@ impl Server {
let mut partitions = HashMap::new(); let mut partitions = HashMap::new();
for partition in self.config.project.partitions.values() { 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 { Response::json(&ServerInfoResponse {
server_version: self.server_version, server_version: self.server_version,
protocol_version: 2, protocol_version: 2,
server_id: &self.server_id, server_id: &self.server_id,
partitions: &partitions, partitions: partitions,
}) })
}, },

View file

@ -0,0 +1,5 @@
{
"name": "empty",
"servePort": 23456,
"partitions": {}
}

View file

@ -1,11 +1,54 @@
extern crate rouille; extern crate rouille;
extern crate serde_json;
extern crate serde;
extern crate librojo; 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() { use librojo::{
println!("Hello, world!"); 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::<ServerInfoResponse>(&body).unwrap();
assert_eq!(response.server_id, "0");
assert_eq!(response.protocol_version, 2);
assert_eq!(response.partitions, HashMap::new());
}
} }