2020-09-15 15:10:41 +02:00
|
|
|
#[macro_use]
|
|
|
|
extern crate gotham_derive;
|
2020-05-08 18:39:11 +02:00
|
|
|
|
2020-09-15 15:10:41 +02:00
|
|
|
use gotham::{router::builder::*, test::TestServer};
|
2020-05-08 18:39:11 +02:00
|
|
|
use gotham_restful::*;
|
|
|
|
use mime::{APPLICATION_JSON, TEXT_PLAIN};
|
|
|
|
use serde::Deserialize;
|
|
|
|
|
2020-09-15 15:10:41 +02:00
|
|
|
mod util {
|
|
|
|
include!("util/mod.rs");
|
|
|
|
}
|
|
|
|
use util::{test_delete_response, test_get_response, test_post_response, test_put_response};
|
2020-05-08 18:39:11 +02:00
|
|
|
|
|
|
|
#[derive(Resource)]
|
|
|
|
#[resource(read_all, read, search, create, change_all, change, remove_all, remove)]
|
|
|
|
struct FooResource;
|
|
|
|
|
|
|
|
#[derive(Deserialize)]
|
|
|
|
#[cfg_attr(feature = "openapi", derive(OpenapiType))]
|
|
|
|
#[allow(dead_code)]
|
2020-09-15 15:10:41 +02:00
|
|
|
struct FooBody {
|
|
|
|
data: String
|
2020-05-08 18:39:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Deserialize, StateData, StaticResponseExtender)]
|
|
|
|
#[cfg_attr(feature = "openapi", derive(OpenapiType))]
|
|
|
|
#[allow(dead_code)]
|
2020-09-15 15:10:41 +02:00
|
|
|
struct FooSearch {
|
|
|
|
query: String
|
2020-05-08 18:39:11 +02:00
|
|
|
}
|
|
|
|
|
2020-09-15 15:10:41 +02:00
|
|
|
const READ_ALL_RESPONSE: &[u8] = b"1ARwwSPVyOKpJKrYwqGgECPVWDl1BqajAAj7g7WJ3e";
|
2020-05-08 18:39:11 +02:00
|
|
|
#[read_all(FooResource)]
|
2020-09-15 15:10:41 +02:00
|
|
|
fn read_all() -> Raw<&'static [u8]> {
|
2020-05-08 18:39:11 +02:00
|
|
|
Raw::new(READ_ALL_RESPONSE, TEXT_PLAIN)
|
|
|
|
}
|
|
|
|
|
2020-09-15 15:10:41 +02:00
|
|
|
const READ_RESPONSE: &[u8] = b"FEReHoeBKU17X2bBpVAd1iUvktFL43CDu0cFYHdaP9";
|
2020-05-08 18:39:11 +02:00
|
|
|
#[read(FooResource)]
|
2020-09-15 15:10:41 +02:00
|
|
|
fn read(_id: u64) -> Raw<&'static [u8]> {
|
2020-05-08 18:39:11 +02:00
|
|
|
Raw::new(READ_RESPONSE, TEXT_PLAIN)
|
|
|
|
}
|
|
|
|
|
2020-09-15 15:10:41 +02:00
|
|
|
const SEARCH_RESPONSE: &[u8] = b"AWqcQUdBRHXKh3at4u79mdupOAfEbnTcx71ogCVF0E";
|
2020-05-08 18:39:11 +02:00
|
|
|
#[search(FooResource)]
|
2020-09-15 15:10:41 +02:00
|
|
|
fn search(_body: FooSearch) -> Raw<&'static [u8]> {
|
2020-05-08 18:39:11 +02:00
|
|
|
Raw::new(SEARCH_RESPONSE, TEXT_PLAIN)
|
|
|
|
}
|
|
|
|
|
2020-09-15 15:10:41 +02:00
|
|
|
const CREATE_RESPONSE: &[u8] = b"y6POY7wOMAB0jBRBw0FJT7DOpUNbhmT8KdpQPLkI83";
|
2020-05-08 18:39:11 +02:00
|
|
|
#[create(FooResource)]
|
2020-09-15 15:10:41 +02:00
|
|
|
fn create(_body: FooBody) -> Raw<&'static [u8]> {
|
2020-05-08 18:39:11 +02:00
|
|
|
Raw::new(CREATE_RESPONSE, TEXT_PLAIN)
|
|
|
|
}
|
|
|
|
|
2020-09-15 15:10:41 +02:00
|
|
|
const CHANGE_ALL_RESPONSE: &[u8] = b"QlbYg8gHE9OQvvk3yKjXJLTSXlIrg9mcqhfMXJmQkv";
|
2020-05-08 18:39:11 +02:00
|
|
|
#[change_all(FooResource)]
|
2020-09-15 15:10:41 +02:00
|
|
|
fn change_all(_body: FooBody) -> Raw<&'static [u8]> {
|
2020-05-08 18:39:11 +02:00
|
|
|
Raw::new(CHANGE_ALL_RESPONSE, TEXT_PLAIN)
|
|
|
|
}
|
|
|
|
|
2020-09-15 15:10:41 +02:00
|
|
|
const CHANGE_RESPONSE: &[u8] = b"qGod55RUXkT1lgPO8h0uVM6l368O2S0GrwENZFFuRu";
|
2020-05-08 18:39:11 +02:00
|
|
|
#[change(FooResource)]
|
2020-09-15 15:10:41 +02:00
|
|
|
fn change(_id: u64, _body: FooBody) -> Raw<&'static [u8]> {
|
2020-05-08 18:39:11 +02:00
|
|
|
Raw::new(CHANGE_RESPONSE, TEXT_PLAIN)
|
|
|
|
}
|
|
|
|
|
2020-09-15 15:10:41 +02:00
|
|
|
const REMOVE_ALL_RESPONSE: &[u8] = b"Y36kZ749MRk2Nem4BedJABOZiZWPLOtiwLfJlGTwm5";
|
2020-05-08 18:39:11 +02:00
|
|
|
#[remove_all(FooResource)]
|
2020-09-15 15:10:41 +02:00
|
|
|
fn remove_all() -> Raw<&'static [u8]> {
|
2020-05-08 18:39:11 +02:00
|
|
|
Raw::new(REMOVE_ALL_RESPONSE, TEXT_PLAIN)
|
|
|
|
}
|
|
|
|
|
2020-09-15 15:10:41 +02:00
|
|
|
const REMOVE_RESPONSE: &[u8] = b"CwRzBrKErsVZ1N7yeNfjZuUn1MacvgBqk4uPOFfDDq";
|
2020-05-08 18:39:11 +02:00
|
|
|
#[remove(FooResource)]
|
2020-09-15 15:10:41 +02:00
|
|
|
fn remove(_id: u64) -> Raw<&'static [u8]> {
|
2020-05-08 18:39:11 +02:00
|
|
|
Raw::new(REMOVE_RESPONSE, TEXT_PLAIN)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2020-09-15 15:10:41 +02:00
|
|
|
fn sync_methods() {
|
2020-05-08 18:39:11 +02:00
|
|
|
let server = TestServer::new(build_simple_router(|router| {
|
|
|
|
router.resource::<FooResource>("foo");
|
2020-09-15 15:10:41 +02:00
|
|
|
}))
|
|
|
|
.unwrap();
|
|
|
|
|
2020-05-08 18:39:11 +02:00
|
|
|
test_get_response(&server, "http://localhost/foo", READ_ALL_RESPONSE);
|
|
|
|
test_get_response(&server, "http://localhost/foo/1", READ_RESPONSE);
|
|
|
|
test_get_response(&server, "http://localhost/foo/search?query=hello+world", SEARCH_RESPONSE);
|
2020-09-15 15:10:41 +02:00
|
|
|
test_post_response(
|
|
|
|
&server,
|
|
|
|
"http://localhost/foo",
|
|
|
|
r#"{"data":"hello world"}"#,
|
|
|
|
APPLICATION_JSON,
|
|
|
|
CREATE_RESPONSE
|
|
|
|
);
|
|
|
|
test_put_response(
|
|
|
|
&server,
|
|
|
|
"http://localhost/foo",
|
|
|
|
r#"{"data":"hello world"}"#,
|
|
|
|
APPLICATION_JSON,
|
|
|
|
CHANGE_ALL_RESPONSE
|
|
|
|
);
|
|
|
|
test_put_response(
|
|
|
|
&server,
|
|
|
|
"http://localhost/foo/1",
|
|
|
|
r#"{"data":"hello world"}"#,
|
|
|
|
APPLICATION_JSON,
|
|
|
|
CHANGE_RESPONSE
|
|
|
|
);
|
2020-05-08 18:39:11 +02:00
|
|
|
test_delete_response(&server, "http://localhost/foo", REMOVE_ALL_RESPONSE);
|
|
|
|
test_delete_response(&server, "http://localhost/foo/1", REMOVE_RESPONSE);
|
|
|
|
}
|