Skip to content

Commit 5967e14

Browse files
committed
Add Unified QR send/receive integration tests
- Added `unified_qr_send_receive` test to verify the `UnifedQrPayment` functionality - Added logic to handle paying a `BOLT12` offer, `BOLT11` invoice, and if those fail `On-chain` tx from a URI. - Validated each payments successful event - Ensured the off-chain and on-chain balacnes reflected the payment attempts
1 parent 02cd06e commit 5967e14

File tree

1 file changed

+120
-4
lines changed

1 file changed

+120
-4
lines changed

tests/integration_tests_rust.rs

Lines changed: 120 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
mod common;
22

33
use common::{
4-
do_channel_full_cycle, expect_event, expect_payment_received_event,
4+
do_channel_full_cycle, expect_channel_ready_event, expect_event, expect_payment_received_event,
55
expect_payment_successful_event, generate_blocks_and_wait, open_channel,
66
premine_and_distribute_funds, random_config, setup_bitcoind_and_electrsd, setup_builder,
77
setup_node, setup_two_nodes, wait_for_tx, TestSyncStore,
88
};
99

10-
use ldk_node::payment::PaymentKind;
10+
use ldk_node::payment::{PaymentKind, PaymentResult};
1111
use ldk_node::{Builder, Event, NodeError};
1212

1313
use lightning::ln::channelmanager::PaymentId;
@@ -17,8 +17,6 @@ use bitcoin::{Amount, Network};
1717

1818
use std::sync::Arc;
1919

20-
use crate::common::expect_channel_ready_event;
21-
2220
#[test]
2321
fn channel_full_cycle() {
2422
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
@@ -552,3 +550,121 @@ fn simple_bolt12_send_receive() {
552550
}
553551
assert_eq!(node_a_payments.first().unwrap().amount_msat, Some(overpaid_amount));
554552
}
553+
554+
#[test]
555+
fn unified_qr_send_receive() {
556+
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
557+
let (node_a, node_b) = setup_two_nodes(&electrsd, false, true, false);
558+
559+
let address_a = node_a.onchain_payment().new_address().unwrap();
560+
let premined_sats = 5_000_000;
561+
562+
premine_and_distribute_funds(
563+
&bitcoind.client,
564+
&electrsd.client,
565+
vec![address_a],
566+
Amount::from_sat(premined_sats),
567+
);
568+
569+
node_a.sync_wallets().unwrap();
570+
open_channel(&node_a, &node_b, 4_000_000, true, &electrsd);
571+
generate_blocks_and_wait(&bitcoind.client, &electrsd.client, 6);
572+
573+
node_a.sync_wallets().unwrap();
574+
node_b.sync_wallets().unwrap();
575+
576+
expect_channel_ready_event!(node_a, node_b.node_id());
577+
expect_channel_ready_event!(node_b, node_a.node_id());
578+
579+
// Sleep until we broadcast a node announcement.
580+
while node_b.status().latest_node_announcement_broadcast_timestamp.is_none() {
581+
std::thread::sleep(std::time::Duration::from_millis(10));
582+
}
583+
584+
// Sleep one more sec to make sure the node announcement propagates.
585+
std::thread::sleep(std::time::Duration::from_secs(1));
586+
587+
let expected_amount_msats = 100_000_000;
588+
let offer = node_b.bolt12_payment().receive(expected_amount_msats, "hi");
589+
590+
let offer_str = offer.clone().unwrap().to_string();
591+
let bolt12_offer_param = format!("&lightning={}", offer_str);
592+
593+
let expected_amount_sats = 100_000;
594+
let message = "TestMessage".to_string();
595+
let expiry_sec = 4_000;
596+
597+
let uqr_payment =
598+
node_b.unified_qr_payment().receive(expected_amount_sats, Some(message), expiry_sec);
599+
600+
let uri_str = uqr_payment.clone().unwrap();
601+
let uri_with_offer = format!("{}{}", uri_str, bolt12_offer_param);
602+
603+
let offer_payment_id: PaymentId = match node_a.unified_qr_payment().send(&uri_with_offer) {
604+
Ok(PaymentResult::Bolt12 { payment_id }) => {
605+
println!("\nBolt12 payment sent successfully with PaymentID: {:?}", payment_id);
606+
payment_id
607+
},
608+
Ok(PaymentResult::Bolt11 { payment_id: _ }) => {
609+
panic!("Expected Bolt12 payment but got Bolt11");
610+
},
611+
Ok(PaymentResult::Onchain { txid: _ }) => {
612+
panic!("Expected Bolt12 payment but get On-chain transaction");
613+
},
614+
Err(e) => {
615+
panic!("Expected Bolt12 payment but got error: {:?}", e);
616+
},
617+
};
618+
619+
expect_payment_successful_event!(node_a, Some(offer_payment_id), None);
620+
621+
let uri_with_invalid_offer = format!("{}{}", uri_str, "&lightning=some_invalid_offer");
622+
let invoice_payment_id: PaymentId =
623+
match node_a.unified_qr_payment().send(&uri_with_invalid_offer) {
624+
Ok(PaymentResult::Bolt12 { payment_id: _ }) => {
625+
panic!("Expected Bolt11 payment but got Bolt12");
626+
},
627+
Ok(PaymentResult::Bolt11 { payment_id }) => {
628+
println!("\nBolt11 payment sent successfully with PaymentID: {:?}", payment_id);
629+
payment_id
630+
},
631+
Ok(PaymentResult::Onchain { txid: _ }) => {
632+
panic!("Expected Bolt11 payment but got on-chain transaction");
633+
},
634+
Err(e) => {
635+
panic!("Expected Bolt11 payment but got error: {:?}", e);
636+
},
637+
};
638+
expect_payment_successful_event!(node_a, Some(invoice_payment_id), None);
639+
640+
let expect_onchain_amount_sats = 800_000;
641+
let onchain_uqr_payment = node_b
642+
.unified_qr_payment()
643+
.receive(expect_onchain_amount_sats, Some("Different Message".to_string()), 4_000)
644+
.unwrap();
645+
646+
let txid = match node_a.unified_qr_payment().send(onchain_uqr_payment.as_str()) {
647+
Ok(PaymentResult::Bolt12 { payment_id: _ }) => {
648+
panic!("Expected on-chain payment but got Bolt12")
649+
},
650+
Ok(PaymentResult::Bolt11 { payment_id: _ }) => {
651+
panic!("Expected on-chain payment but got Bolt11");
652+
},
653+
Ok(PaymentResult::Onchain { txid }) => {
654+
println!("\nOn-chain transaction successful with Txid: {}", txid);
655+
txid
656+
},
657+
Err(e) => {
658+
panic!("Expected on-chain payment but got error: {:?}", e);
659+
},
660+
};
661+
662+
generate_blocks_and_wait(&bitcoind.client, &electrsd.client, 6);
663+
wait_for_tx(&electrsd.client, txid);
664+
665+
node_a.sync_wallets().unwrap();
666+
node_b.sync_wallets().unwrap();
667+
668+
assert_eq!(node_b.list_balances().total_onchain_balance_sats, 800_000);
669+
assert_eq!(node_b.list_balances().total_lightning_balance_sats, 200_000);
670+
}

0 commit comments

Comments
 (0)