From 6680887b8462fb024f121abbd7ae46aebbfd2ecb Mon Sep 17 00:00:00 2001 From: Dominic Date: Sat, 9 May 2020 15:29:29 +0200 Subject: [PATCH] add trybuild tests for OpenapiType and Resource derive macros --- derive/src/openapi_type.rs | 6 +++--- tests/trybuild_ui.rs | 12 ++++++++++++ tests/ui/openapi_type_enum_with_fields.rs | 14 ++++++++++++++ tests/ui/openapi_type_enum_with_fields.stderr | 11 +++++++++++ tests/ui/openapi_type_nullable_non_bool.rs | 12 ++++++++++++ tests/ui/openapi_type_nullable_non_bool.stderr | 5 +++++ tests/ui/openapi_type_rename_non_string.rs | 12 ++++++++++++ tests/ui/openapi_type_rename_non_string.stderr | 5 +++++ tests/ui/openapi_type_tuple_struct.rs | 8 ++++++++ tests/ui/openapi_type_tuple_struct.stderr | 5 +++++ tests/ui/openapi_type_union.rs | 12 ++++++++++++ tests/ui/openapi_type_union.stderr | 5 +++++ tests/ui/openapi_type_unknown_key.rs | 12 ++++++++++++ tests/ui/openapi_type_unknown_key.stderr | 5 +++++ tests/ui/resource_unknown_method.rs | 14 ++++++++++++++ tests/ui/resource_unknown_method.stderr | 14 ++++++++++++++ 16 files changed, 149 insertions(+), 3 deletions(-) create mode 100644 tests/ui/openapi_type_enum_with_fields.rs create mode 100644 tests/ui/openapi_type_enum_with_fields.stderr create mode 100644 tests/ui/openapi_type_nullable_non_bool.rs create mode 100644 tests/ui/openapi_type_nullable_non_bool.stderr create mode 100644 tests/ui/openapi_type_rename_non_string.rs create mode 100644 tests/ui/openapi_type_rename_non_string.stderr create mode 100644 tests/ui/openapi_type_tuple_struct.rs create mode 100644 tests/ui/openapi_type_tuple_struct.stderr create mode 100644 tests/ui/openapi_type_union.rs create mode 100644 tests/ui/openapi_type_union.stderr create mode 100644 tests/ui/openapi_type_unknown_key.rs create mode 100644 tests/ui/openapi_type_unknown_key.stderr create mode 100644 tests/ui/resource_unknown_method.rs create mode 100644 tests/ui/resource_unknown_method.stderr diff --git a/derive/src/openapi_type.rs b/derive/src/openapi_type.rs index d73507e..bd9dd6a 100644 --- a/derive/src/openapi_type.rs +++ b/derive/src/openapi_type.rs @@ -108,7 +108,7 @@ fn expand_variant(variant : &Variant) -> Result { if variant.fields != Fields::Unit { - return Err(Error::new(variant.span(), "Enum Variants with Fields not supported")); + return Err(Error::new(variant.span(), "#[derive(OpenapiType)] does not support enum variants with fields")); } let ident = &variant.ident; @@ -173,7 +173,7 @@ fn expand_field(field : &Field) -> Result { let ident = match &field.ident { Some(ident) => ident, - None => return Err(Error::new(field.span(), "Fields without ident are not supported")) + None => return Err(Error::new(field.span(), "#[derive(OpenapiType)] does not support fields without an ident")) }; let ty = &field.ty; @@ -242,7 +242,7 @@ fn expand_struct(ident : Ident, generics : Generics, attrs : Vec, inp .map(expand_field) .collect_to_result()? }, - Fields::Unnamed(fields) => return Err(Error::new(fields.span(), "Unnamed fields are not supported")), + Fields::Unnamed(fields) => return Err(Error::new(fields.span(), "#[derive(OpenapiType)] does not support unnamed fields")), Fields::Unit => Vec::new() }; diff --git a/tests/trybuild_ui.rs b/tests/trybuild_ui.rs index b791172..b5a572a 100644 --- a/tests/trybuild_ui.rs +++ b/tests/trybuild_ui.rs @@ -15,4 +15,16 @@ fn trybuild_ui() 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"); + t.compile_fail("tests/ui/resource_unknown_method.rs"); + + // require the openapi feature + if cfg!(feature = "openapi") + { + t.compile_fail("tests/ui/openapi_type_enum_with_fields.rs"); + t.compile_fail("tests/ui/openapi_type_nullable_non_bool.rs"); + t.compile_fail("tests/ui/openapi_type_rename_non_string.rs"); + t.compile_fail("tests/ui/openapi_type_tuple_struct.rs"); + t.compile_fail("tests/ui/openapi_type_union.rs"); + t.compile_fail("tests/ui/openapi_type_unknown_key.rs"); + } } diff --git a/tests/ui/openapi_type_enum_with_fields.rs b/tests/ui/openapi_type_enum_with_fields.rs new file mode 100644 index 0000000..6bc6814 --- /dev/null +++ b/tests/ui/openapi_type_enum_with_fields.rs @@ -0,0 +1,14 @@ +#[macro_use] extern crate gotham_restful; + +#[derive(OpenapiType)] +enum Food +{ + Pasta, + Pizza { pineapple : bool }, + Rice, + Other(String) +} + +fn main() +{ +} diff --git a/tests/ui/openapi_type_enum_with_fields.stderr b/tests/ui/openapi_type_enum_with_fields.stderr new file mode 100644 index 0000000..1620970 --- /dev/null +++ b/tests/ui/openapi_type_enum_with_fields.stderr @@ -0,0 +1,11 @@ +error: #[derive(OpenapiType)] does not support enum variants with fields + --> $DIR/openapi_type_enum_with_fields.rs:7:2 + | +7 | Pizza { pineapple : bool }, + | ^^^^^ + +error: #[derive(OpenapiType)] does not support enum variants with fields + --> $DIR/openapi_type_enum_with_fields.rs:9:2 + | +9 | Other(String) + | ^^^^^ diff --git a/tests/ui/openapi_type_nullable_non_bool.rs b/tests/ui/openapi_type_nullable_non_bool.rs new file mode 100644 index 0000000..1e0af28 --- /dev/null +++ b/tests/ui/openapi_type_nullable_non_bool.rs @@ -0,0 +1,12 @@ +#[macro_use] extern crate gotham_restful; + +#[derive(OpenapiType)] +struct Foo +{ + #[openapi(nullable = "yes, please")] + bar : String +} + +fn main() +{ +} diff --git a/tests/ui/openapi_type_nullable_non_bool.stderr b/tests/ui/openapi_type_nullable_non_bool.stderr new file mode 100644 index 0000000..0ce2be3 --- /dev/null +++ b/tests/ui/openapi_type_nullable_non_bool.stderr @@ -0,0 +1,5 @@ +error: Expected bool + --> $DIR/openapi_type_nullable_non_bool.rs:6:23 + | +6 | #[openapi(nullable = "yes, please")] + | ^^^^^^^^^^^^^ diff --git a/tests/ui/openapi_type_rename_non_string.rs b/tests/ui/openapi_type_rename_non_string.rs new file mode 100644 index 0000000..0847f14 --- /dev/null +++ b/tests/ui/openapi_type_rename_non_string.rs @@ -0,0 +1,12 @@ +#[macro_use] extern crate gotham_restful; + +#[derive(OpenapiType)] +struct Foo +{ + #[openapi(rename = 42)] + bar : String +} + +fn main() +{ +} diff --git a/tests/ui/openapi_type_rename_non_string.stderr b/tests/ui/openapi_type_rename_non_string.stderr new file mode 100644 index 0000000..9bb9dd2 --- /dev/null +++ b/tests/ui/openapi_type_rename_non_string.stderr @@ -0,0 +1,5 @@ +error: Expected string literal + --> $DIR/openapi_type_rename_non_string.rs:6:21 + | +6 | #[openapi(rename = 42)] + | ^^ diff --git a/tests/ui/openapi_type_tuple_struct.rs b/tests/ui/openapi_type_tuple_struct.rs new file mode 100644 index 0000000..0247478 --- /dev/null +++ b/tests/ui/openapi_type_tuple_struct.rs @@ -0,0 +1,8 @@ +#[macro_use] extern crate gotham_restful; + +#[derive(OpenapiType)] +struct Foo(String); + +fn main() +{ +} diff --git a/tests/ui/openapi_type_tuple_struct.stderr b/tests/ui/openapi_type_tuple_struct.stderr new file mode 100644 index 0000000..2028d18 --- /dev/null +++ b/tests/ui/openapi_type_tuple_struct.stderr @@ -0,0 +1,5 @@ +error: #[derive(OpenapiType)] does not support unnamed fields + --> $DIR/openapi_type_tuple_struct.rs:4:11 + | +4 | struct Foo(String); + | ^^^^^^^^ diff --git a/tests/ui/openapi_type_union.rs b/tests/ui/openapi_type_union.rs new file mode 100644 index 0000000..4bc7355 --- /dev/null +++ b/tests/ui/openapi_type_union.rs @@ -0,0 +1,12 @@ +#[macro_use] extern crate gotham_restful; + +#[derive(OpenapiType)] +union IntOrPointer +{ + int: u64, + pointer: *mut String +} + +fn main() +{ +} diff --git a/tests/ui/openapi_type_union.stderr b/tests/ui/openapi_type_union.stderr new file mode 100644 index 0000000..52639fe --- /dev/null +++ b/tests/ui/openapi_type_union.stderr @@ -0,0 +1,5 @@ +error: #[derive(OpenapiType)] only works for structs and enums + --> $DIR/openapi_type_union.rs:4:1 + | +4 | union IntOrPointer + | ^^^^^ diff --git a/tests/ui/openapi_type_unknown_key.rs b/tests/ui/openapi_type_unknown_key.rs new file mode 100644 index 0000000..9157e16 --- /dev/null +++ b/tests/ui/openapi_type_unknown_key.rs @@ -0,0 +1,12 @@ +#[macro_use] extern crate gotham_restful; + +#[derive(OpenapiType)] +struct Foo +{ + #[openapi(like = "pizza")] + bar : String +} + +fn main() +{ +} diff --git a/tests/ui/openapi_type_unknown_key.stderr b/tests/ui/openapi_type_unknown_key.stderr new file mode 100644 index 0000000..f8e78b7 --- /dev/null +++ b/tests/ui/openapi_type_unknown_key.stderr @@ -0,0 +1,5 @@ +error: Unknown key + --> $DIR/openapi_type_unknown_key.rs:6:12 + | +6 | #[openapi(like = "pizza")] + | ^^^^ diff --git a/tests/ui/resource_unknown_method.rs b/tests/ui/resource_unknown_method.rs new file mode 100644 index 0000000..f246ed1 --- /dev/null +++ b/tests/ui/resource_unknown_method.rs @@ -0,0 +1,14 @@ +#[macro_use] extern crate gotham_restful; + +#[derive(Resource)] +#[resource(read_any)] +struct FooResource; + +#[read_all(FooResource)] +fn read_all() +{ +} + +fn main() +{ +} diff --git a/tests/ui/resource_unknown_method.stderr b/tests/ui/resource_unknown_method.stderr new file mode 100644 index 0000000..3282dbe --- /dev/null +++ b/tests/ui/resource_unknown_method.stderr @@ -0,0 +1,14 @@ +error: Unknown method: `read_any' + --> $DIR/resource_unknown_method.rs:4:12 + | +4 | #[resource(read_any)] + | ^^^^^^^^ + +error[E0277]: the trait bound `FooResource: gotham_restful::Resource` is not satisfied + --> $DIR/resource_unknown_method.rs:7:1 + | +7 | #[read_all(FooResource)] + | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `gotham_restful::Resource` is not implemented for `FooResource` + | + = help: see issue #48214 + = note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info)