Skip to content

Commit a8c32ec

Browse files
committed
Add session history error tests
1 parent 12539ef commit a8c32ec

1 file changed

Lines changed: 79 additions & 2 deletions

File tree

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

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,9 +227,10 @@ mod tests {
227227
use crate::receive::tests::original_from_test_vector;
228228
use crate::receive::v2::test::{mock_err, SHARED_CONTEXT};
229229
use crate::receive::v2::{
230-
Initialized, MaybeInputsOwned, PayjoinProposal, ProvisionalProposal, Receiver,
231-
UncheckedOriginalPayload,
230+
HasReplyableError, Initialized, MaybeInputsOwned, PayjoinProposal, ProvisionalProposal,
231+
Receiver, UncheckedOriginalPayload,
232232
};
233+
use crate::receive::{InternalPayloadError, PayloadError};
233234

234235
fn unchecked_receiver_from_test_vector() -> Receiver<UncheckedOriginalPayload> {
235236
Receiver {
@@ -614,6 +615,82 @@ mod tests {
614615
run_session_history_test(test)
615616
}
616617

618+
#[test]
619+
fn test_session_fatal_error() -> Result<(), BoxError> {
620+
let persister = NoopSessionPersister::<SessionEvent>::default();
621+
let session_context = SHARED_CONTEXT.clone();
622+
let mut events = vec![];
623+
624+
let original = original_from_test_vector();
625+
// Original PSBT is not broadcastable
626+
let _unbroadcastable = unchecked_receiver_from_test_vector()
627+
.check_broadcast_suitability(None, |_| Ok(false))
628+
.save(&persister)
629+
.expect_err("Unbroadcastable should error");
630+
// NOTE: it would be good to assert against the internal error type but InternalPersistedError is private
631+
let expected_error = PayloadError(InternalPayloadError::OriginalPsbtNotBroadcastable);
632+
let reply_key = Some(crate::HpkeKeyPair::gen_keypair().1);
633+
634+
events.push(SessionEvent::Created(session_context.clone()));
635+
events.push(SessionEvent::RetrievedOriginalPayload {
636+
original: original.clone(),
637+
reply_key: reply_key.clone(),
638+
});
639+
events.push(SessionEvent::GotReplyableError((&expected_error).into()));
640+
events.push(SessionEvent::Closed(SessionOutcome::Failure));
641+
642+
let test = SessionHistoryTest {
643+
events,
644+
expected_session_history: SessionHistoryExpectedOutcome {
645+
psbt_with_fee_contributions: None,
646+
fallback_tx: None,
647+
expected_status: SessionStatus::Failed,
648+
},
649+
expected_receiver_state: ReceiveSession::HasReplyableError(Receiver {
650+
state: HasReplyableError { error_reply: (&expected_error).into() },
651+
session_context: SessionContext { reply_key, ..session_context },
652+
}),
653+
};
654+
run_session_history_test(test)
655+
}
656+
657+
#[test]
658+
fn test_session_transient_error() -> Result<(), BoxError> {
659+
let persister = NoopSessionPersister::<SessionEvent>::default();
660+
let session_context = SHARED_CONTEXT.clone();
661+
let mut events = vec![];
662+
663+
let original = original_from_test_vector();
664+
// Mock some implementation error
665+
let _maybe_broadcastable = unchecked_receiver_from_test_vector()
666+
.check_broadcast_suitability(None, |_| Err("mock error".into()))
667+
.save(&persister)
668+
.expect_err("Mock error should error");
669+
// NOTE: it would be good to assert against the internal error type but InternalPersistedError is private
670+
671+
let reply_key = Some(crate::HpkeKeyPair::gen_keypair().1);
672+
673+
events.push(SessionEvent::Created(session_context.clone()));
674+
events.push(SessionEvent::RetrievedOriginalPayload {
675+
original: original.clone(),
676+
reply_key: reply_key.clone(),
677+
});
678+
679+
let test = SessionHistoryTest {
680+
events,
681+
expected_session_history: SessionHistoryExpectedOutcome {
682+
psbt_with_fee_contributions: None,
683+
fallback_tx: None,
684+
expected_status: SessionStatus::Active,
685+
},
686+
expected_receiver_state: ReceiveSession::UncheckedOriginalPayload(Receiver {
687+
state: UncheckedOriginalPayload { original },
688+
session_context: SessionContext { reply_key, ..session_context },
689+
}),
690+
};
691+
run_session_history_test(test)
692+
}
693+
617694
#[test]
618695
fn test_session_history_uri() -> Result<(), BoxError> {
619696
let session_context = SHARED_CONTEXT.clone();

0 commit comments

Comments
 (0)