diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05Verifier.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05Verifier.kt index e86a85633..8eb63b2d8 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05Verifier.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05Verifier.kt @@ -76,13 +76,13 @@ class Nip05Verifier() { nip05, onSuccess = { val nip05url = try { - mapper.readTree(it) + mapper.readTree(it.lowercase()) } catch (t: Throwable) { onError("Error Parsing JSON from Lightning Address. Check the user's lightning setup") null } - val user = nip05.split("@")[0] + val user = nip05.split("@")[0].lowercase() val hexKey = nip05url?.get("names")?.get(user)?.asText() diff --git a/app/src/test/java/com/vitorpamplona/amethyst/service/Nip05VerifierTest.kt b/app/src/test/java/com/vitorpamplona/amethyst/service/Nip05VerifierTest.kt new file mode 100644 index 000000000..afd6107de --- /dev/null +++ b/app/src/test/java/com/vitorpamplona/amethyst/service/Nip05VerifierTest.kt @@ -0,0 +1,121 @@ +package com.vitorpamplona.amethyst.service + +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.impl.annotations.SpyK +import io.mockk.unmockkAll +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Assert.fail +import org.junit.Before +import org.junit.Test + +class Nip05VerifierTest { + private val ALL_UPPER_CASE_USER_NAME = "ONETWO" + private val ALL_LOWER_CASE_USER_NAME = "onetwo" + + @SpyK + var nip05Verifier = Nip05Verifier() + + @Before + fun setUp() = MockKAnnotations.init(this) + + @Test + fun `test with matching case on user name`() { + // Set-up + val userNameToTest = ALL_UPPER_CASE_USER_NAME + val expectedPubKey = "ca29c211f1c72d5b6622268ff43d2288ea2b2cb5b9aa196ff9f1704fc914b71b" + + val nostrJson = "{\n" + + " \"names\": {\n" + + " \"$userNameToTest\": \"$expectedPubKey\" \n" + + " }\n" + + "}" + + every { nip05Verifier.fetchNip05Json(any(), any(), any()) } answers { + secondArg<(String) -> Unit>().invoke(nostrJson) + } + + val nip05 = "$userNameToTest@domain.com" + var actualPubkeyHex = "" + + // Execution + nip05Verifier.verifyNip05( + nip05, + onSuccess = { + actualPubkeyHex = it + }, + onError = { + fail("Test failure") + } + ) + + // Verification + assertEquals(expectedPubKey, actualPubkeyHex) + } + + @Test + fun `test with NOT matching case on user name`() { + // Set-up + val expectedPubKey = "ca29c211f1c72d5b6622268ff43d2288ea2b2cb5b9aa196ff9f1704fc914b71b" + + val nostrJson = "{\n" + + " \"names\": {\n" + + " \"$ALL_UPPER_CASE_USER_NAME\": \"$expectedPubKey\" \n" + + " }\n" + + "}" + every { nip05Verifier.fetchNip05Json(any(), any(), any()) } answers { + secondArg<(String) -> Unit>().invoke(nostrJson) + } + + val nip05 = "$ALL_LOWER_CASE_USER_NAME@domain.com" + var actualPubkeyHex = "" + + // Execution + nip05Verifier.verifyNip05( + nip05, + onSuccess = { + actualPubkeyHex = it + }, + onError = { + fail("Test failure") + } + ) + + // Verification + assertEquals(expectedPubKey, actualPubkeyHex) + } + + @After + fun tearDown() { + unmockkAll() + } + + @Test + fun `execute assemble url with invalid value returns null`() { + // given + val nip05address = "this@that@that.com" + + // when + val actualValue = nip05Verifier.assembleUrl(nip05address) + + // then + assertNull(actualValue) + } + + @Test + fun `execute assemble url with valid value returns nip05 url`() { + // given + val userName = "TheUser" + val domain = "domain.com" + val nip05address = "$userName@$domain" + val expectedValue = "https://$domain/.well-known/nostr.json?name=$userName" + + // when + val actualValue = nip05Verifier.assembleUrl(nip05address) + + // then + assertEquals(expectedValue, actualValue) + } +}