mirror of
https://github.com/teloxide/teloxide.git
synced 2024-12-22 14:35:36 +01:00
Add tests for response processing
This commit is contained in:
parent
2221116d9c
commit
74e32a725d
2 changed files with 121 additions and 0 deletions
|
@ -17,6 +17,7 @@ pub enum RequestError {
|
||||||
/// The group has been migrated to a supergroup with the specified
|
/// The group has been migrated to a supergroup with the specified
|
||||||
/// identifier.
|
/// identifier.
|
||||||
#[error("The group has been migrated to a supergroup with ID #{0}")]
|
#[error("The group has been migrated to a supergroup with ID #{0}")]
|
||||||
|
// FIXME: change to `ChatId` :|
|
||||||
MigrateToChatId(i64),
|
MigrateToChatId(i64),
|
||||||
|
|
||||||
/// In case of exceeding flood control, the number of seconds left to wait
|
/// In case of exceeding flood control, the number of seconds left to wait
|
||||||
|
|
|
@ -99,6 +99,13 @@ where
|
||||||
|
|
||||||
let text = response.text().await?;
|
let text = response.text().await?;
|
||||||
|
|
||||||
|
deserialize_response(text)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_response<T>(text: String) -> Result<T, RequestError>
|
||||||
|
where
|
||||||
|
T: DeserializeOwned + 'static,
|
||||||
|
{
|
||||||
serde_json::from_str::<TelegramResponse<T>>(&text)
|
serde_json::from_str::<TelegramResponse<T>>(&text)
|
||||||
.map(|mut response| {
|
.map(|mut response| {
|
||||||
use crate::types::{Update, UpdateKind};
|
use crate::types::{Update, UpdateKind};
|
||||||
|
@ -152,3 +159,116 @@ where
|
||||||
.map_err(|source| RequestError::InvalidJson { source, raw: text.into() })?
|
.map_err(|source| RequestError::InvalidJson { source, raw: text.into() })?
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use cool_asserts::assert_matches;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
net::request::deserialize_response,
|
||||||
|
types::{True, Update, UpdateKind},
|
||||||
|
ApiError, RequestError,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn smoke_ok() {
|
||||||
|
let json = r#"{"ok":true,"result":true}"#.to_owned();
|
||||||
|
|
||||||
|
let res = deserialize_response::<True>(json);
|
||||||
|
assert_matches!(res, Ok(True));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn smoke_err() {
|
||||||
|
let json =
|
||||||
|
r#"{"ok":false,"description":"Forbidden: bot was blocked by the user"}"#.to_owned();
|
||||||
|
|
||||||
|
let res = deserialize_response::<True>(json);
|
||||||
|
assert_matches!(res, Err(RequestError::Api(ApiError::BotBlocked)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn migrate() {
|
||||||
|
let json = r#"{"ok":false,"description":"this string is ignored","parameters":{"migrate_to_chat_id":123456}}"#.to_owned();
|
||||||
|
|
||||||
|
let res = deserialize_response::<True>(json);
|
||||||
|
assert_matches!(res, Err(RequestError::MigrateToChatId(123456)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn retry_after() {
|
||||||
|
let json = r#"{"ok":false,"description":"this string is ignored","parameters":{"retry_after":123456}}"#.to_owned();
|
||||||
|
|
||||||
|
let res = deserialize_response::<True>(json);
|
||||||
|
assert_matches!(res, Err(RequestError::RetryAfter(duration)) if duration == Duration::from_secs(123456));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn update_ok() {
|
||||||
|
let json = r#"{
|
||||||
|
"ok":true,
|
||||||
|
"result":[
|
||||||
|
{
|
||||||
|
"update_id":0,
|
||||||
|
"poll_answer":{
|
||||||
|
"poll_id":"POLL_ID",
|
||||||
|
"user": {"id":42,"is_bot":false,"first_name":"blah"},
|
||||||
|
"option_ids": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}"#
|
||||||
|
.to_owned();
|
||||||
|
|
||||||
|
let res = deserialize_response::<Vec<Update>>(json).unwrap();
|
||||||
|
assert_matches!(res, [Update { id: 0, kind: UpdateKind::PollAnswer(_) }]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check that `get_updates` can work with malformed updates.
|
||||||
|
#[test]
|
||||||
|
fn update_err() {
|
||||||
|
let json = r#"{
|
||||||
|
"ok":true,
|
||||||
|
"result":[
|
||||||
|
{
|
||||||
|
"update_id":0,
|
||||||
|
"poll_answer":{
|
||||||
|
"poll_id":"POLL_ID",
|
||||||
|
"user": {"id":42,"is_bot":false,"first_name":"blah"},
|
||||||
|
"option_ids": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"update_id":1,
|
||||||
|
"something unknown to us":17
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"update_id":2,
|
||||||
|
"poll_answer":{
|
||||||
|
"poll_id":"POLL_ID",
|
||||||
|
"user": {"id":42,"is_bot":false,"first_name":"blah"},
|
||||||
|
"option_ids": [3, 4, 8]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"update_id":3,
|
||||||
|
"message":{"some fields are missing":true}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}"#
|
||||||
|
.to_owned();
|
||||||
|
|
||||||
|
let res = deserialize_response::<Vec<Update>>(json).unwrap();
|
||||||
|
assert_matches!(
|
||||||
|
res,
|
||||||
|
[
|
||||||
|
Update { id: 0, kind: UpdateKind::PollAnswer(_) },
|
||||||
|
Update { id: 1, kind: UpdateKind::Error(v) } if v.is_object(),
|
||||||
|
Update { id: 2, kind: UpdateKind::PollAnswer(_) },
|
||||||
|
Update { id: 3, kind: UpdateKind::Error(v) } if v.is_object(),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue