diff --git a/app/src/main/kotlin/com/wisp/app/nostr/Blossom.kt b/app/src/main/kotlin/com/wisp/app/nostr/Blossom.kt index 7dc2d7f3..09035804 100644 --- a/app/src/main/kotlin/com/wisp/app/nostr/Blossom.kt +++ b/app/src/main/kotlin/com/wisp/app/nostr/Blossom.kt @@ -26,14 +26,20 @@ object Blossom { if (tag.size >= 2 && tag[0] == "server") { val url = tag[1].toHttpUrlOrNull() url?.toString() - } - else { + } else { null } }.distinct() } + /** + * Builds BUD-03 server tags from a non-empty list of unique already-valid server URLs. + * URL validation is expected to happen when URLs enter repository/viewmodel state. + * + * @throws IllegalArgumentException if [urls] is empty. + */ fun buildServerListTags(urls: List): List> { + require(urls.isNotEmpty()) { "Blossom server list must contain at least one server" } return urls.map { listOf("server", it) } } diff --git a/app/src/test/kotlin/com/wisp/app/nostr/BlossomTest.kt b/app/src/test/kotlin/com/wisp/app/nostr/BlossomTest.kt index 29adbada..2a1d48e9 100644 --- a/app/src/test/kotlin/com/wisp/app/nostr/BlossomTest.kt +++ b/app/src/test/kotlin/com/wisp/app/nostr/BlossomTest.kt @@ -128,4 +128,30 @@ class BlossomTest { result ) } + + @Test + fun `buildServerListTags throws IllegalArgumentException when urls are empty`() { + val emptyUrls = emptyList() + assertFailsWith { Blossom.buildServerListTags(emptyUrls) } + } + + @Test + fun `buildServerListTags builds server tags preserving order`() { + val valid1 = "http://example.com" + val valid2 = "https://example.com/" + val singleServerTags = Blossom.buildServerListTags(listOf(valid1)) + assertEquals( + listOf( + listOf("server", valid1) + ), singleServerTags + ) + + val manyServerTags = Blossom.buildServerListTags(listOf(valid2, valid1)) + assertEquals( + listOf( + listOf("server", valid2), + listOf("server", valid1) + ), manyServerTags + ) + } } \ No newline at end of file