extern crate reqwest;
extern crate postgres;
#[macro_use] extern crate serde_json;
#[cfg(test)]
mod test {
use std::fs::File;
use std::io::prelude::*;
use postgres::{Connection, TlsMode};
use std::process::Command;
use std::time::Duration;
use std::thread;
use std::env;
use reqwest;
use serde_json;
#[test]
fn force() {
{
let conn = Connection::connect("postgres://postgres@localhost:5432", TlsMode::None).unwrap();
conn.execute("
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE
pg_stat_activity.datname = 'hecate'
AND pid <> pg_backend_pid();
", &[]).unwrap();
conn.execute("
DROP DATABASE IF EXISTS hecate;
", &[]).unwrap();
conn.execute("
CREATE DATABASE hecate;
", &[]).unwrap();
let conn = Connection::connect("postgres://postgres@localhost:5432/hecate", TlsMode::None).unwrap();
let mut file = File::open("./src/schema.sql").unwrap();
let mut table_sql = String::new();
file.read_to_string(&mut table_sql).unwrap();
conn.batch_execute(&*table_sql).unwrap();
}
let mut server = Command::new("cargo").args(&[
"run",
"--",
"--auth", env::current_dir().unwrap().join("tests/fixtures/auth.closed.json").to_str().unwrap()
]).spawn().unwrap();
thread::sleep(Duration::from_secs(1));
{ let mut resp = reqwest::get("http://localhost:8000/api/user/create?username=ingalls&password=yeaheh&email=ingalls@protonmail.com").unwrap();
assert_eq!(resp.text().unwrap(), "true");
assert!(resp.status().is_success());
}
{ let client = reqwest::Client::new();
let mut resp = client.post("http://localhost:8000/api/data/feature")
.body(r#"{
"type": "Feature",
"force": true,
"message": "Testing Force Option",
"properties": {
"street": "Main Street"
},
"geometry": {
"type": "Point",
"coordinates": [0, 0]
}
}"#)
.basic_auth("ingalls", Some("yeaheh"))
.header(reqwest::header::CONTENT_TYPE, "application/json")
.send()
.unwrap();
assert_eq!(resp.text().unwrap(), "{\"feature\":{\"force\":true,\"geometry\":{\"coordinates\":[0.0,0.0],\"type\":\"Point\"},\"message\":\"Testing Force Option\",\"properties\":{\"street\":\"Main Street\"},\"type\":\"Feature\"},\"id\":null,\"message\":\"Action Required\"}");
assert!(resp.status().is_client_error());
}
{ let client = reqwest::Client::new();
let mut resp = client.post("http://localhost:8000/api/data/feature")
.body(r#"{
"type": "Feature",
"action": "modify",
"force": true,
"message": "Testing Force Option",
"properties": {
"street": "Main Street"
},
"geometry": {
"type": "Point",
"coordinates": [0, 0]
}
}"#)
.basic_auth("ingalls", Some("yeaheh"))
.header(reqwest::header::CONTENT_TYPE, "application/json")
.send()
.unwrap();
assert_eq!(resp.text().unwrap(), "{\"feature\":{\"action\":\"modify\",\"force\":true,\"geometry\":{\"coordinates\":[0.0,0.0],\"type\":\"Point\"},\"message\":\"Testing Force Option\",\"properties\":{\"street\":\"Main Street\"},\"type\":\"Feature\"},\"id\":null,\"message\":\"force can only be used on create\"}");
assert!(resp.status().is_client_error());
}
{ let client = reqwest::Client::new();
let mut resp = client.post("http://localhost:8000/api/data/feature")
.body(r#"{
"type": "Feature",
"action": "create",
"force": true,
"message": "Testing Force Option",
"properties": {
"street": "Main Street"
},
"geometry": {
"type": "Point",
"coordinates": [0, 0]
}
}"#)
.basic_auth("ingalls", Some("yeaheh"))
.header(reqwest::header::CONTENT_TYPE, "application/json")
.send()
.unwrap();
assert_eq!(resp.text().unwrap(), "{\"feature\":{\"action\":\"create\",\"force\":true,\"geometry\":{\"coordinates\":[0.0,0.0],\"type\":\"Point\"},\"message\":\"Testing Force Option\",\"properties\":{\"street\":\"Main Street\"},\"type\":\"Feature\"},\"id\":null,\"message\":\"force can only be used with a key value\"}");
assert!(resp.status().is_client_error());
}
{ let client = reqwest::Client::new();
let mut resp = client.post("http://localhost:8000/api/data/feature")
.body(r#"{
"key": "1",
"type": "Feature",
"action": "create",
"force": true,
"message": "Testing Force Option",
"properties": {
"street": "Main Street"
},
"geometry": {
"type": "Point",
"coordinates": [0, 0]
}
}"#)
.basic_auth("ingalls", Some("yeaheh"))
.header(reqwest::header::CONTENT_TYPE, "application/json")
.send()
.unwrap();
assert_eq!(resp.text().unwrap(), "true");
assert!(resp.status().is_success());
}
{
let client = reqwest::Client::new();
let mut resp = client.get("http://localhost:8000/api/data/feature/1")
.basic_auth("ingalls", Some("yeaheh"))
.send()
.unwrap();
let json_body: serde_json::value::Value = resp.json().unwrap();
assert_eq!(json_body, json!({
"id": 1,
"key": "1",
"type": "Feature",
"version": 1,
"properties": {
"street": "Main Street"
},
"geometry": {
"type": "Point",
"coordinates": [ 0.0, 0.0 ]
}
}));
assert!(resp.status().is_success());
}
{ let client = reqwest::Client::new();
let mut resp = client.post("http://localhost:8000/api/data/feature")
.body(r#"{
"key": "1",
"type": "Feature",
"action": "create",
"force": true,
"message": "Testing Force Option",
"properties": {
"street": "I AM A NEW FEAT"
},
"geometry": {
"type": "Point",
"coordinates": [1, 1]
}
}"#)
.basic_auth("ingalls", Some("yeaheh"))
.header(reqwest::header::CONTENT_TYPE, "application/json")
.send()
.unwrap();
assert_eq!(resp.text().unwrap(), "true");
assert!(resp.status().is_success());
}
{
let client = reqwest::Client::new();
let mut resp = client.get("http://localhost:8000/api/data/feature/1")
.basic_auth("ingalls", Some("yeaheh"))
.send()
.unwrap();
let json_body: serde_json::value::Value = resp.json().unwrap();
assert_eq!(json_body, json!({
"id": 1,
"key": "1",
"type": "Feature",
"version": 2,
"properties": {
"street": "I AM A NEW FEAT"
},
"geometry": {
"type": "Point",
"coordinates": [ 1.0, 1.0 ]
}
}));
assert!(resp.status().is_success());
}
{ let client = reqwest::Client::new();
let mut resp = client.post("http://localhost:8000/api/data/features")
.body(r#"{
"type": "FeatureCollection",
"message": "Testing Force Option",
"features": [{
"key": "1",
"type": "Feature",
"action": "create",
"force": true,
"properties": {
"street": "I AM AN EVEN NEWER FEAT"
},
"geometry": {
"type": "Point",
"coordinates": [1, 1]
}
}]
}"#)
.basic_auth("ingalls", Some("yeaheh"))
.header(reqwest::header::CONTENT_TYPE, "application/json")
.send()
.unwrap();
assert_eq!(resp.text().unwrap(), "true");
assert!(resp.status().is_success());
}
{
let client = reqwest::Client::new();
let mut resp = client.get("http://localhost:8000/api/data/feature/1")
.basic_auth("ingalls", Some("yeaheh"))
.send()
.unwrap();
let json_body: serde_json::value::Value = resp.json().unwrap();
assert_eq!(json_body, json!({
"id": 1,
"key": "1",
"type": "Feature",
"version": 3,
"properties": {
"street": "I AM AN EVEN NEWER FEAT"
},
"geometry": {
"type": "Point",
"coordinates": [ 1.0, 1.0 ]
}
}));
assert!(resp.status().is_success());
}
{ let client = reqwest::Client::new();
let mut resp = client.post("http://localhost:8000/api/data/features")
.body(r#"{
"type": "FeatureCollection",
"message": "Testing Force Option",
"features": [{
"type": "Feature",
"action": "create",
"force": true,
"properties": {
"street": "I AM AN EVEN NEWER FEAT"
},
"geometry": {
"type": "Point",
"coordinates": [1, 1]
}
}]
}"#)
.basic_auth("ingalls", Some("yeaheh"))
.header(reqwest::header::CONTENT_TYPE, "application/json")
.send()
.unwrap();
assert_eq!(resp.text().unwrap(), "{\"feature\":{\"action\":\"create\",\"force\":true,\"geometry\":{\"coordinates\":[1.0,1.0],\"type\":\"Point\"},\"properties\":{\"street\":\"I AM AN EVEN NEWER FEAT\"},\"type\":\"Feature\"},\"id\":null,\"message\":\"force can only be used with a key value\"}");
assert!(resp.status().is_client_error());
}
server.kill().unwrap();
}
}