Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/client/context_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ impl SendContextResolver for Client {
text,
error_type,
backoff,
..
}) = e.downcast_ref::<crate::request::IqError>()
{
return anyhow::Error::new(wacore::request::ServerErrorCode {
Expand Down
10 changes: 5 additions & 5 deletions src/client/sessions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -629,12 +629,12 @@ mod tests {
// `fetch_pre_keys` directly and receives the first, while the fan-out
// goes through `SendContextResolver`, which re-wraps it as the second.
let as_iq_error = |code| {
anyhow::Error::new(crate::request::IqError::ServerError {
anyhow::Error::new(crate::test_utils::server_error_iq(
code,
text: "not-acceptable".to_string(),
error_type: None,
backoff: None,
})
"not-acceptable",
None,
None,
))
};
let as_shared = |code| {
anyhow::Error::new(wacore::request::ServerErrorCode {
Expand Down
1 change: 1 addition & 0 deletions src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ fn server_rejection_of<'a>(cause: &'a (dyn StdError + 'static)) -> Option<Server
text,
error_type,
backoff,
..
}) = cause.downcast_ref::<ClientIqError>()
{
return Some(ServerRejection {
Expand Down
7 changes: 1 addition & 6 deletions src/features/mex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -363,12 +363,7 @@ mod tests {

#[test]
fn request_preserves_iq_error_source() {
let iq = IqError::ServerError {
code: 404,
text: "not-found".into(),
error_type: None,
backoff: None,
};
let iq = crate::test_utils::server_error_iq(404, "not-found", None, None);
let me: MexError = iq.into();
let src = std::error::Error::source(&me).expect("source preserved");
let inner = src.downcast_ref::<IqError>().expect("downcasts to IqError");
Expand Down
7 changes: 1 addition & 6 deletions src/features/rotate_key.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,12 +383,7 @@ mod tests {
}

fn server_error(code: u16) -> IqError {
IqError::ServerError {
code,
text: "test".to_string(),
error_type: None,
backoff: None,
}
crate::test_utils::server_error_iq(code, "test", None, None)
}

const NOW: i64 = 1_700_000_000_000;
Expand Down
18 changes: 6 additions & 12 deletions src/keepalive.rs
Original file line number Diff line number Diff line change
Expand Up @@ -359,12 +359,9 @@ mod tests {
#[test]
fn test_classify_server_error_is_transient() {
assert_eq!(
classify_keepalive_error(&IqError::ServerError {
code: 500,
text: "internal".to_string(),
error_type: None,
backoff: None,
}),
classify_keepalive_error(&crate::test_utils::server_error_iq(
500, "internal", None, None
)),
KeepaliveResult::TransientFailure,
"ServerError should be transient — server may recover"
);
Expand Down Expand Up @@ -419,12 +416,9 @@ mod tests {
assert!(!is_benign_teardown(&IqError::ParseError(anyhow::anyhow!(
"bad response"
))));
assert!(!is_benign_teardown(&IqError::ServerError {
code: 500,
text: "internal".to_string(),
error_type: None,
backoff: None,
}));
assert!(!is_benign_teardown(&crate::test_utils::server_error_iq(
500, "internal", None, None
)));
assert!(!is_benign_teardown(&IqError::UnexpectedResponseType {
got: Some("get".to_string()),
}));
Expand Down
4 changes: 2 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ pub use plugins::{
};
pub mod request;
pub(crate) mod signal_flush;
pub use request::IqError;
pub use request::{IqError, RejectionStanza};
#[cfg(feature = "tokio-runtime")]
pub mod runtime_impl;
#[cfg(feature = "tokio-runtime")]
Expand Down Expand Up @@ -254,7 +254,7 @@ pub mod prelude {
PluginInterceptorRegistration, PluginManifest, PluginStanzaInterception,
UntypedClientPlugin,
};
pub use crate::request::IqError;
pub use crate::request::{IqError, RejectionStanza};
#[cfg(feature = "tokio-runtime")]
pub use crate::runtime_impl::TokioRuntime;
pub use crate::send::{EditOptions, SendError, SendOptions, SendResult};
Expand Down
56 changes: 10 additions & 46 deletions src/pair_code.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1307,13 +1307,8 @@ mod tests {
/// reading as the named arm.
#[test]
fn a_contradicting_text_yields_no_classification() {
let pe: PairError = IqError::ServerError {
code: 429,
text: "something-else".into(),
error_type: None,
backoff: None,
}
.into();
let pe: PairError =
crate::test_utils::server_error_iq(429, "something-else", None, None).into();

assert_eq!(
pe.rejection(),
Expand All @@ -1330,13 +1325,7 @@ mod tests {
/// failure back for the one refusal that most needs acting on.
#[test]
fn an_absent_text_still_classifies_by_code() {
let pe: PairError = IqError::ServerError {
code: 429,
text: String::new(),
error_type: None,
backoff: None,
}
.into();
let pe: PairError = crate::test_utils::server_error_iq(429, "", None, None).into();

assert_eq!(pe.rejection(), Some(PairCodeRejection::RateOverlimit));
assert!(pe.rejection().is_some_and(PairCodeRejection::is_throttled));
Expand All @@ -1346,13 +1335,8 @@ mod tests {
/// `RateOverlimit` without matching the message.
#[test]
fn rate_overlimit_is_recoverable_as_a_typed_status() {
let pe: PairError = IqError::ServerError {
code: 429,
text: "rate-overlimit".into(),
error_type: None,
backoff: Some(30),
}
.into();
let pe: PairError =
crate::test_utils::server_error_iq(429, "rate-overlimit", None, Some(30)).into();

assert_eq!(pe.rejection(), Some(PairCodeRejection::RateOverlimit));
assert_eq!(pe.backoff(), Some(std::time::Duration::from_secs(30)));
Expand All @@ -1373,13 +1357,8 @@ mod tests {
/// of falling back to the QR code the way WA Web does.
#[test]
fn feature_not_available_is_not_throttled() {
let pe: PairError = IqError::ServerError {
code: 452,
text: "feature-not-available".into(),
error_type: None,
backoff: None,
}
.into();
let pe: PairError =
crate::test_utils::server_error_iq(452, "feature-not-available", None, None).into();

assert_eq!(pe.rejection(), Some(PairCodeRejection::FeatureNotAvailable));
assert!(!PairCodeRejection::FeatureNotAvailable.is_throttled());
Expand Down Expand Up @@ -1450,12 +1429,7 @@ mod tests {

#[test]
fn pair_error_request_failed_preserves_iq_source() {
let iq = IqError::ServerError {
code: 400,
text: "bad-request".into(),
error_type: None,
backoff: None,
};
let iq = crate::test_utils::server_error_iq(400, "bad-request", None, None);
let pe: PairError = iq.into();
let src = std::error::Error::source(&pe).expect("source preserved");
let downcast = src.downcast_ref::<IqError>().expect("downcasts to IqError");
Expand Down Expand Up @@ -1980,12 +1954,7 @@ mod tests {
&client,
&[1, 2, 3, 4],
1,
IqError::ServerError {
code: 500,
text: "internal-server-error".to_string(),
error_type: None,
backoff: None,
},
crate::test_utils::server_error_iq(500, "internal-server-error", None, None),
)
.await;

Expand All @@ -2012,12 +1981,7 @@ mod tests {
&client,
&[1, 2, 3, 4],
1,
IqError::ServerError {
code: 400,
text: "bad-request".to_string(),
error_type: None,
backoff: None,
},
crate::test_utils::server_error_iq(400, "bad-request", None, None),
)
.await;

Expand Down
Loading
Loading