Skip to content

Commit ab1ba54

Browse files
committed
Add Receiver<HasReplyableError> test
1 parent 8eaf7ae commit ab1ba54

2 files changed

Lines changed: 37 additions & 2 deletions

File tree

payjoin/src/core/persist.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ impl<Event, Err> Rejection<Event, Err> {
231231

232232
/// Represents a fatal rejection of a state transition.
233233
/// When this error occurs, the session must be closed and cannot be resumed.
234-
pub struct RejectFatal<Event, Err>(Event, Err);
234+
pub struct RejectFatal<Event, Err>(pub(crate) Event, pub(crate) Err);
235235
/// Represents a transient rejection of a state transition.
236236
/// When this error occurs, the session should resume from its current state.
237237
pub struct RejectTransient<Err>(pub(crate) Err);

payjoin/src/core/receive/v2/mod.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1179,7 +1179,7 @@ pub mod test {
11791179

11801180
use super::*;
11811181
use crate::output_substitution::OutputSubstitution;
1182-
use crate::persist::{NoopSessionPersister, RejectTransient, Rejection};
1182+
use crate::persist::{NoopSessionPersister, RejectFatal, RejectTransient, Rejection};
11831183
use crate::receive::optional_parameters::Params;
11841184
use crate::receive::v2;
11851185
use crate::ImplementationError;
@@ -1291,6 +1291,41 @@ pub mod test {
12911291
Ok(())
12921292
}
12931293

1294+
#[test]
1295+
fn test_unchecked_proposal_fatal_error() -> Result<(), BoxError> {
1296+
let unchecked_proposal = unchecked_proposal_v2_from_test_vector();
1297+
let receiver =
1298+
v2::Receiver { state: unchecked_proposal, session_context: SHARED_CONTEXT.clone() };
1299+
1300+
let receive_session = ReceiveSession::UncheckedOriginalPayload(receiver.clone());
1301+
let unchecked_proposal =
1302+
receiver.check_broadcast_suitability(Some(FeeRate::MIN), |_| Ok(false));
1303+
1304+
let event = match &unchecked_proposal {
1305+
MaybeFatalTransition(Err(Rejection::Fatal(RejectFatal(
1306+
event,
1307+
Error::Protocol(error),
1308+
)))) => {
1309+
assert_eq!(
1310+
error.to_string(),
1311+
InternalPayloadError::OriginalPsbtNotBroadcastable.to_string()
1312+
);
1313+
event.clone()
1314+
}
1315+
_ => panic!("Expected fatal error"),
1316+
};
1317+
1318+
let has_error = match receive_session.process_event(event) {
1319+
Ok(ReceiveSession::HasReplyableError(r)) => r,
1320+
_ => panic!("Expected HasError"),
1321+
};
1322+
1323+
let _err_req = has_error.create_error_request(EXAMPLE_URL.as_str())?;
1324+
// TODO: assert process_error_response terminally closes session
1325+
1326+
Ok(())
1327+
}
1328+
12941329
#[test]
12951330
fn test_maybe_inputs_seen_transient_error() -> Result<(), BoxError> {
12961331
let persister = NoopSessionPersister::default();

0 commit comments

Comments
 (0)