messenger-android

Android graphical user interfaces for GNUnet Messenger
Log | Files | Refs | README | LICENSE

commit dc3eaaac936a65dc385b0c1471a13b455dbe4134
parent 7803c39f8c0990884ce91f66e9e52fbe85e1aad4
Author: t3sserakt <t3sserakt@posteo.de>
Date:   Thu, 27 Nov 2025 13:08:12 +0100

Merge branch 'import-from-repob'

Diffstat:
AGNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/logic/MessageValidator.kt | 13+++++++++++++
MGNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/model/ChatContext.kt | 5+++--
MGNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/service/mock/GnunetChatMock.kt | 52+++++++++++++++++++++++++++++++++++++++-------------
AGNUnetMessenger/app/src/test/java/org/gnunet/gnunetmessenger/logic/MessageValidatorTest.kt | 39+++++++++++++++++++++++++++++++++++++++
AGNUnetMessenger/app/src/test/java/org/gnunet/gnunetmessenger/service/mock/GnunetChatMockTest.kt | 157+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MGNUnetMessenger/gradle/libs.versions.toml | 4++--
MGNUnetMessenger/gradle/wrapper/gradle-wrapper.properties | 2+-
7 files changed, 254 insertions(+), 18 deletions(-)

diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/logic/MessageValidator.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/logic/MessageValidator.kt @@ -0,0 +1,12 @@ +package org.gnunet.gnunetmessenger.logic + +// This is the simple class we want to test. +// Its job is to check if a message is valid before sending. +class MessageValidator { + + fun isValid(message: String): Boolean { + // A simple rule: the message cannot be blank. + return message.isNotBlank() + } + +} +\ No newline at end of file diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/model/ChatContext.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/model/ChatContext.kt @@ -29,8 +29,9 @@ import kotlinx.parcelize.Parcelize @Parcelize data class ChatContext ( - val chatContextType: ChatContextType, + val chatContextType: ChatContextType?, var userPointer: String?, val isGroup: Boolean, - val isPlatform: Boolean): Parcelable + val isPlatform: Boolean +): Parcelable diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/service/mock/GnunetChatMock.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/service/mock/GnunetChatMock.kt @@ -44,6 +44,17 @@ class GnunetChatMock : GnunetChat { private lateinit var messageCallback: (ChatContext, ChatMessage) -> Unit private var uuidCounter: Long = 0 + var lastDestroyedUri: ChatUri? = null + private set + + var lastSetUserPointer: Pair<ChatContact?, String?>? = null + private set + var lastSetGroupPointer: Pair<ChatGroup?, String?>? = null + private set + + var lastSetMessageForGroupContact: Triple<ChatGroup?, ChatContact?, ChatMessage?>? = null + private set + override suspend fun awaitReady(handle: ChatHandle) { return } @@ -146,11 +157,14 @@ class GnunetChatMock : GnunetChat { } override fun parseUri(uri: String): ChatUri { - TODO("Not yet implemented") + // Return a fake, hard-coded ChatUri. + // We'll just put the URI we received inside it. + return ChatUri(uri) } override fun destroyUri(uri: ChatUri) { - TODO("Not yet implemented") + // This is our "side effect" that the test can check + lastDestroyedUri = uri } override fun inviteContactToGroup(group: ChatGroup, contact: ChatContact) { @@ -179,19 +193,30 @@ class GnunetChatMock : GnunetChat { } override fun getMessageForGroupContact(group: ChatGroup, contact: ChatContact): ChatMessage { - TODO("Not yet implemented") + // Return a fixed, hard-coded ChatMessage for testing + return ChatMessage( + ChatContext(null, null, false, false), + "fake-message-for-group", + 12345L, + contact, + MessageKind.TEXT, + null + ) } override fun getMessageKind(message: ChatMessage): MessageKind { - TODO("Not yet implemented") + // Always return TEXT for our mock + return MessageKind.TEXT } override fun isMessageRecent(message: ChatMessage): GnunetReturnValue { - TODO("Not yet implemented") + // Always return OK for our mock + return GnunetReturnValue.OK } override fun getMessageTimestamp(message: ChatMessage): Long { - TODO("Not yet implemented") + // Return a fixed, hard-coded timestamp for testing + return 123456789L } override fun setMessageForGroupContact( @@ -199,7 +224,7 @@ class GnunetChatMock : GnunetChat { contact: ChatContact, message: ChatMessage ) { - TODO("Not yet implemented") + lastSetMessageForGroupContact = Triple(group, contact, message) } override fun iterateContacts(handle: ChatHandle, callback: (ChatContact) -> Int) { @@ -268,19 +293,21 @@ class GnunetChatMock : GnunetChat { } override fun getContactUserPointer(chatContact: ChatContact): String { - TODO("Not yet implemented") + // Return a fixed, hard-coded string for testing + return "fake-user-pointer-123" } override fun setContactUserPointer(chatContact: ChatContact, userPointer: String) { - TODO("Not yet implemented") + lastSetUserPointer = Pair(chatContact, userPointer) } override fun getGroupUserPointer(chatGroup: ChatGroup): String { - TODO("Not yet implemented") + // Return a fixed, hard-coded string for testing + return "fake-group-pointer-789" } override fun setGroupUserPointer(chatGroup: ChatGroup, userPointer: String) { - println("set group name") + lastSetGroupPointer = Pair(chatGroup, userPointer) } override fun sendText(chatContext: ChatContext, text: String) { @@ -348,4 +375,4 @@ class GnunetChatMock : GnunetChat { override fun unshareAttributes(handle: ChatHandle, contact: ChatContact, key: String) { println("unshare ${key} for contact ${contact.name}") } -} -\ No newline at end of file +} diff --git a/GNUnetMessenger/app/src/test/java/org/gnunet/gnunetmessenger/logic/MessageValidatorTest.kt b/GNUnetMessenger/app/src/test/java/org/gnunet/gnunetmessenger/logic/MessageValidatorTest.kt @@ -0,0 +1,38 @@ +package org.gnunet.gnunetmessenger.logic + +// Import the tools we need from the JUnit testing library +import org.junit.Assert.assertEquals +import org.junit.Test + +class MessageValidatorTest { + + // The @Test annotation tells the system this is a test function + @Test + fun `isValid returns true for a normal message`() { + // 1. Arrange: Set up your test + val validator = MessageValidator() + val message = "Hello, world!" + + // 2. Act: Call the function you want to test + val result = validator.isValid(message) + + // 3. Assert: Check if the result is what you expected + // We expect 'true' because the message is valid + assertEquals(true, result) + } + + // Test case 2: Check an empty message + @Test + fun `isValid returns false for an empty message`() { + // Arrange + val validator = MessageValidator() + val message = "" // Empty string + + // Act + val result = validator.isValid(message) + + // Assert + // This time, we expect the result to be 'false' + assertEquals(false, result) + } +} +\ No newline at end of file diff --git a/GNUnetMessenger/app/src/test/java/org/gnunet/gnunetmessenger/service/mock/GnunetChatMockTest.kt b/GNUnetMessenger/app/src/test/java/org/gnunet/gnunetmessenger/service/mock/GnunetChatMockTest.kt @@ -0,0 +1,156 @@ +package org.gnunet.gnunetmessenger.service.mock + +import org.gnunet.gnunetmessenger.model.ChatHandle +import org.gnunet.gnunetmessenger.model.ChatContext +import org.gnunet.gnunetmessenger.model.ChatMessage +import org.gnunet.gnunetmessenger.model.MessageKind +import org.gnunet.gnunetmessenger.model.ChatUri +import org.gnunet.gnunetmessenger.model.GnunetReturnValue +import org.gnunet.gnunetmessenger.model.ChatContact +import org.gnunet.gnunetmessenger.model.ChatGroup +import org.junit.Assert.assertEquals +import org.junit.Test + +class GnunetChatMockTest { + + @Test + fun iterateAccountsReturnsTheHardcodedAccountNames() { + val mock = GnunetChatMock() + + val fakeHandle = ChatHandle(1) + + val resultingNames = mutableListOf<String>() + + mock.iterateAccounts(fakeHandle) { account -> + resultingNames.add(account.name) + } + + val expectedNames = listOf("Alice", "Bob", "Charlie") + + assertEquals(3, resultingNames.size) + assertEquals(expectedNames, resultingNames) + } + + @Test + fun getMessageTimestampReturnsTheHardcodedTimestamp() { + val mock = GnunetChatMock() + + val fakeMessage = ChatMessage(ChatContext(null, null, false, false), "", 0, null, MessageKind.TEXT, null) + val resultTimestamp = mock.getMessageTimestamp(fakeMessage) + + assertEquals(123456789L, resultTimestamp) + } + + @Test + fun parseUriReturnsAChatUriObjectWithTheCorrectUri() { + val mock = GnunetChatMock() + val testUriString = "gnunet://example-uri/12345" + + val resultChatUri = mock.parseUri(testUriString) + + assertEquals(testUriString, resultChatUri.error) + } + + @Test + fun isMessageRecentAlwaysReturnsOk() { + val mock = GnunetChatMock() + + val fakeMessage = ChatMessage(ChatContext(null, null, false, false), "", 0, null, MessageKind.TEXT, null) + + val result = mock.isMessageRecent(fakeMessage) + + assertEquals(GnunetReturnValue.OK, result) + } + + @Test + fun getMessageKindAlwaysReturnsText() { + val mock = GnunetChatMock() + + val fakeMessage = ChatMessage(ChatContext(null, null, false, false), "", 0, null, MessageKind.TEXT, null) + + val result = mock.getMessageKind(fakeMessage) + + assertEquals(MessageKind.TEXT, result) + } + + @Test + fun destroyUriSetsTheLastDestroyedUriProperty() { + val mock = GnunetChatMock() + val fakeUri = ChatUri("gnunet://test-uri-to-destroy") + + mock.destroyUri(fakeUri) + + assertEquals(fakeUri, mock.lastDestroyedUri) + } + + @Test + fun getContactUserPointerReturnsAHardcodedString() { + val mock = GnunetChatMock() + + val fakeContact = ChatContact(ChatContext(null, null, false, false), "") + + val result = mock.getContactUserPointer(fakeContact) + + assertEquals("fake-user-pointer-123", result) + } + + @Test + fun setContactUserPointerSetsTheLastSetUserPointerProperty() { + val mock = GnunetChatMock() + val fakeContact = ChatContact(ChatContext(null, null, false, false), "test-contact") + val fakePointer = "test-pointer-456" + + mock.setContactUserPointer(fakeContact, fakePointer) + + assertEquals(Pair(fakeContact, fakePointer), mock.lastSetUserPointer) + } + + @Test + fun getGroupUserPointerReturnsAHardcodedString() { + val mock = GnunetChatMock() + + val fakeGroup = ChatGroup(ChatContext(null, null, false, false), "") + + val result = mock.getGroupUserPointer(fakeGroup) + + assertEquals("fake-group-pointer-789", result) + } + + @Test + fun setGroupUserPointerSetsTheLastSetGroupPointerProperty() { + val mock = GnunetChatMock() + val fakeGroup = ChatGroup(ChatContext(null, null, false, false), "test-group") + val fakePointer = "test-group-pointer-xyz" + + mock.setGroupUserPointer(fakeGroup, fakePointer) + + assertEquals(Pair(fakeGroup, fakePointer), mock.lastSetGroupPointer) + } + + @Test + fun getMessageForGroupContactReturnsAHardcodedChatMessage() { + + val mock = GnunetChatMock() + val fakeGroup = ChatGroup(ChatContext(null, null, false, false), "test-group") + val fakeContact = ChatContact(ChatContext(null, null, false, false), "test-contact") + + val resultMessage = mock.getMessageForGroupContact(fakeGroup, fakeContact) + + assertEquals("fake-message-for-group", resultMessage.text) + assertEquals(MessageKind.TEXT, resultMessage.kind) + assertEquals(fakeContact, resultMessage.sender) // Check it attached the contact + } + + @Test + fun setMessageForGroupContactSetsTheLastSetMessageForGroupContactProperty() { + val mock = GnunetChatMock() + val fakeGroup = ChatGroup(ChatContext(null, null, false, false), "test-group") + val fakeContact = ChatContact(ChatContext(null, null, false, false), "test-contact") + val fakeMessage = ChatMessage(ChatContext(null, null, false, false), "test-msg", 0, null, MessageKind.TEXT, null) + + + mock.setMessageForGroupContact(fakeGroup, fakeContact, fakeMessage) + + assertEquals(Triple(fakeGroup, fakeContact, fakeMessage), mock.lastSetMessageForGroupContact) + } +} +\ No newline at end of file diff --git a/GNUnetMessenger/gradle/libs.versions.toml b/GNUnetMessenger/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] -agp = "8.9.1" +agp = "8.13.0" cardview = "1.0.0" -kotlin = "2.0.21" +kotlin = "2.2.0" coreKtx = "1.10.1" junit = "4.13.2" junitVersion = "1.1.5" diff --git a/GNUnetMessenger/gradle/wrapper/gradle-wrapper.properties b/GNUnetMessenger/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Mar 25 19:27:57 CET 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists