+ #[test]
+ fn pays_pubkey_with_amount() {
+ let event_handled = core::cell::RefCell::new(false);
+ let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
+
+ let pubkey = pubkey();
+ let payment_preimage = PaymentPreimage([1; 32]);
+ let payment_hash = PaymentHash(Sha256::hash(&payment_preimage.0).into_inner());
+ let final_value_msat = 100;
+ let final_cltv_expiry_delta = 42;
+
+ let payer = TestPayer::new()
+ .expect_send(Amount::Spontaneous(final_value_msat))
+ .expect_send(Amount::ForInvoiceOrRetry(final_value_msat));
+ let router = TestRouter {};
+ let scorer = RefCell::new(TestScorer::new());
+ let logger = TestLogger::new();
+ let invoice_payer =
+ InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(2));
+
+ let payment_id = Some(invoice_payer.pay_pubkey(
+ pubkey, payment_preimage, final_value_msat, final_cltv_expiry_delta
+ ).unwrap());
+ assert_eq!(*payer.attempts.borrow(), 1);
+
+ let retry = RouteParameters {
+ payee: Payee::for_keysend(pubkey),
+ final_value_msat,
+ final_cltv_expiry_delta,
+ };
+ let event = Event::PaymentPathFailed {
+ payment_id,
+ payment_hash,
+ network_update: None,
+ rejected_by_dest: false,
+ all_paths_failed: false,
+ path: vec![],
+ short_channel_id: None,
+ retry: Some(retry),
+ };
+ invoice_payer.handle_event(&event);
+ assert_eq!(*event_handled.borrow(), false);
+ assert_eq!(*payer.attempts.borrow(), 2);
+
+ invoice_payer.handle_event(&Event::PaymentSent {
+ payment_id, payment_preimage, payment_hash, fee_paid_msat: None
+ });
+ assert_eq!(*event_handled.borrow(), true);
+ assert_eq!(*payer.attempts.borrow(), 2);
+ }
+