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