@@ -559,3 +559,87 @@ fn chain_update(
559
559
}
560
560
Ok ( tip)
561
561
}
562
+
563
+ #[ cfg( test) ]
564
+ mod test {
565
+ use crate :: { bdk_electrum_client:: TxUpdate , BdkElectrumClient } ;
566
+ use bdk_chain:: bitcoin:: { Amount , OutPoint , ScriptBuf , Transaction , TxIn , TxOut } ;
567
+ use bdk_testenv:: { utils:: new_tx, TestEnv } ;
568
+ use std:: { collections:: BTreeMap , sync:: Arc } ;
569
+
570
+ #[ test]
571
+ fn test_populate_with_txids_without_output ( ) {
572
+ let env = TestEnv :: new ( ) . unwrap ( ) ;
573
+ let electrum_client =
574
+ electrum_client:: Client :: new ( env. electrsd . electrum_url . as_str ( ) ) . unwrap ( ) ;
575
+ let client = BdkElectrumClient :: new ( electrum_client) ;
576
+
577
+ // Setup transaction with no outputs.
578
+ let tx = new_tx ( 0 ) ;
579
+
580
+ // Populate tx_cache with `tx` to make it fetchable.
581
+ client. populate_tx_cache ( vec ! [ tx. clone( ) ] ) ;
582
+
583
+ // Test that populate_with_txids does not panic or process a tx with no output.
584
+ let mut tx_update = TxUpdate :: default ( ) ;
585
+ let _ = client. populate_with_txids ( & mut tx_update, vec ! [ tx. compute_txid( ) ] ) ;
586
+
587
+ assert_eq ! ( tx_update. txs, Vec :: new( ) ) ;
588
+ }
589
+
590
+ #[ test]
591
+ fn test_fetch_prev_txout_with_coinbase ( ) {
592
+ let env = TestEnv :: new ( ) . unwrap ( ) ;
593
+ let electrum_client =
594
+ electrum_client:: Client :: new ( env. electrsd . electrum_url . as_str ( ) ) . unwrap ( ) ;
595
+ let client = BdkElectrumClient :: new ( electrum_client) ;
596
+
597
+ // Setup the transactions necessary for fetch_prev_txout to fetch `txouts` for `tx`.
598
+ let expected_txout = TxOut {
599
+ value : Amount :: from_sat ( 10_000 ) ,
600
+ script_pubkey : ScriptBuf :: default ( ) ,
601
+ } ;
602
+
603
+ let prev_tx = Transaction {
604
+ output : vec ! [ expected_txout. clone( ) ] ,
605
+ ..new_tx ( 0 )
606
+ } ;
607
+
608
+ let expected_outpoint = OutPoint :: new ( prev_tx. compute_txid ( ) , 0 ) ;
609
+
610
+ let tx = Transaction {
611
+ input : vec ! [ TxIn {
612
+ previous_output: expected_outpoint,
613
+ ..Default :: default ( )
614
+ } ] ,
615
+ ..new_tx ( 0 )
616
+ } ;
617
+
618
+ // Populate tx_cache with `prev_tx` to make it fetchable.
619
+ client. populate_tx_cache ( vec ! [ prev_tx. clone( ) ] ) ;
620
+
621
+ // Test fetch_prev_txout to see if we get our expected `txouts`.
622
+ let mut tx_update = TxUpdate {
623
+ txs : vec ! [ Arc :: new( tx. clone( ) ) ] ,
624
+ ..Default :: default ( )
625
+ } ;
626
+ let _ = client. fetch_prev_txout ( & mut tx_update) ;
627
+
628
+ assert_eq ! (
629
+ tx_update. txouts,
630
+ BTreeMap :: from( [ ( expected_outpoint, expected_txout) ] )
631
+ ) ;
632
+
633
+ // Assert that `tx` is now a coinbase transaction.
634
+ let _ = client. update_coinbase_txid ( tx. compute_txid ( ) ) ;
635
+
636
+ // Test that fetch_prev_txout does not fetch `txouts` for coinbase tx.
637
+ let mut tx_update = TxUpdate {
638
+ txs : vec ! [ Arc :: new( tx) ] ,
639
+ ..Default :: default ( )
640
+ } ;
641
+ let _ = client. fetch_prev_txout ( & mut tx_update) ;
642
+
643
+ assert_eq ! ( tx_update. txouts, BTreeMap :: default ( ) ) ;
644
+ }
645
+ }
0 commit comments