Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,80 +1,23 @@
// Instrumented tests for parse_input() LNURL handling.
// Covers LNURL bech32 strings, lightning addresses, prefix handling,
// and error cases. Pure parsing only — no node, no network.
// Instrumented tests for parse_input() error cases on LNURL /
// Lightning Address inputs. `parse_input` is offline — these all
// reject before any HTTP would be attempted. Successful HTTP
// resolution is covered by `resolveInput` in gl-testing integration
// tests against a live LNURL fixture.

package com.blockstream.glsdk

import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Assert.*
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class LnurlParseTest {

// LNURL bech32 encoding of https://service.com/lnurl (LUD-01 example).
private val lnurlBech32 =
"LNURL1DP68GURN8GHJ7CMFWP5X2UNSW4HXKTNRDAKJ7CTSDYHHVVF0D3H82UNV9UCSAXQZE2"

// ============================================================
// LNURL bech32 parsing
// ============================================================

@Test
fun parse_lnurl_bech32_uppercase() {
val result = parseInput(lnurlBech32)
assertTrue(
"Expected LnUrl, got $result",
result is InputType.LnUrl,
)
}

@Test
fun parse_lnurl_bech32_lowercase() {
val result = parseInput(lnurlBech32.lowercase())
assertTrue(
"Expected LnUrl, got $result",
result is InputType.LnUrl,
)
}

@Test
fun parse_lnurl_with_lightning_prefix() {
val result = parseInput("lightning:$lnurlBech32")
assertTrue(
"Expected LnUrl, got $result",
result is InputType.LnUrl,
)
}

@Test(expected = Exception::class)
fun parse_invalid_lnurl_bech32_returns_error() {
parseInput("LNURL1INVALIDDATA")
}

// ============================================================
// Lightning address parsing
// ============================================================

@Test
fun parse_lightning_address_simple() {
val result = parseInput("user@example.com")
assertTrue(
"Expected LnUrlAddress, got $result",
result is InputType.LnUrlAddress,
)
assertEquals("user@example.com", (result as InputType.LnUrlAddress).address)
}

@Test
fun parse_lightning_address_with_symbols() {
val result = parseInput("sat.oshi-99@example.com")
assertTrue(
"Expected LnUrlAddress, got $result",
result is InputType.LnUrlAddress,
)
}

@Test(expected = Exception::class)
fun parse_lightning_address_no_dot_in_domain_returns_error() {
parseInput("user@localhost")
Expand All @@ -89,4 +32,4 @@ class LnurlParseTest {
fun parse_lightning_address_empty_domain_returns_error() {
parseInput("user@")
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// Instrumented tests for parse_input().
// Tests BOLT11 invoice parsing, node ID parsing, and error cases.
// Instrumented tests for the synchronous parse_input().
// `parse_input` is offline — no HTTP, no I/O. LNURL HTTP resolution
// is `resolveInput` and is covered by gl-testing integration tests.

package com.blockstream.glsdk

Expand All @@ -22,14 +23,18 @@ class ParseInputTest {
"d2q9qgsqqqyssqszpxzxt9uuqzymr7zxcdccj5g69s8q7zzjs7sgxn9ejhnvdh6gqjcy" +
"22mss2yexunagm5r2gqczh8k24cwrqml3njskm548aruhpwssq9nvrvz"

// Bech32-encoded "https://service.com/lnurl"
private val lnurlBech32 =
"LNURL1DP68GURN8GHJ7CMFWP5X2UNSW4HXKTNRDAKJ7CTSDYHHVVF0D3H82UNV9UCSAXQZE2"

// ============================================================
// Node ID parsing
// ============================================================

@Test
fun parse_valid_node_id() {
val result = parseInput(validNodeId)
assertNotNull(result)
assertTrue("Expected NodeId, got $result", result is ParsedInput.NodeId)
}

@Test(expected = Exception::class)
Expand All @@ -49,19 +54,38 @@ class ParseInputTest {
@Test
fun parse_valid_bolt11() {
val result = parseInput(bolt11Invoice)
assertNotNull(result)
assertTrue("Expected Bolt11, got $result", result is ParsedInput.Bolt11)
}

@Test
fun parse_bolt11_with_lightning_prefix() {
val result = parseInput("lightning:$bolt11Invoice")
assertNotNull(result)
assertTrue("Expected Bolt11, got $result", result is ParsedInput.Bolt11)
}

@Test
fun parse_bolt11_with_uppercase_prefix() {
val result = parseInput("LIGHTNING:$bolt11Invoice")
assertNotNull(result)
assertTrue("Expected Bolt11, got $result", result is ParsedInput.Bolt11)
}

// ============================================================
// LNURL bech32 / Lightning Address — offline classification
// ============================================================

@Test
fun parse_lnurl_bech32_decodes_url() {
val result = parseInput(lnurlBech32)
assertTrue("Expected LnUrl, got $result", result is ParsedInput.LnUrl)
val url = (result as ParsedInput.LnUrl).url
assertTrue("Expected decoded https URL, got $url", url.startsWith("https://"))
}

@Test
fun parse_lightning_address() {
val result = parseInput("user@example.com")
assertTrue("Expected LnUrlAddress, got $result", result is ParsedInput.LnUrlAddress)
assertEquals("user@example.com", (result as ParsedInput.LnUrlAddress).address)
}

// ============================================================
Expand Down
Loading
Loading