Skip to content

Commit a905fe9

Browse files
committed
Add Receiver<HasReplyableError> test
1 parent a8c32ec commit a905fe9

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
@@ -1181,7 +1181,7 @@ pub mod test {
11811181

11821182
use super::*;
11831183
use crate::output_substitution::OutputSubstitution;
1184-
use crate::persist::{NoopSessionPersister, RejectTransient, Rejection};
1184+
use crate::persist::{NoopSessionPersister, RejectFatal, RejectTransient, Rejection};
11851185
use crate::receive::optional_parameters::Params;
11861186
use crate::receive::v2;
11871187
use crate::ImplementationError;
@@ -1292,6 +1292,41 @@ pub mod test {
12921292
Ok(())
12931293
}
12941294

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

0 commit comments

Comments
 (0)