vkteams_bot/api/messages/
edit_text.rs

1//! Edit text messages method `messages/editText`
2//! [More info](https://teams.vk.com/botapi/#/messages/get_messages_editText)
3use crate::prelude::*;
4bot_api_method! {
5    method = "messages/editText",
6    request = RequestMessagesEditText {
7        required {
8            chat_id: ChatId,
9            msg_id: MsgId,
10        },
11        optional {
12            text: String,
13            inline_keyboard_markup: String,
14            format: MessageFormat,
15            parse_mode: ParseMode,
16        }
17    },
18    response = ResponseMessagesEditText {},
19}
20
21impl MessageTextSetters for RequestMessagesEditText {
22    /// Set text
23    /// ## Parameters
24    /// - `parser`: [`MessageTextParser`]
25    fn set_text(self, parser: MessageTextParser) -> Result<Self> {
26        let (text, parse_mode) = parser.parse()?;
27        Ok(self.with_text(text).with_parse_mode(parse_mode))
28    }
29    /// Set format
30    /// ## Parameters
31    /// - `format`: [`MessageFormat`]
32    fn set_keyboard(self, keyboard: Keyboard) -> Result<Self> {
33        Ok(self.with_inline_keyboard_markup(keyboard.into()))
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn test_set_text_valid() {
43        let req = RequestMessagesEditText::new((ChatId::from("c1"), MsgId("m1".to_string())));
44        let mut parser = MessageTextParser::default();
45        parser
46            .text
47            .push(MessageTextFormat::Plain("hello".to_string()));
48        let res = req.set_text(parser);
49        assert!(res.is_ok());
50        let req2 = res.unwrap();
51        assert_eq!(req2.text.unwrap(), "hello");
52    }
53
54    #[test]
55    fn test_set_text_parser_error() {
56        let req = RequestMessagesEditText::new((ChatId::from("c1"), MsgId("m1".to_string())));
57        let mut parser = MessageTextParser::default();
58        parser.text.push(MessageTextFormat::Link(
59            "not a url".to_string(),
60            "text".to_string(),
61        ));
62        let res = req.set_text(parser);
63        assert!(res.is_err());
64    }
65
66    #[test]
67    fn test_set_keyboard_valid() {
68        let req = RequestMessagesEditText::new((ChatId::from("c1"), MsgId("m1".to_string())));
69        let keyboard = Keyboard {
70            buttons: vec![vec![ButtonKeyboard {
71                text: "ok".to_string(),
72                url: None,
73                callback_data: None,
74                style: None,
75            }]],
76        };
77        let res = req.set_keyboard(keyboard);
78        assert!(res.is_ok());
79        let req2 = res.unwrap();
80        assert!(req2.inline_keyboard_markup.is_some());
81    }
82
83    #[test]
84    fn test_serialize_deserialize_request_minimal() {
85        let req = RequestMessagesEditText::new((ChatId::from("c1"), MsgId("m1".to_string())));
86        let val = serde_json::to_value(&req).unwrap();
87        assert_eq!(val["chatId"], "c1");
88        assert_eq!(val["msgId"], "m1");
89        let req2: RequestMessagesEditText = serde_json::from_value(val).unwrap();
90        assert_eq!(req2.chat_id.0, "c1");
91        assert_eq!(req2.msg_id.0, "m1");
92        assert!(req2.text.is_none());
93    }
94
95    #[test]
96    fn test_serialize_deserialize_request_full() {
97        let mut req = RequestMessagesEditText::new((ChatId::from("c1"), MsgId("m1".to_string())));
98        req.text = Some("hello".to_string());
99        let val = serde_json::to_value(&req).unwrap();
100        let req2: RequestMessagesEditText = serde_json::from_value(val).unwrap();
101        assert_eq!(req2.text.as_deref(), Some("hello"));
102    }
103
104    #[test]
105    fn test_request_missing_required_field() {
106        let val = serde_json::json!({"text": "hello"});
107        let req = serde_json::from_value::<RequestMessagesEditText>(val);
108        assert!(req.is_err());
109    }
110}