commit dc3eaaac936a65dc385b0c1471a13b455dbe4134
parent 7803c39f8c0990884ce91f66e9e52fbe85e1aad4
Author: t3sserakt <t3sserakt@posteo.de>
Date: Thu, 27 Nov 2025 13:08:12 +0100
Merge branch 'import-from-repob'
Diffstat:
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