Skip to content

Commit ff121b8

Browse files
committed
Add e2e test for hold invoices
santi/hold-invoice-test
1 parent d8157b5 commit ff121b8

1 file changed

Lines changed: 40 additions & 0 deletions

File tree

lightspark-sdk/src/commonTest/kotlin/com/lightspark/sdk/ClientIntegrationTests.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import com.lightspark.sdk.crypto.PasswordRecoverySigningKeyLoader
77
import com.lightspark.sdk.model.Account
88
import com.lightspark.sdk.model.BitcoinNetwork
99
import com.lightspark.sdk.model.IncomingPayment
10+
import com.lightspark.sdk.model.Invoice
1011
import com.lightspark.sdk.model.LightsparkNode
1112
import com.lightspark.sdk.model.OutgoingPayment
13+
import com.lightspark.sdk.model.PaymentRequestStatus
1214
import com.lightspark.sdk.model.Transaction
1315
import com.lightspark.sdk.model.TransactionStatus
1416
import com.lightspark.sdk.model.WithdrawalMode
@@ -28,6 +30,7 @@ import kotlinx.datetime.TimeZone
2830
import kotlinx.datetime.minus
2931
import org.mockito.Mockito.spy
3032
import org.mockito.Mockito.`when`
33+
import java.security.MessageDigest
3134
import 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

Comments
 (0)