mirror of
https://gitlab.com/msrd0/gotham-restful.git
synced 2025-02-23 04:52:28 +00:00
a whole bunch of tests for the method macros
This commit is contained in:
parent
4bf0bd7b09
commit
e05f9bb963
23 changed files with 473 additions and 28 deletions
|
@ -122,13 +122,13 @@ pub fn change(attr : TokenStream, item : TokenStream) -> TokenStream
|
||||||
}
|
}
|
||||||
|
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn delete_all(attr : TokenStream, item : TokenStream) -> TokenStream
|
pub fn remove_all(attr : TokenStream, item : TokenStream) -> TokenStream
|
||||||
{
|
{
|
||||||
expand_macro(attr, item, |attr, item| expand_method(Method::RemoveAll, attr, item))
|
expand_macro(attr, item, |attr, item| expand_method(Method::RemoveAll, attr, item))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn delete(attr : TokenStream, item : TokenStream) -> TokenStream
|
pub fn remove(attr : TokenStream, item : TokenStream) -> TokenStream
|
||||||
{
|
{
|
||||||
expand_macro(attr, item, |attr, item| expand_method(Method::Remove, attr, item))
|
expand_macro(attr, item, |attr, item| expand_method(Method::Remove, attr, item))
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,13 +150,18 @@ impl MethodArgumentType
|
||||||
matches!(self, Self::AuthStatus(_) | Self::AuthStatusRef(_))
|
matches!(self, Self::AuthStatus(_) | Self::AuthStatusRef(_))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn quote_ty(&self) -> Option<TokenStream>
|
fn ty(&self) -> Option<&Type>
|
||||||
{
|
{
|
||||||
match self {
|
match self {
|
||||||
Self::MethodArg(ty) | Self::DatabaseConnection(ty) | Self::AuthStatus(ty) | Self::AuthStatusRef(ty) => Some(quote!(#ty)),
|
Self::MethodArg(ty) | Self::DatabaseConnection(ty) | Self::AuthStatus(ty) | Self::AuthStatusRef(ty) => Some(ty),
|
||||||
_ => None
|
_ => None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn quote_ty(&self) -> Option<TokenStream>
|
||||||
|
{
|
||||||
|
self.ty().map(|ty| quote!(#ty))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct MethodArgument
|
struct MethodArgument
|
||||||
|
@ -279,6 +284,10 @@ pub fn expand_method(method : Method, mut attrs : AttributeArgs, fun : ItemFn) -
|
||||||
let krate = super::krate();
|
let krate = super::krate();
|
||||||
|
|
||||||
// parse attributes
|
// parse attributes
|
||||||
|
if attrs.len() < 1
|
||||||
|
{
|
||||||
|
return Err(Error::new(Span::call_site(), "Missing Resource struct. Example: #[read_all(MyResource)]"));
|
||||||
|
}
|
||||||
let resource_path = match attrs.remove(0) {
|
let resource_path = match attrs.remove(0) {
|
||||||
NestedMeta::Meta(Meta::Path(path)) => path,
|
NestedMeta::Meta(Meta::Path(path)) => path,
|
||||||
p => return Err(Error::new(p.span(), "Expected name of the Resource struct this method belongs to"))
|
p => return Err(Error::new(p.span(), "Expected name of the Resource struct this method belongs to"))
|
||||||
|
@ -372,7 +381,7 @@ pub fn expand_method(method : Method, mut attrs : AttributeArgs, fun : ItemFn) -
|
||||||
{
|
{
|
||||||
if let Some(arg) = args.iter().find(|arg| (*arg).ty.is_state_ref())
|
if let Some(arg) = args.iter().find(|arg| (*arg).ty.is_state_ref())
|
||||||
{
|
{
|
||||||
return Err(Error::new(arg.span(), "async fn must not take &State as an argument as State is not Sync"));
|
return Err(Error::new(arg.span(), "async fn must not take &State as an argument as State is not Sync, consider boxing"));
|
||||||
}
|
}
|
||||||
block = quote!(#block.await);
|
block = quote!(#block.await);
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,14 +76,14 @@ fn update(id : u64, body : User)
|
||||||
info!("Change User {} to {}", id, body.username);
|
info!("Change User {} to {}", id, body.username);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[delete_all(Users)]
|
#[remove_all(Users)]
|
||||||
fn delete_all()
|
fn remove_all()
|
||||||
{
|
{
|
||||||
info!("Delete all Users");
|
info!("Delete all Users");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[delete(Users)]
|
#[remove(Users)]
|
||||||
fn delete(id : u64)
|
fn remove(id : u64)
|
||||||
{
|
{
|
||||||
info!("Delete User {}", id);
|
info!("Delete User {}", id);
|
||||||
}
|
}
|
||||||
|
|
106
tests/async_methods.rs
Normal file
106
tests/async_methods.rs
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
#[macro_use] extern crate gotham_derive;
|
||||||
|
|
||||||
|
use gotham::{
|
||||||
|
router::builder::*,
|
||||||
|
test::TestServer
|
||||||
|
};
|
||||||
|
use gotham_restful::*;
|
||||||
|
use mime::{APPLICATION_JSON, TEXT_PLAIN};
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
mod util { include!("util/mod.rs"); }
|
||||||
|
use util::{test_get_response, test_post_response, test_put_response, test_delete_response};
|
||||||
|
|
||||||
|
|
||||||
|
#[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)]
|
||||||
|
struct FooBody
|
||||||
|
{
|
||||||
|
data : String
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, StateData, StaticResponseExtender)]
|
||||||
|
#[cfg_attr(feature = "openapi", derive(OpenapiType))]
|
||||||
|
#[allow(dead_code)]
|
||||||
|
struct FooSearch
|
||||||
|
{
|
||||||
|
query : String
|
||||||
|
}
|
||||||
|
|
||||||
|
const READ_ALL_RESPONSE : &[u8] = b"1ARwwSPVyOKpJKrYwqGgECPVWDl1BqajAAj7g7WJ3e";
|
||||||
|
#[read_all(FooResource)]
|
||||||
|
async fn read_all() -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(READ_ALL_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const READ_RESPONSE : &[u8] = b"FEReHoeBKU17X2bBpVAd1iUvktFL43CDu0cFYHdaP9";
|
||||||
|
#[read(FooResource)]
|
||||||
|
async fn read(_id : u64) -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(READ_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const SEARCH_RESPONSE : &[u8] = b"AWqcQUdBRHXKh3at4u79mdupOAfEbnTcx71ogCVF0E";
|
||||||
|
#[search(FooResource)]
|
||||||
|
async fn search(_body : FooSearch) -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(SEARCH_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const CREATE_RESPONSE : &[u8] = b"y6POY7wOMAB0jBRBw0FJT7DOpUNbhmT8KdpQPLkI83";
|
||||||
|
#[create(FooResource)]
|
||||||
|
async fn create(_body : FooBody) -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(CREATE_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const CHANGE_ALL_RESPONSE : &[u8] = b"QlbYg8gHE9OQvvk3yKjXJLTSXlIrg9mcqhfMXJmQkv";
|
||||||
|
#[change_all(FooResource)]
|
||||||
|
async fn change_all(_body : FooBody) -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(CHANGE_ALL_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const CHANGE_RESPONSE : &[u8] = b"qGod55RUXkT1lgPO8h0uVM6l368O2S0GrwENZFFuRu";
|
||||||
|
#[change(FooResource)]
|
||||||
|
async fn change(_id : u64, _body : FooBody) -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(CHANGE_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const REMOVE_ALL_RESPONSE : &[u8] = b"Y36kZ749MRk2Nem4BedJABOZiZWPLOtiwLfJlGTwm5";
|
||||||
|
#[remove_all(FooResource)]
|
||||||
|
async fn remove_all() -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(REMOVE_ALL_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const REMOVE_RESPONSE : &[u8] = b"CwRzBrKErsVZ1N7yeNfjZuUn1MacvgBqk4uPOFfDDq";
|
||||||
|
#[remove(FooResource)]
|
||||||
|
async fn remove(_id : u64) -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(REMOVE_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn async_methods()
|
||||||
|
{
|
||||||
|
let server = TestServer::new(build_simple_router(|router| {
|
||||||
|
router.resource::<FooResource>("foo");
|
||||||
|
})).unwrap();
|
||||||
|
|
||||||
|
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);
|
||||||
|
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);
|
||||||
|
test_delete_response(&server, "http://localhost/foo", REMOVE_ALL_RESPONSE);
|
||||||
|
test_delete_response(&server, "http://localhost/foo/1", REMOVE_RESPONSE);
|
||||||
|
}
|
|
@ -1,7 +1,3 @@
|
||||||
mod custom_request_body
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
use gotham::{
|
use gotham::{
|
||||||
hyper::header::CONTENT_TYPE,
|
hyper::header::CONTENT_TYPE,
|
||||||
router::builder::*,
|
router::builder::*,
|
||||||
|
@ -10,6 +6,7 @@ use gotham::{
|
||||||
use gotham_restful::*;
|
use gotham_restful::*;
|
||||||
use mime::TEXT_PLAIN;
|
use mime::TEXT_PLAIN;
|
||||||
|
|
||||||
|
|
||||||
const RESPONSE : &[u8] = b"This is the only valid response.";
|
const RESPONSE : &[u8] = b"This is the only valid response.";
|
||||||
|
|
||||||
#[derive(Resource)]
|
#[derive(Resource)]
|
||||||
|
@ -30,7 +27,7 @@ fn create(body : Foo) -> Raw<Vec<u8>> {
|
||||||
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test()
|
fn custom_request_body()
|
||||||
{
|
{
|
||||||
let server = TestServer::new(build_simple_router(|router| {
|
let server = TestServer::new(build_simple_router(|router| {
|
||||||
router.resource::<FooResource>("foo");
|
router.resource::<FooResource>("foo");
|
||||||
|
@ -44,6 +41,3 @@ fn test()
|
||||||
let body : &[u8] = res.as_ref();
|
let body : &[u8] = res.as_ref();
|
||||||
assert_eq!(body, RESPONSE);
|
assert_eq!(body, RESPONSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -10,6 +10,11 @@ use gotham::{
|
||||||
use gotham_restful::*;
|
use gotham_restful::*;
|
||||||
use mime::TEXT_PLAIN;
|
use mime::TEXT_PLAIN;
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
mod util { include!("util/mod.rs"); }
|
||||||
|
use util::test_get_response;
|
||||||
|
|
||||||
|
|
||||||
const RESPONSE : &[u8] = b"This is the only valid response.";
|
const RESPONSE : &[u8] = b"This is the only valid response.";
|
||||||
|
|
||||||
#[derive(Resource)]
|
#[derive(Resource)]
|
||||||
|
@ -23,13 +28,6 @@ fn read_all() -> Raw<&'static [u8]>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn test_response(server : &TestServer, path : &str)
|
|
||||||
{
|
|
||||||
let res = server.client().get(path).perform().unwrap().read_body().unwrap();
|
|
||||||
let body : &[u8] = res.as_ref();
|
|
||||||
assert_eq!(body, RESPONSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test()
|
fn test()
|
||||||
{
|
{
|
||||||
|
@ -51,10 +49,10 @@ fn test()
|
||||||
});
|
});
|
||||||
})).unwrap();
|
})).unwrap();
|
||||||
|
|
||||||
test_response(&server, "http://localhost/foo1");
|
test_get_response(&server, "http://localhost/foo1", RESPONSE);
|
||||||
test_response(&server, "http://localhost/bar/foo2");
|
test_get_response(&server, "http://localhost/bar/foo2", RESPONSE);
|
||||||
test_response(&server, "http://localhost/bar/baz/foo3");
|
test_get_response(&server, "http://localhost/bar/baz/foo3", RESPONSE);
|
||||||
test_response(&server, "http://localhost/foo4");
|
test_get_response(&server, "http://localhost/foo4", RESPONSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
106
tests/sync_methods.rs
Normal file
106
tests/sync_methods.rs
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
#[macro_use] extern crate gotham_derive;
|
||||||
|
|
||||||
|
use gotham::{
|
||||||
|
router::builder::*,
|
||||||
|
test::TestServer
|
||||||
|
};
|
||||||
|
use gotham_restful::*;
|
||||||
|
use mime::{APPLICATION_JSON, TEXT_PLAIN};
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
mod util { include!("util/mod.rs"); }
|
||||||
|
use util::{test_get_response, test_post_response, test_put_response, test_delete_response};
|
||||||
|
|
||||||
|
|
||||||
|
#[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)]
|
||||||
|
struct FooBody
|
||||||
|
{
|
||||||
|
data : String
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, StateData, StaticResponseExtender)]
|
||||||
|
#[cfg_attr(feature = "openapi", derive(OpenapiType))]
|
||||||
|
#[allow(dead_code)]
|
||||||
|
struct FooSearch
|
||||||
|
{
|
||||||
|
query : String
|
||||||
|
}
|
||||||
|
|
||||||
|
const READ_ALL_RESPONSE : &[u8] = b"1ARwwSPVyOKpJKrYwqGgECPVWDl1BqajAAj7g7WJ3e";
|
||||||
|
#[read_all(FooResource)]
|
||||||
|
fn read_all() -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(READ_ALL_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const READ_RESPONSE : &[u8] = b"FEReHoeBKU17X2bBpVAd1iUvktFL43CDu0cFYHdaP9";
|
||||||
|
#[read(FooResource)]
|
||||||
|
fn read(_id : u64) -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(READ_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const SEARCH_RESPONSE : &[u8] = b"AWqcQUdBRHXKh3at4u79mdupOAfEbnTcx71ogCVF0E";
|
||||||
|
#[search(FooResource)]
|
||||||
|
fn search(_body : FooSearch) -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(SEARCH_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const CREATE_RESPONSE : &[u8] = b"y6POY7wOMAB0jBRBw0FJT7DOpUNbhmT8KdpQPLkI83";
|
||||||
|
#[create(FooResource)]
|
||||||
|
fn create(_body : FooBody) -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(CREATE_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const CHANGE_ALL_RESPONSE : &[u8] = b"QlbYg8gHE9OQvvk3yKjXJLTSXlIrg9mcqhfMXJmQkv";
|
||||||
|
#[change_all(FooResource)]
|
||||||
|
fn change_all(_body : FooBody) -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(CHANGE_ALL_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const CHANGE_RESPONSE : &[u8] = b"qGod55RUXkT1lgPO8h0uVM6l368O2S0GrwENZFFuRu";
|
||||||
|
#[change(FooResource)]
|
||||||
|
fn change(_id : u64, _body : FooBody) -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(CHANGE_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const REMOVE_ALL_RESPONSE : &[u8] = b"Y36kZ749MRk2Nem4BedJABOZiZWPLOtiwLfJlGTwm5";
|
||||||
|
#[remove_all(FooResource)]
|
||||||
|
fn remove_all() -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(REMOVE_ALL_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
const REMOVE_RESPONSE : &[u8] = b"CwRzBrKErsVZ1N7yeNfjZuUn1MacvgBqk4uPOFfDDq";
|
||||||
|
#[remove(FooResource)]
|
||||||
|
fn remove(_id : u64) -> Raw<&'static [u8]>
|
||||||
|
{
|
||||||
|
Raw::new(REMOVE_RESPONSE, TEXT_PLAIN)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn sync_methods()
|
||||||
|
{
|
||||||
|
let server = TestServer::new(build_simple_router(|router| {
|
||||||
|
router.resource::<FooResource>("foo");
|
||||||
|
})).unwrap();
|
||||||
|
|
||||||
|
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);
|
||||||
|
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);
|
||||||
|
test_delete_response(&server, "http://localhost/foo", REMOVE_ALL_RESPONSE);
|
||||||
|
test_delete_response(&server, "http://localhost/foo/1", REMOVE_RESPONSE);
|
||||||
|
}
|
|
@ -8,4 +8,11 @@ fn trybuild_ui()
|
||||||
|
|
||||||
// always enabled
|
// always enabled
|
||||||
t.compile_fail("tests/ui/from_body_enum.rs");
|
t.compile_fail("tests/ui/from_body_enum.rs");
|
||||||
|
t.compile_fail("tests/ui/method_async_state.rs");
|
||||||
|
t.compile_fail("tests/ui/method_for_unknown_resource.rs");
|
||||||
|
t.compile_fail("tests/ui/method_no_resource.rs");
|
||||||
|
t.compile_fail("tests/ui/method_self.rs");
|
||||||
|
t.compile_fail("tests/ui/method_too_few_args.rs");
|
||||||
|
t.compile_fail("tests/ui/method_too_many_args.rs");
|
||||||
|
t.compile_fail("tests/ui/method_unsafe.rs");
|
||||||
}
|
}
|
||||||
|
|
15
tests/ui/method_async_state.rs
Normal file
15
tests/ui/method_async_state.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#[macro_use] extern crate gotham_restful;
|
||||||
|
use gotham_restful::State;
|
||||||
|
|
||||||
|
#[derive(Resource)]
|
||||||
|
#[resource(read_all)]
|
||||||
|
struct FooResource;
|
||||||
|
|
||||||
|
#[read_all(FooResource)]
|
||||||
|
async fn read_all(state : &State)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main()
|
||||||
|
{
|
||||||
|
}
|
21
tests/ui/method_async_state.stderr
Normal file
21
tests/ui/method_async_state.stderr
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
error: async fn must not take &State as an argument as State is not Sync, consider boxing
|
||||||
|
--> $DIR/method_async_state.rs:9:19
|
||||||
|
|
|
||||||
|
9 | async fn read_all(state : &State)
|
||||||
|
| ^^^^^
|
||||||
|
|
||||||
|
error[E0433]: failed to resolve: use of undeclared type or module `_gotham_restful_resource_foo_resource_method_read_all`
|
||||||
|
--> $DIR/method_async_state.rs:4:10
|
||||||
|
|
|
||||||
|
4 | #[derive(Resource)]
|
||||||
|
| ^^^^^^^^ use of undeclared type or module `_gotham_restful_resource_foo_resource_method_read_all`
|
||||||
|
|
|
||||||
|
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
warning: unused import: `gotham_restful::State`
|
||||||
|
--> $DIR/method_async_state.rs:2:5
|
||||||
|
|
|
||||||
|
2 | use gotham_restful::State;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: `#[warn(unused_imports)]` on by default
|
10
tests/ui/method_for_unknown_resource.rs
Normal file
10
tests/ui/method_for_unknown_resource.rs
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#[macro_use] extern crate gotham_restful;
|
||||||
|
|
||||||
|
#[read_all(UnknownResource)]
|
||||||
|
fn read_all()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main()
|
||||||
|
{
|
||||||
|
}
|
5
tests/ui/method_for_unknown_resource.stderr
Normal file
5
tests/ui/method_for_unknown_resource.stderr
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
error[E0412]: cannot find type `UnknownResource` in this scope
|
||||||
|
--> $DIR/method_for_unknown_resource.rs:3:12
|
||||||
|
|
|
||||||
|
3 | #[read_all(UnknownResource)]
|
||||||
|
| ^^^^^^^^^^^^^^^ not found in this scope
|
14
tests/ui/method_no_resource.rs
Normal file
14
tests/ui/method_no_resource.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#[macro_use] extern crate gotham_restful;
|
||||||
|
|
||||||
|
#[derive(Resource)]
|
||||||
|
#[resource(read_all)]
|
||||||
|
struct FooResource;
|
||||||
|
|
||||||
|
#[read_all]
|
||||||
|
fn read_all()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main()
|
||||||
|
{
|
||||||
|
}
|
15
tests/ui/method_no_resource.stderr
Normal file
15
tests/ui/method_no_resource.stderr
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
error: Missing Resource struct. Example: #[read_all(MyResource)]
|
||||||
|
--> $DIR/method_no_resource.rs:7:1
|
||||||
|
|
|
||||||
|
7 | #[read_all]
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
error[E0433]: failed to resolve: use of undeclared type or module `_gotham_restful_resource_foo_resource_method_read_all`
|
||||||
|
--> $DIR/method_no_resource.rs:3:10
|
||||||
|
|
|
||||||
|
3 | #[derive(Resource)]
|
||||||
|
| ^^^^^^^^ use of undeclared type or module `_gotham_restful_resource_foo_resource_method_read_all`
|
||||||
|
|
|
||||||
|
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
14
tests/ui/method_self.rs
Normal file
14
tests/ui/method_self.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#[macro_use] extern crate gotham_restful;
|
||||||
|
|
||||||
|
#[derive(Resource)]
|
||||||
|
#[resource(read_all)]
|
||||||
|
struct FooResource;
|
||||||
|
|
||||||
|
#[read_all(FooResource)]
|
||||||
|
fn read_all(self)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main()
|
||||||
|
{
|
||||||
|
}
|
13
tests/ui/method_self.stderr
Normal file
13
tests/ui/method_self.stderr
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
error: Didn't expect self parameter
|
||||||
|
--> $DIR/method_self.rs:8:13
|
||||||
|
|
|
||||||
|
8 | fn read_all(self)
|
||||||
|
| ^^^^
|
||||||
|
|
||||||
|
error[E0433]: failed to resolve: use of undeclared type or module `_gotham_restful_resource_foo_resource_method_read_all`
|
||||||
|
--> $DIR/method_self.rs:3:10
|
||||||
|
|
|
||||||
|
3 | #[derive(Resource)]
|
||||||
|
| ^^^^^^^^ use of undeclared type or module `_gotham_restful_resource_foo_resource_method_read_all`
|
||||||
|
|
|
||||||
|
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
14
tests/ui/method_too_few_args.rs
Normal file
14
tests/ui/method_too_few_args.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#[macro_use] extern crate gotham_restful;
|
||||||
|
|
||||||
|
#[derive(Resource)]
|
||||||
|
#[resource(read)]
|
||||||
|
struct FooResource;
|
||||||
|
|
||||||
|
#[read(FooResource)]
|
||||||
|
fn read()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main()
|
||||||
|
{
|
||||||
|
}
|
13
tests/ui/method_too_few_args.stderr
Normal file
13
tests/ui/method_too_few_args.stderr
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
error: Too few arguments
|
||||||
|
--> $DIR/method_too_few_args.rs:8:4
|
||||||
|
|
|
||||||
|
8 | fn read()
|
||||||
|
| ^^^^
|
||||||
|
|
||||||
|
error[E0433]: failed to resolve: use of undeclared type or module `_gotham_restful_resource_foo_resource_method_read`
|
||||||
|
--> $DIR/method_too_few_args.rs:3:10
|
||||||
|
|
|
||||||
|
3 | #[derive(Resource)]
|
||||||
|
| ^^^^^^^^ use of undeclared type or module `_gotham_restful_resource_foo_resource_method_read`
|
||||||
|
|
|
||||||
|
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
14
tests/ui/method_too_many_args.rs
Normal file
14
tests/ui/method_too_many_args.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#[macro_use] extern crate gotham_restful;
|
||||||
|
|
||||||
|
#[derive(Resource)]
|
||||||
|
#[resource(read_all)]
|
||||||
|
struct FooResource;
|
||||||
|
|
||||||
|
#[read_all(FooResource)]
|
||||||
|
fn read_all(_id : u64)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main()
|
||||||
|
{
|
||||||
|
}
|
13
tests/ui/method_too_many_args.stderr
Normal file
13
tests/ui/method_too_many_args.stderr
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
error: Too many arguments
|
||||||
|
--> $DIR/method_too_many_args.rs:8:13
|
||||||
|
|
|
||||||
|
8 | fn read_all(_id : u64)
|
||||||
|
| ^^^
|
||||||
|
|
||||||
|
error[E0433]: failed to resolve: use of undeclared type or module `_gotham_restful_resource_foo_resource_method_read_all`
|
||||||
|
--> $DIR/method_too_many_args.rs:3:10
|
||||||
|
|
|
||||||
|
3 | #[derive(Resource)]
|
||||||
|
| ^^^^^^^^ use of undeclared type or module `_gotham_restful_resource_foo_resource_method_read_all`
|
||||||
|
|
|
||||||
|
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
14
tests/ui/method_unsafe.rs
Normal file
14
tests/ui/method_unsafe.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#[macro_use] extern crate gotham_restful;
|
||||||
|
|
||||||
|
#[derive(Resource)]
|
||||||
|
#[resource(read_all)]
|
||||||
|
struct FooResource;
|
||||||
|
|
||||||
|
#[read_all(FooResource)]
|
||||||
|
unsafe fn read_all()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main()
|
||||||
|
{
|
||||||
|
}
|
13
tests/ui/method_unsafe.stderr
Normal file
13
tests/ui/method_unsafe.stderr
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
error: Resource methods must not be unsafe
|
||||||
|
--> $DIR/method_unsafe.rs:8:1
|
||||||
|
|
|
||||||
|
8 | unsafe fn read_all()
|
||||||
|
| ^^^^^^
|
||||||
|
|
||||||
|
error[E0433]: failed to resolve: use of undeclared type or module `_gotham_restful_resource_foo_resource_method_read_all`
|
||||||
|
--> $DIR/method_unsafe.rs:3:10
|
||||||
|
|
|
||||||
|
3 | #[derive(Resource)]
|
||||||
|
| ^^^^^^^^ use of undeclared type or module `_gotham_restful_resource_foo_resource_method_read_all`
|
||||||
|
|
|
||||||
|
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
37
tests/util/mod.rs
Normal file
37
tests/util/mod.rs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
use gotham::{
|
||||||
|
hyper::Body,
|
||||||
|
test::TestServer
|
||||||
|
};
|
||||||
|
use mime::Mime;
|
||||||
|
|
||||||
|
pub fn test_get_response(server : &TestServer, path : &str, expected : &[u8])
|
||||||
|
{
|
||||||
|
let res = server.client().get(path).perform().unwrap().read_body().unwrap();
|
||||||
|
let body : &[u8] = res.as_ref();
|
||||||
|
assert_eq!(body, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn test_post_response<B>(server : &TestServer, path : &str, body : B, mime : Mime, expected : &[u8])
|
||||||
|
where
|
||||||
|
B : Into<Body>
|
||||||
|
{
|
||||||
|
let res = server.client().post(path, body, mime).perform().unwrap().read_body().unwrap();
|
||||||
|
let body : &[u8] = res.as_ref();
|
||||||
|
assert_eq!(body, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn test_put_response<B>(server : &TestServer, path : &str, body : B, mime : Mime, expected : &[u8])
|
||||||
|
where
|
||||||
|
B : Into<Body>
|
||||||
|
{
|
||||||
|
let res = server.client().put(path, body, mime).perform().unwrap().read_body().unwrap();
|
||||||
|
let body : &[u8] = res.as_ref();
|
||||||
|
assert_eq!(body, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn test_delete_response(server : &TestServer, path : &str, expected : &[u8])
|
||||||
|
{
|
||||||
|
let res = server.client().delete(path).perform().unwrap().read_body().unwrap();
|
||||||
|
let body : &[u8] = res.as_ref();
|
||||||
|
assert_eq!(body, expected);
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue