Implement first trybuild tests

and use a dedicated InvalidEvent constructor fn in EventContent derives
This commit is contained in:
Ragotzy.devin 2020-05-27 09:19:42 -04:00 committed by Jonas Platte
parent 0c0dafa2c5
commit 7ec162678e
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
10 changed files with 91 additions and 5 deletions

3
.gitignore vendored
View File

@ -1,2 +1,5 @@
Cargo.lock
target
# trybuild generates a `wip` folder when creating or updating a test
wip

View File

@ -26,6 +26,7 @@ strum = { version = "0.18.0", features = ["derive"] }
maplit = "1.0.2"
matches = "0.1.8"
ruma-identifiers = { version = "0.16.2", features = ["rand"] }
trybuild = "1.0.27"
[workspace]
members = [

View File

@ -58,10 +58,9 @@ fn expand_room_event(input: DeriveInput) -> syn::Result<TokenStream> {
content: Box<::serde_json::value::RawValue>
) -> Result<Self, ::ruma_events::InvalidEvent> {
if ev_type != #event_type {
return Err(::ruma_events::InvalidEvent {
kind: ::ruma_events::error::InvalidEventKind::Deserialization,
message: format!("expected `{}` found {}", #event_type, ev_type),
});
return Err(
::ruma_events::InvalidEvent::wrong_event_type(#event_type, ev_type)
);
}
let ev_json = ::ruma_events::EventJson::from(content);

View File

@ -11,17 +11,32 @@ use std::{
/// message and a flag for which type of error was encountered.
#[derive(Clone, Debug)]
pub struct InvalidEvent {
/// A description of the error that occurred.
pub(crate) message: String,
/// The kind of error that occurred.
pub(crate) kind: InvalidEventKind,
}
/// The kind of error that occurred.
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum InvalidEventKind {
pub(crate) enum InvalidEventKind {
/// A deserialization error from malformed input.
Deserialization,
/// An error occurred validating input according the the matrix spec.
Validation,
}
impl InvalidEvent {
/// Constructor used in the event content macros.
///
/// This has to be public to allow the macros to be used outside of ruma-events.
#[doc(hidden)]
pub fn wrong_event_type(expected: &str, found: &str) -> Self {
Self {
message: format!("expected `{}` found {}", expected, found),
kind: InvalidEventKind::Deserialization,
}
}
/// A message describing why the event is invalid.
pub fn message(&self) -> String {
self.message.clone()

7
tests/event_content.rs Normal file
View File

@ -0,0 +1,7 @@
#[test]
fn ui() {
let t = trybuild::TestCases::new();
t.pass("tests/ui/01-sanity-check.rs");
t.compile_fail("tests/ui/02-no-event-type.rs");
t.compile_fail("tests/ui/03-invalid-event-type.rs");
}

View File

@ -0,0 +1,10 @@
use ruma_events_macros::{FromRaw, StateEventContent};
use serde::Serialize;
#[derive(Clone, Debug, Serialize, FromRaw, StateEventContent)]
#[ruma_event(type = "m.macro.test")]
pub struct MacroTest {
pub url: String,
}
fn main() {}

View File

@ -0,0 +1,9 @@
use ruma_events_macros::{FromRaw, StateEventContent};
use serde::Serialize;
#[derive(Clone, Debug, Serialize, FromRaw, StateEventContent)]
pub struct MacroTest {
pub url: String,
}
fn main() {}

View File

@ -0,0 +1,7 @@
error: no event type attribute found, add `#[ruma_events(type = "any.room.event")]` below the event content derive
--> $DIR/02-no-event-type.rs:4:44
|
4 | #[derive(Clone, Debug, Serialize, FromRaw, StateEventContent)]
| ^^^^^^^^^^^^^^^^^
|
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)

View File

@ -0,0 +1,16 @@
use ruma_events_macros::{FromRaw, StateEventContent};
use serde::Serialize;
#[derive(Clone, Debug, Serialize, FromRaw, StateEventContent)]
#[not_ruma_event(type = "m.macro.test")]
pub struct MacroTest {
pub test: String,
}
#[derive(Clone, Debug, Serialize, StateEventContent)]
#[ruma_event(event = "m.macro.test")]
pub struct MoreMacroTest {
pub test: String,
}
fn main() {}

View File

@ -0,0 +1,19 @@
error: expected `type`
--> $DIR/03-invalid-event-type.rs:11:14
|
11 | #[ruma_event(event = "m.macro.test")]
| ^^^^^
error: no event type attribute found, add `#[ruma_events(type = "any.room.event")]` below the event content derive
--> $DIR/03-invalid-event-type.rs:4:44
|
4 | #[derive(Clone, Debug, Serialize, FromRaw, StateEventContent)]
| ^^^^^^^^^^^^^^^^^
|
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
error: cannot find attribute `not_ruma_event` in this scope
--> $DIR/03-invalid-event-type.rs:5:3
|
5 | #[not_ruma_event(type = "m.macro.test")]
| ^^^^^^^^^^^^^^ help: a derive helper attribute with a similar name exists: `ruma_event`