vkteams_bot/api/messages/
send_file.rs1use 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 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 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 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}