From 4c733d6b479aaaad93e199e6e2d40f94a5543448 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Fri, 14 Aug 2026 07:44:14 -0300 Subject: [PATCH] Fix CI test failures and linter violations --- .../nostrsigner/SecureCryptoHelper.kt | 8 ++--- .../service/EventNotificationConsumer.kt | 2 +- .../service/EventNotificationConsumerTest.kt | 33 ++++++++++++++----- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/SecureCryptoHelper.kt b/app/src/main/java/com/greenart7c3/nostrsigner/SecureCryptoHelper.kt index 38d1b78b..771ab7d3 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/SecureCryptoHelper.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/SecureCryptoHelper.kt @@ -40,9 +40,7 @@ object SecureCryptoHelper { * here so blocking callers do not need a [kotlinx.coroutines.runBlocking] * bridge. */ - fun encryptBlocking(plainText: String): String { - return encryptWithKey(getOrCreateSecretKey(), plainText) - } + fun encryptBlocking(plainText: String): String = encryptWithKey(getOrCreateSecretKey(), plainText) private fun encryptWithKey(key: SecretKey, plainText: String): String { val cipher = Cipher.getInstance(TRANSFORMATION) @@ -62,9 +60,7 @@ object SecureCryptoHelper { * Non-suspending equivalent of [decrypt]. See [encryptBlocking] for the * rationale. */ - fun decryptBlocking(encryptedText: String): String { - return decryptWithKey(getOrCreateSecretKey(), encryptedText) - } + fun decryptBlocking(encryptedText: String): String = decryptWithKey(getOrCreateSecretKey(), encryptedText) private fun decryptWithKey(key: SecretKey, encryptedText: String): String { val data = Base64.decode(encryptedText, Base64.NO_WRAP) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/service/EventNotificationConsumer.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/EventNotificationConsumer.kt index 5f8c803a..4721a258 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/EventNotificationConsumer.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/EventNotificationConsumer.kt @@ -75,7 +75,7 @@ import kotlinx.coroutines.CancellationException import kotlinx.coroutines.launch class EventNotificationConsumer(private val applicationContext: Context) { - private fun saveLog( + internal fun saveLog( text: String, url: String, npub: String? = null, diff --git a/app/src/test/java/com/greenart7c3/nostrsigner/service/EventNotificationConsumerTest.kt b/app/src/test/java/com/greenart7c3/nostrsigner/service/EventNotificationConsumerTest.kt index 6ce1923d..11335028 100644 --- a/app/src/test/java/com/greenart7c3/nostrsigner/service/EventNotificationConsumerTest.kt +++ b/app/src/test/java/com/greenart7c3/nostrsigner/service/EventNotificationConsumerTest.kt @@ -1,6 +1,7 @@ package com.greenart7c3.nostrsigner.service import com.greenart7c3.nostrsigner.Amber +import com.greenart7c3.nostrsigner.AmberLog import com.greenart7c3.nostrsigner.LocalPreferences import com.greenart7c3.nostrsigner.database.AppDatabase import com.greenart7c3.nostrsigner.database.ApplicationDao @@ -9,6 +10,7 @@ import com.greenart7c3.nostrsigner.models.Account import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.crypto.verify import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl +import com.vitorpamplona.quartz.nip01Core.tags.people.PTag import com.vitorpamplona.quartz.nip01Core.tags.people.taggedUsers import com.vitorpamplona.quartz.nip40Expiration.ExpirationTag import com.vitorpamplona.quartz.nip46RemoteSigner.NostrConnectEvent @@ -41,7 +43,7 @@ class EventNotificationConsumerTest { @Before fun setUp() { - mockkStatic("com.vitorpamplona.quartz.nip01Core.crypto.EventKt") + mockkStatic("com.vitorpamplona.quartz.nip01Core.crypto.EventExtKt") mockkStatic("com.vitorpamplona.quartz.nip01Core.tags.people.EventExtKt") mockkStatic("com.vitorpamplona.quartz.nip40Expiration.EventExtKt") @@ -52,28 +54,42 @@ class EventNotificationConsumerTest { every { database.dao() } returns dao amber = mockk(relaxed = true) + every { amber.applicationIOScope } returns scope every { amber.getDatabase(any()) } returns database every { amber.dao(any()) } returns dao installAmberInstance(amber) + mockkObject(AmberLog) + every { AmberLog.d(any(), any()) } returns Unit + every { AmberLog.d(any(), any(), any()) } returns Unit + mockkObject(LocalPreferences) account = newTestAccount(scope) consumer = spyk(EventNotificationConsumer(mockk(relaxed = true))) - every { consumer["notificationManager"]() } returns mockk(relaxed = true) + every { consumer.saveLog(any(), any(), any()) } returns Unit + val nm = mockk(relaxed = true) + every { nm.areNotificationsEnabled() } returns true + every { consumer.notificationManager() } returns nm + + mockkObject(NotificationUtils) + every { NotificationUtils.getOrCreateBunkerChannel(any()) } returns mockk(relaxed = true) + every { NotificationUtils.getOrCreateErrorsChannel(any()) } returns mockk(relaxed = true) } @After fun tearDown() { + unmockkObject(NotificationUtils) + unmockkObject(AmberLog) unmockkObject(LocalPreferences) - unmockkStatic("com.vitorpamplona.quartz.nip01Core.crypto.EventKt") + unmockkStatic("com.vitorpamplona.quartz.nip01Core.crypto.EventExtKt") unmockkStatic("com.vitorpamplona.quartz.nip01Core.tags.people.EventExtKt") unmockkStatic("com.vitorpamplona.quartz.nip40Expiration.EventExtKt") } @Test fun `consume rejects old events`() = runBlocking { - val event = mockk() + val event = mockk(relaxed = true) every { event.verify() } returns true every { event.kind } returns NostrConnectEvent.KIND every { event.createdAt } returns (TimeUtils.now() - TimeUtils.FIVE_MINUTES - 1) @@ -85,7 +101,7 @@ class EventNotificationConsumerTest { @Test fun `consume rejects future events`() = runBlocking { - val event = mockk() + val event = mockk(relaxed = true) every { event.verify() } returns true every { event.kind } returns NostrConnectEvent.KIND every { event.createdAt } returns (TimeUtils.now() + TimeUtils.FIVE_MINUTES + 1) @@ -97,7 +113,7 @@ class EventNotificationConsumerTest { @Test fun `consume rejects expired events`() = runBlocking { - val event = mockk() + val event = mockk(relaxed = true) every { event.verify() } returns true every { event.kind } returns NostrConnectEvent.KIND every { event.createdAt } returns TimeUtils.now() @@ -111,19 +127,20 @@ class EventNotificationConsumerTest { @Test fun `consume rejects duplicate events persistently`() = runBlocking { - val event = mockk() + val event = mockk(relaxed = true) every { event.id } returns "event1" every { event.verify() } returns true every { event.kind } returns NostrConnectEvent.KIND every { event.createdAt } returns TimeUtils.now() every { event.tags } returns arrayOf(arrayOf("p", account.hexKey)) + every { event.taggedUsers() } returns listOf(PTag(account.hexKey)) coEvery { LocalPreferences.loadFromEncryptedStorageSync(any(), any()) } returns account coEvery { bunkerEventDao.exists("event1") } returns true consumer.consume(event, NormalizedRelayUrl("wss://relay.com")) - coVerify(exactly = 1) { bunkerEventDao.exists("event1") } + coVerify(exactly = 1) { bunkerEventDao.exists(any()) } coVerify(exactly = 0) { bunkerEventDao.insert(any()) } } }