use serde::{Deserialize, Serialize};
use url::Url;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct GollumEventPayload {
pub pages: Vec<GollumEventPage>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct GollumEventPage {
pub page_name: String,
pub title: String,
pub action: GollumEventPageAction,
pub sha: String,
pub html_url: Url,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum GollumEventPageAction {
Created,
Edited,
}
#[cfg(test)]
mod test {
use super::GollumEventPageAction;
use crate::models::events::{payload::EventPayload, Event};
#[test]
fn should_deserialize_action_from_lowercase() {
let actions = vec![
(r#""created""#, GollumEventPageAction::Created),
(r#""edited""#, GollumEventPageAction::Edited),
];
for (action_str, action) in actions {
let deserialized = serde_json::from_str(action_str).unwrap();
assert_eq!(action, deserialized);
}
}
#[test]
fn should_deserialize_with_correct_payload() {
let json = include_str!("../../../../tests/resources/gollum_event.json");
let event: Event = serde_json::from_str(json).unwrap();
if let Some(EventPayload::GollumEvent(ref payload)) =
event.payload.as_ref().unwrap().specific
{
assert_eq!(payload.pages[0].page_name, "Home");
assert_eq!(payload.pages[0].title, "Home");
assert_eq!(payload.pages[0].action, GollumEventPageAction::Created);
assert_eq!(
payload.pages[0].sha,
"738b45139cbf06c11f3013e4b2b1a1ad370696ca"
);
assert_eq!(
payload.pages[0].html_url.to_string(),
"https://github.com/wayofthepie/test-events/wiki/Home"
);
} else {
panic!("unexpected event payload encountered: {:#?}", event.payload);
}
}
}