Skip to content

Commit 9dcca47

Browse files
committed
Add ser/deser tests for ReceiverSessionEvent
This commit adds test coverage for the full serialization/deserialization round trip for each receiver session event.
1 parent 761832a commit 9dcca47

2 files changed

Lines changed: 74 additions & 2 deletions

File tree

payjoin/src/receive/v1/mod.rs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,26 @@ pub(crate) mod test {
807807
UncheckedProposal { psbt: PARSED_ORIGINAL_PSBT.clone(), params }
808808
}
809809

810-
fn wants_outputs_from_test_vector(proposal: UncheckedProposal) -> WantsOutputs {
810+
pub(crate) fn maybe_inputs_owned_from_test_vector() -> MaybeInputsOwned {
811+
let proposal = unchecked_proposal_from_test_vector();
812+
proposal
813+
.check_broadcast_suitability(None, |_| Ok(true))
814+
.expect("Broadcast suitability check should not fail")
815+
}
816+
817+
pub(crate) fn maybe_inputs_seen_from_test_vector() -> MaybeInputsSeen {
818+
let maybe_inputs_owned = maybe_inputs_owned_from_test_vector();
819+
maybe_inputs_owned.check_inputs_not_owned(|_| Ok(false)).expect("No inputs should be owned")
820+
}
821+
822+
pub(crate) fn outputs_unknown_from_test_vector() -> OutputsUnknown {
823+
let maybe_inputs_seen = maybe_inputs_seen_from_test_vector();
824+
maybe_inputs_seen
825+
.check_no_inputs_seen_before(|_| Ok(false))
826+
.expect("No inputs should be seen before")
827+
}
828+
829+
pub(crate) fn wants_outputs_from_test_vector(proposal: UncheckedProposal) -> WantsOutputs {
811830
proposal
812831
.assume_interactive_receiver()
813832
.check_inputs_not_owned(|_| Ok(false))
@@ -825,10 +844,25 @@ pub(crate) mod test {
825844
.expect("Receiver output should be identified")
826845
}
827846

828-
fn provisional_proposal_from_test_vector(proposal: UncheckedProposal) -> ProvisionalProposal {
847+
pub(crate) fn wants_inputs_from_test_vector() -> WantsInputs {
848+
let proposal = unchecked_proposal_from_test_vector();
849+
wants_outputs_from_test_vector(proposal).commit_outputs()
850+
}
851+
852+
pub(crate) fn provisional_proposal_from_test_vector(
853+
proposal: UncheckedProposal,
854+
) -> ProvisionalProposal {
829855
wants_outputs_from_test_vector(proposal).commit_outputs().commit_inputs()
830856
}
831857

858+
pub(crate) fn payjoin_proposal_from_test_vector(
859+
proposal: UncheckedProposal,
860+
) -> PayjoinProposal {
861+
provisional_proposal_from_test_vector(proposal)
862+
.finalize_proposal(|_| Ok(PARSED_ORIGINAL_PSBT.clone()), None, None)
863+
.expect("finalize_proposal should not fail")
864+
}
865+
832866
#[test]
833867
fn is_output_substitution_disabled() {
834868
let mut proposal = unchecked_proposal_from_test_vector();

payjoin/src/receive/v2/persist.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,41 @@ pub enum SessionEvent {
4848
/// b/c its a terminal state and there is nothing to replay. So serialization will be lossy and that is fine.
4949
SessionInvalid(String),
5050
}
51+
52+
#[cfg(test)]
53+
mod tests {
54+
use super::*;
55+
use crate::receive::v1::test::{
56+
maybe_inputs_owned_from_test_vector, maybe_inputs_seen_from_test_vector,
57+
outputs_unknown_from_test_vector, payjoin_proposal_from_test_vector,
58+
provisional_proposal_from_test_vector, unchecked_proposal_from_test_vector,
59+
wants_inputs_from_test_vector, wants_outputs_from_test_vector,
60+
};
61+
use crate::receive::v2::test::SHARED_CONTEXT;
62+
63+
#[test]
64+
fn test_session_event_serialization_roundtrip() {
65+
let unchecked_proposal = unchecked_proposal_from_test_vector();
66+
let test_cases = vec![
67+
SessionEvent::Created(SHARED_CONTEXT.clone()),
68+
SessionEvent::UncheckedProposal(unchecked_proposal.clone()),
69+
SessionEvent::MaybeInputsOwned(maybe_inputs_owned_from_test_vector()),
70+
SessionEvent::MaybeInputsSeen(maybe_inputs_seen_from_test_vector()),
71+
SessionEvent::OutputsUnknown(outputs_unknown_from_test_vector()),
72+
SessionEvent::WantsOutputs(wants_outputs_from_test_vector(unchecked_proposal.clone())),
73+
SessionEvent::WantsInputs(wants_inputs_from_test_vector()),
74+
SessionEvent::ProvisionalProposal(provisional_proposal_from_test_vector(
75+
unchecked_proposal.clone(),
76+
)),
77+
SessionEvent::PayjoinProposal(payjoin_proposal_from_test_vector(
78+
unchecked_proposal.clone(),
79+
)),
80+
];
81+
for event in test_cases {
82+
let serialized = serde_json::to_string(&event).expect("Serialization should not fail");
83+
let deserialized: SessionEvent =
84+
serde_json::from_str(&serialized).expect("Deserialization should not fail");
85+
assert_eq!(event, deserialized);
86+
}
87+
}
88+
}

0 commit comments

Comments
 (0)