diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/system/RandomIdManager.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/system/RandomIdManager.kt
index e7379b9903d5ebece7825fad8523a8770e57aec3..66c89d17ca66c261845310241a16d4034abab19c 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/system/RandomIdManager.kt
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/system/RandomIdManager.kt
@@ -3,7 +3,7 @@ package org.briarproject.mailbox.core.system
 import java.security.SecureRandom
 import javax.inject.Inject
 
-private const val ID_SIZE = 32
+internal const val ID_SIZE = 32
 private const val ID_HEX_SIZE = ID_SIZE * 2
 
 /**
diff --git a/mailbox-core/src/test/java/org/briarproject/mailbox/core/TestUtils.kt b/mailbox-core/src/test/java/org/briarproject/mailbox/core/TestUtils.kt
index 2025f841c43d7de9eae5293f0adc759d9616710f..23a0b6c77fbc36516e49a97c3b55ad47c2c3bfd7 100644
--- a/mailbox-core/src/test/java/org/briarproject/mailbox/core/TestUtils.kt
+++ b/mailbox-core/src/test/java/org/briarproject/mailbox/core/TestUtils.kt
@@ -1,7 +1,15 @@
 package org.briarproject.mailbox.core
 
+import io.mockk.every
+import io.mockk.mockk
+import org.briarproject.mailbox.core.contacts.Contact
+import org.briarproject.mailbox.core.db.Database
+import org.briarproject.mailbox.core.db.Transaction
+import org.briarproject.mailbox.core.system.ID_SIZE
+import org.briarproject.mailbox.core.system.toHex
 import org.briarproject.mailbox.core.util.IoUtils
 import java.io.File
+import kotlin.random.Random
 
 object TestUtils {
 
@@ -10,4 +18,21 @@ object TestUtils {
         testDir.parentFile.delete() // Delete if empty
     }
 
+    fun getNewRandomId(): String = Random.nextBytes(ID_SIZE).toHex()
+
+    fun getNewRandomContact(id: Int = Random.nextInt(1, Int.MAX_VALUE)) = Contact(
+        contactId = id,
+        token = getNewRandomId(),
+        inboxId = getNewRandomId(),
+        outboxId = getNewRandomId(),
+    )
+
+    fun <T> everyTransactionWithResult(db: Database, readOnly: Boolean, block: (Transaction) -> T) {
+        val txn = Transaction(mockk(), readOnly)
+        every { db.transactionWithResult<T>(true, captureLambda()) } answers {
+            lambda<(Transaction) -> T>().captured.invoke(txn)
+        }
+        block(txn)
+    }
+
 }