@@ -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