vkteams_bot/api/messages/
send_file.rs

1//! Send a file to a chat method `messages/sendFile`
2//! [More info](https://teams.vk.com/botapi/#/messages/get_messages_sendFile)
3use crate::prelude::*;
4
5bot_api_method! {
6    method = "messages/sendFile",
7    http_method = HTTPMethod::POST,
8    request = RequestMessagesSendFile {
9        required {
10            chat_id: ChatId,
11            multipart: MultipartName,
12        },
13        optional {
14            text: String,
15            reply_msg_id: MsgId,
16            forward_chat_id: ChatId,
17            forward_msg_id: MsgId,
18            inline_keyboard_markup: String,
19            format: MessageFormat,
20            parse_mode: ParseMode,
21        }
22    },
23    response = ResponseMessagesSendFile {
24        msg_id: Option<MsgId>,
25        file_id: Option<String>,
26    },
27}
28
29impl MessageTextSetters for RequestMessagesSendFile {
30    /// Set the text of the message
31    /// ## Parameters
32    /// - `parser`: [`MessageTextParser`]
33    fn set_text(self, parser: MessageTextParser) -> Result<Self> {
34        let (text, parse_mode) = parser.parse()?;
35        Ok(self.with_text(text).with_parse_mode(parse_mode))
36    }
37    /// Set forward message id
38    /// ## Parameters
39    /// - `chat_id`: [`ChatId`]
40    /// - `msg_id`: [`MsgId`]
41    fn set_forward_msg_id(self, chat_id: ChatId, msg_id: MsgId) -> Result<Self> {
42        Ok(self
43            .with_forward_chat_id(chat_id)
44            .with_forward_msg_id(msg_id))
45    }
46    /// Set keyboard for the message
47    /// ## Parameters
48    /// - `keyboard`: [`Keyboard`]
49    fn set_keyboard(self, keyboard: Keyboard) -> Result<Self> {
50        Ok(self.with_inline_keyboard_markup(keyboard.into()))
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn test_set_text_valid() {
60        let req = RequestMessagesSendFile::new((
61            ChatId::from("c1"),
62            MultipartName::FilePath("f1".to_string()),
63        ));
64        let mut parser = MessageTextParser::default();
65        parser
66            .text
67            .push(MessageTextFormat::Plain("hello".to_string()));
68        let res = req.set_text(parser);
69        assert!(res.is_ok());
70        let req2 = res.unwrap();
71        assert_eq!(req2.text.unwrap(), "hello");
72    }
73
74    #[test]
75    fn test_set_text_parser_error() {
76        let req = RequestMessagesSendFile::new((
77            ChatId::from("c1"),
78            MultipartName::FilePath("f1".to_string()),
79        ));
80        let mut parser = MessageTextParser::default();
81        parser.text.push(MessageTextFormat::Link(
82            "not a url".to_string(),
83            "text".to_string(),
84        ));
85        let res = req.set_text(parser);
86        assert!(res.is_err());
87    }
88
89    #[test]
90    fn test_set_keyboard_valid() {
91        let req = RequestMessagesSendFile::new((
92            ChatId::from("c1"),
93            MultipartName::FilePath("f1".to_string()),
94        ));
95        let keyboard = Keyboard {
96            buttons: vec![vec![ButtonKeyboard {
97                text: "ok".to_string(),
98                url: None,
99                callback_data: None,
100                style: None,
101            }]],
102        };
103        let res = req.set_keyboard(keyboard);
104        assert!(res.is_ok());
105        let req2 = res.unwrap();
106        assert!(req2.inline_keyboard_markup.is_some());
107    }
108
109    #[test]
110    fn test_set_forward_msg_id_valid() {
111        let req = RequestMessagesSendFile::new((
112            ChatId::from("c1"),
113            MultipartName::FilePath("f1".to_string()),
114        ));
115        let res = req.set_forward_msg_id(ChatId::from("c2"), MsgId("m1".to_string()));
116        assert!(res.is_ok());
117        let req2 = res.unwrap();
118        assert_eq!(req2.forward_chat_id.unwrap().0, "c2");
119        assert_eq!(req2.forward_msg_id.unwrap().0, "m1");
120    }
121
122    #[test]
123    fn test_serialize_deserialize_request_minimal() {
124        let req = RequestMessagesSendFile::new((
125            ChatId::from("c1"),
126            MultipartName::FilePath("file_id".to_string()),
127        ));
128        let val = serde_json::to_value(&req).unwrap();
129        assert_eq!(val["chatId"], "c1");
130        assert_eq!(val["multipart"]["FilePath"], "file_id");
131        let req2: RequestMessagesSendFile = serde_json::from_value(val).unwrap();
132        assert_eq!(req2.chat_id.0, "c1");
133        match req2.multipart {
134            MultipartName::FilePath(ref s) => assert_eq!(s, "file_id"),
135            _ => panic!("Expected FilePath variant"),
136        }
137        assert!(req2.text.is_none());
138    }
139
140    #[test]
141    fn test_serialize_deserialize_request_full() {
142        let mut req = RequestMessagesSendFile::new((
143            ChatId::from("c1"),
144            MultipartName::FilePath("file_id".to_string()),
145        ));
146        req.text = Some("hello".to_string());
147        let val = serde_json::to_value(&req).unwrap();
148        let req2: RequestMessagesSendFile = serde_json::from_value(val).unwrap();
149        assert_eq!(req2.text.as_deref(), Some("hello"));
150    }
151
152    #[test]
153    fn test_serialize_deserialize_response() {
154        let resp = ResponseMessagesSendFile {
155            msg_id: Some(MsgId("m1".to_string())),
156            file_id: Some("file_id".to_string()),
157        };
158        let val = serde_json::to_value(&resp).unwrap();
159        assert_eq!(val["msgId"], "m1");
160        assert_eq!(val["fileId"], "file_id");
161        let resp2: ResponseMessagesSendFile = serde_json::from_value(val).unwrap();
162        assert_eq!(resp2.msg_id.as_ref().unwrap().0, "m1");
163        assert_eq!(resp2.file_id.as_ref().unwrap(), "file_id");
164    }
165
166    #[test]
167    fn test_request_missing_required_field() {
168        let val = serde_json::json!({"text": "hello"});
169        let req = serde_json::from_value::<RequestMessagesSendFile>(val);
170        assert!(req.is_err());
171    }
172}