@@ -32,7 +32,7 @@ use ldk_server_client::ldk_server_grpc::events::{
3232use ldk_server_client:: ldk_server_grpc:: types:: {
3333 bolt11_invoice_description, Bolt11InvoiceDescription ,
3434} ;
35-
35+ use ldk_server_grpc :: types :: payment_kind ;
3636const EVENT_TIMEOUT : Duration = Duration :: from_secs ( 15 ) ;
3737
3838async fn wait_for_event ( events : & mut EventStream , pred : impl Fn ( & Event ) -> bool ) -> EventEnvelope {
@@ -1462,3 +1462,40 @@ async fn test_metrics_endpoint_with_auth() {
14621462 assert ! ( metrics. contains( "ldk_server_total_anchor_channels_reserve_sats 0" ) ) ;
14631463 assert ! ( metrics. contains( "ldk_server_total_lightning_balance_sats 0" ) ) ;
14641464}
1465+
1466+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1467+ async fn test_cli_spontaneous_send_with_preimage ( ) {
1468+ let bitcoind = TestBitcoind :: new ( ) ;
1469+ let server_a = LdkServerHandle :: start ( & bitcoind) . await ;
1470+ let server_b = LdkServerHandle :: start ( & bitcoind) . await ;
1471+
1472+ let mut events_b = server_b. client ( ) . subscribe_events ( ) . await . unwrap ( ) ;
1473+
1474+ setup_funded_channel ( & bitcoind, & server_a, & server_b, 100_000 ) . await ;
1475+
1476+ // Generate a known preimage and compute its payment hash
1477+ let preimage_bytes = [ 43u8 ; 32 ] ;
1478+ let preimage_hex = preimage_bytes. to_lower_hex_string ( ) ;
1479+ let payment_hash = sha256:: Hash :: hash ( & preimage_bytes) ;
1480+ let payment_hash_hex = payment_hash. to_byte_array ( ) . to_lower_hex_string ( ) ;
1481+
1482+ let output = run_cli (
1483+ & server_a,
1484+ & [ "spontaneous-send" , server_b. node_id ( ) , "10000sat" , "--preimage" , & preimage_hex] ,
1485+ ) ;
1486+
1487+ assert ! ( !output[ "payment_id" ] . as_str( ) . unwrap( ) . is_empty( ) ) ;
1488+
1489+ // The receiver must observe in PaymentReceived for checking on Spontaneous payment.
1490+ let event_b = wait_for_event ( & mut events_b, |e| matches ! ( e, Event :: PaymentReceived ( _) ) ) . await ;
1491+ let Some ( Event :: PaymentReceived ( pr) ) = event_b. event else {
1492+ panic ! ( "expected PaymentReceived" ) ;
1493+ } ;
1494+
1495+ let payment = pr. payment . unwrap ( ) ;
1496+
1497+ let Some ( payment_kind:: Kind :: Spontaneous ( spont) ) = payment. kind . unwrap ( ) . kind else {
1498+ panic ! ( "expected spontaneous kind" ) ;
1499+ } ;
1500+ assert_eq ! ( spont. hash, payment_hash_hex) ;
1501+ }
0 commit comments