Skip to content

Commit 8eaf7ae

Browse files
committed
Add session history error tests
1 parent 4003ac9 commit 8eaf7ae

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
@@ -228,9 +228,10 @@ mod tests {
228228
use crate::receive::tests::original_from_test_vector;
229229
use crate::receive::v2::test::{mock_err, SHARED_CONTEXT};
230230
use crate::receive::v2::{
231-
Initialized, MaybeInputsOwned, PayjoinProposal, ProvisionalProposal, Receiver,
232-
UncheckedOriginalPayload,
231+
HasReplyableError, Initialized, MaybeInputsOwned, PayjoinProposal, ProvisionalProposal,
232+
Receiver, UncheckedOriginalPayload,
233233
};
234+
use crate::receive::{InternalPayloadError, PayloadError};
234235

235236
fn unchecked_receiver_from_test_vector() -> Receiver<UncheckedOriginalPayload> {
236237
Receiver {
@@ -607,6 +608,82 @@ mod tests {
607608
run_session_history_test(test)
608609
}
609610

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

0 commit comments

Comments
 (0)