@@ -248,3 +248,64 @@ impl FinalizedProposal {
248248
249249 pub fn v2 ( & self ) -> & [ v2:: UncheckedProposal ] { & self . v2_proposals }
250250}
251+
252+ #[ cfg( test) ]
253+ mod test {
254+
255+ use std:: any:: { Any , TypeId } ;
256+
257+ use payjoin_test_utils:: { BoxError , PARSED_ORIGINAL_PSBT } ;
258+
259+ use super :: { v1, v2, FinalizedProposal , UncheckedProposalBuilder , SUPPORTED_VERSIONS } ;
260+ use crate :: receive:: optional_parameters:: Params ;
261+ use crate :: receive:: v2:: test:: SHARED_CONTEXT ;
262+
263+ fn multiparty_proposal_from_test_vector ( ) -> v1:: UncheckedProposal {
264+ let pairs = url:: form_urlencoded:: parse ( "v=2&optimisticmerge=true" . as_bytes ( ) ) ;
265+ let params = Params :: from_query_pairs ( pairs, SUPPORTED_VERSIONS )
266+ . expect ( "Could not parse from query pairs" ) ;
267+ v1:: UncheckedProposal { psbt : PARSED_ORIGINAL_PSBT . clone ( ) , params }
268+ }
269+
270+ #[ test]
271+ fn test_build_multiparty ( ) -> Result < ( ) , BoxError > {
272+ let proposal_one = v2:: UncheckedProposal {
273+ v1 : multiparty_proposal_from_test_vector ( ) ,
274+ context : SHARED_CONTEXT . clone ( ) ,
275+ } ;
276+ let proposal_two = v2:: UncheckedProposal {
277+ v1 : multiparty_proposal_from_test_vector ( ) ,
278+ context : SHARED_CONTEXT . clone ( ) ,
279+ } ;
280+ let mut multiparty = UncheckedProposalBuilder :: new ( ) ;
281+ multiparty. add ( proposal_one) ?;
282+ multiparty. add ( proposal_two) ?;
283+ let unchecked_proposal = multiparty. build ( ) ;
284+ assert ! ( unchecked_proposal?. contexts. len( ) == 2 ) ;
285+ Ok ( ( ) )
286+ }
287+
288+ #[ test]
289+ fn finalize_multiparty ( ) -> Result < ( ) , BoxError > {
290+ use crate :: psbt:: PsbtExt ;
291+ let proposal_one = v2:: UncheckedProposal {
292+ v1 : multiparty_proposal_from_test_vector ( ) ,
293+ context : SHARED_CONTEXT . clone ( ) ,
294+ } ;
295+ let proposal_two = v2:: UncheckedProposal {
296+ v1 : multiparty_proposal_from_test_vector ( ) ,
297+ context : SHARED_CONTEXT . clone ( ) ,
298+ } ;
299+ let mut finalized_multiparty = FinalizedProposal :: new ( ) ;
300+ finalized_multiparty. add ( proposal_one. clone ( ) ) ?;
301+ assert_eq ! ( finalized_multiparty. v2( ) [ 0 ] . type_id( ) , TypeId :: of:: <v2:: UncheckedProposal >( ) ) ;
302+
303+ finalized_multiparty. add ( proposal_two) ?;
304+ assert_eq ! ( finalized_multiparty. v2( ) [ 1 ] . type_id( ) , TypeId :: of:: <v2:: UncheckedProposal >( ) ) ;
305+
306+ let multiparty_psbt =
307+ finalized_multiparty. combine ( ) . expect ( "could not create PSBT from finalized proposal" ) ;
308+ assert ! ( multiparty_psbt. validate_input_utxos( ) . is_ok( ) ) ;
309+ Ok ( ( ) )
310+ }
311+ }
0 commit comments