@@ -7,8 +7,10 @@ import com.lightspark.sdk.crypto.PasswordRecoverySigningKeyLoader
77import com.lightspark.sdk.model.Account
88import com.lightspark.sdk.model.BitcoinNetwork
99import com.lightspark.sdk.model.IncomingPayment
10+ import com.lightspark.sdk.model.Invoice
1011import com.lightspark.sdk.model.LightsparkNode
1112import com.lightspark.sdk.model.OutgoingPayment
13+ import com.lightspark.sdk.model.PaymentRequestStatus
1214import com.lightspark.sdk.model.Transaction
1315import com.lightspark.sdk.model.TransactionStatus
1416import com.lightspark.sdk.model.WithdrawalMode
@@ -28,6 +30,7 @@ import kotlinx.datetime.TimeZone
2830import kotlinx.datetime.minus
2931import org.mockito.Mockito.spy
3032import org.mockito.Mockito.`when`
33+ import java.security.MessageDigest
3134import kotlin.random.Random
3235
3336@OptIn(ExperimentalCoroutinesApi ::class )
@@ -363,6 +366,30 @@ class ClientIntegrationTests {
363366 println (hashedUmaNewMonth)
364367 }
365368
369+ @Test
370+ fun `create and settle a hold invoice` () = runTest {
371+ val node = getFirstOskNode()
372+ val preimage = generateRandomHexString()
373+ val paymentHash = sha256Hash(preimage)
374+ var invoice = client.createInvoice(node.id, 1000 , paymentHash = paymentHash)
375+
376+ println (" encoded invoice: $invoice .data.encodedPaymentRequest}" )
377+
378+ client.loadNodeSigningKey(node.id, PasswordRecoverySigningKeyLoader (node.id, NODE_PASSWORD ))
379+ val outgoingPayment = client.payInvoice(node.id, invoice.data.encodedPaymentRequest, maxFeesMsats = 100_000 )
380+ outgoingPayment.shouldNotBeNull()
381+
382+ println (" outgoing payment: $outgoingPayment " )
383+
384+ client.releasePaymentPreimage(invoice.id, preimage)
385+ while (invoice.status == PaymentRequestStatus .OPEN ) {
386+ delay(500 )
387+ invoice = Invoice .getInvoiceQuery(invoice.id).execute(client)!!
388+ invoice.shouldNotBeNull()
389+ println (" Invoice status: ${invoice.status} " )
390+ }
391+ }
392+
366393 // TODO: Add tests for withdrawals and deposits.
367394
368395 private suspend fun getFirstOskNode (): LightsparkNode {
@@ -382,4 +409,17 @@ class ClientIntegrationTests {
382409 account.shouldNotBeNull()
383410 return account
384411 }
412+
413+ private fun sha256Hash (input : String ): String {
414+ val bytes = input.toByteArray()
415+ val digest = MessageDigest .getInstance(" SHA-256" ).digest(bytes)
416+ return digest.joinToString(" " ) { " %02x" .format(it) }
417+ }
418+
419+ private fun generateRandomHexString (): String {
420+ val allowedChars = (' a' .. ' f' ) + (' 0' .. ' 9' )
421+ return (1 .. 64 )
422+ .map { allowedChars.random(Random .Default ) }
423+ .joinToString(" " )
424+ }
385425}
0 commit comments