diff --git a/src/api/emoji.rs b/src/api/emoji.rs index c7f2073..41322b1 100644 --- a/src/api/emoji.rs +++ b/src/api/emoji.rs @@ -36,3 +36,29 @@ where pub struct SlackApiEmojiListResponse { pub emoji: HashMap, } + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_slack_api_emoji_list_response() { + let payload = include_str!("./fixtures/slack_api_emoji_list_response.json"); + let model: SlackApiEmojiListResponse = serde_json::from_str(payload).unwrap(); + + assert_eq!(model.emoji.len(), 1); + assert!(model + .emoji + .contains_key(&SlackEmojiName::new("test".to_string()))); + let test_emoji = model + .emoji + .get(&SlackEmojiName::new("test".to_string())) + .unwrap(); + match test_emoji { + SlackEmojiRef::Url(url) => { + assert_eq!(url.as_str(), "https://emoji.slack-edge.com/test_emoji.png") + } + _ => panic!("unexpected emoji type"), + } + } +} diff --git a/src/api/fixtures/slack_api_emoji_list_response.json b/src/api/fixtures/slack_api_emoji_list_response.json new file mode 100644 index 0000000..fe4fe40 --- /dev/null +++ b/src/api/fixtures/slack_api_emoji_list_response.json @@ -0,0 +1,7 @@ +{ + "ok": true, + "emoji": { + "test": "https:\/\/emoji.slack-edge.com\/test_emoji.png" + }, + "cache_ts": "1742309006.064153" +} diff --git a/src/models/common/emoji.rs b/src/models/common/emoji.rs index a4b7b97..bcf6b74 100644 --- a/src/models/common/emoji.rs +++ b/src/models/common/emoji.rs @@ -48,7 +48,7 @@ impl<'de> Visitor<'de> for SlackEmojiRefVisitor { formatter.write_str("a Slack custom emoji URL or alias in the form of 'alias:'") } - fn visit_borrowed_str(self, v: &'de str) -> Result + fn visit_str(self, v: &str) -> Result where E: serde::de::Error, { @@ -61,8 +61,10 @@ impl<'de> Visitor<'de> for SlackEmojiRefVisitor { } } - let emoji_url: Url = v.parse().unwrap(); - Ok(SlackEmojiRef::Url(emoji_url)) + match Url::parse(v) { + Ok(url) => Ok(SlackEmojiRef::Url(url)), + Err(err) => Err(E::custom(format!("Failed to parse URL '{}': {}", v, err))), + } } } @@ -113,7 +115,20 @@ mod test { } #[test] - fn test_serialize_emoji_alias() { + fn test_deserialize_emoji_url_with_escaped_slashes() { + let emoji_url = r#""https:\/\/emoji.slack-edge.com\/test_emoji.png""#; + + let r = serde_json::from_str::(&emoji_url).unwrap(); + assert_eq!( + r, + SlackEmojiRef::Url( + Url::parse("https://emoji.slack-edge.com/test_emoji.png").unwrap() + ) + ); + } + + #[test] + fn test_deserialize_emoji_alias() { assert_eq!( serde_json::from_str::("\"alias:smile\"").unwrap(), SlackEmojiRef::Alias(SlackEmojiName::new("smile".to_string()))