@@ -33,6 +33,7 @@ use ldk_server_client::ldk_server_grpc::events::{
3333use ldk_server_client:: ldk_server_grpc:: types:: {
3434 bolt11_invoice_description, Bolt11InvoiceDescription ,
3535} ;
36+ use ldk_server_grpc:: types:: payment_kind;
3637
3738const EVENT_TIMEOUT : Duration = Duration :: from_secs ( 15 ) ;
3839
@@ -1531,3 +1532,40 @@ async fn test_metrics_endpoint_with_auth() {
15311532 assert ! ( metrics. contains( "ldk_server_total_anchor_channels_reserve_sats 0" ) ) ;
15321533 assert ! ( metrics. contains( "ldk_server_total_lightning_balance_sats 0" ) ) ;
15331534}
1535+
1536+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1537+ async fn test_cli_spontaneous_send_with_preimage ( ) {
1538+ let bitcoind = TestBitcoind :: new ( ) ;
1539+ let server_a = LdkServerHandle :: start ( & bitcoind) . await ;
1540+ let server_b = LdkServerHandle :: start ( & bitcoind) . await ;
1541+
1542+ let mut events_b = server_b. client ( ) . subscribe_events ( ) . await . unwrap ( ) ;
1543+
1544+ setup_funded_channel ( & bitcoind, & server_a, & server_b, 100_000 ) . await ;
1545+
1546+ // Generate a known preimage and compute its payment hash
1547+ let preimage_bytes = [ 43u8 ; 32 ] ;
1548+ let preimage_hex = preimage_bytes. to_lower_hex_string ( ) ;
1549+ let payment_hash = sha256:: Hash :: hash ( & preimage_bytes) ;
1550+ let payment_hash_hex = payment_hash. to_byte_array ( ) . to_lower_hex_string ( ) ;
1551+
1552+ let output = run_cli (
1553+ & server_a,
1554+ & [ "spontaneous-send" , server_b. node_id ( ) , "10000sat" , "--preimage" , & preimage_hex] ,
1555+ ) ;
1556+
1557+ assert ! ( !output[ "payment_id" ] . as_str( ) . unwrap( ) . is_empty( ) ) ;
1558+
1559+ // The receiver must observe in PaymentReceived for checking on Spontaneous payment.
1560+ let event_b = wait_for_event ( & mut events_b, |e| matches ! ( e, Event :: PaymentReceived ( _) ) ) . await ;
1561+ let Some ( Event :: PaymentReceived ( pr) ) = event_b. event else {
1562+ panic ! ( "expected PaymentReceived" ) ;
1563+ } ;
1564+
1565+ let payment = pr. payment . unwrap ( ) ;
1566+
1567+ let Some ( payment_kind:: Kind :: Spontaneous ( spont) ) = payment. kind . unwrap ( ) . kind else {
1568+ panic ! ( "expected spontaneous kind" ) ;
1569+ } ;
1570+ assert_eq ! ( spont. hash, payment_hash_hex) ;
1571+ }
0 commit comments