Add unit test for RegistrationUtil.

This commit is contained in:
Cody Henthorne
2024-11-22 10:18:56 -05:00
committed by Greyson Parrelli
parent 34eef0bf5c
commit 7d24bff134
16 changed files with 356 additions and 134 deletions

View File

@@ -1,29 +1,27 @@
package org.thoughtcrime.securesms.components.emoji package org.thoughtcrime.securesms.components.emoji
import android.app.Application import android.app.Application
import androidx.test.core.app.ApplicationProvider
import io.mockk.every import io.mockk.every
import io.mockk.mockkObject import io.mockk.mockkObject
import org.junit.Assert import org.junit.Assert
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.ParameterizedRobolectricTestRunner import org.robolectric.ParameterizedRobolectricTestRunner
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import org.thoughtcrime.securesms.emoji.EmojiSource import org.thoughtcrime.securesms.emoji.EmojiSource
import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
@RunWith(ParameterizedRobolectricTestRunner::class) @RunWith(ParameterizedRobolectricTestRunner::class)
@Config(manifest = Config.NONE, application = Application::class) @Config(manifest = Config.NONE, application = Application::class)
class EmojiUtilTest_isEmoji(private val input: String?, private val output: Boolean) { class EmojiUtilTest_isEmoji(private val input: String?, private val output: Boolean) {
@get:Rule
val appDependencies = MockAppDependenciesRule()
@Throws(Exception::class) @Throws(Exception::class)
@Test @Test
fun isEmoji() { fun isEmoji() {
if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
val source = EmojiSource.loadAssetBasedEmojis() val source = EmojiSource.loadAssetBasedEmojis()
mockkObject(EmojiSource) { mockkObject(EmojiSource) {

View File

@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.components.settings.app.account.export package org.thoughtcrime.securesms.components.settings.app.account.export
import android.app.Application import android.app.Application
import androidx.test.core.app.ApplicationProvider
import com.fasterxml.jackson.core.JsonParseException import com.fasterxml.jackson.core.JsonParseException
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
@@ -12,14 +11,13 @@ import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertThrows import org.junit.Assert.assertThrows
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import org.thoughtcrime.securesms.providers.BlobProvider import org.thoughtcrime.securesms.providers.BlobProvider
import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
import org.thoughtcrime.securesms.util.JsonUtils import org.thoughtcrime.securesms.util.JsonUtils
import org.whispersystems.signalservice.api.SignalServiceAccountManager import org.whispersystems.signalservice.api.SignalServiceAccountManager
import java.io.IOException import java.io.IOException
@@ -28,6 +26,9 @@ import java.io.IOException
@Config(manifest = Config.NONE, application = Application::class) @Config(manifest = Config.NONE, application = Application::class)
class ExportAccountDataTest { class ExportAccountDataTest {
@get:Rule
val appDependencies = MockAppDependenciesRule()
private val mockJson: String = """ private val mockJson: String = """
{ {
"reportId": "4c0ca2aa-151b-4e9e-8bf4-ea2c64345a22", "reportId": "4c0ca2aa-151b-4e9e-8bf4-ea2c64345a22",
@@ -64,13 +65,6 @@ class ExportAccountDataTest {
} }
""" """
@Before
fun setup() {
if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
}
@Test @Test
fun `Export json without text field`() { fun `Export json without text field`() {
val scheduler = TestScheduler() val scheduler = TestScheduler()

View File

@@ -1,20 +1,19 @@
package org.thoughtcrime.securesms.crash package org.thoughtcrime.securesms.crash
import android.app.Application import android.app.Application
import androidx.test.core.app.ApplicationProvider
import io.mockk.every import io.mockk.every
import io.mockk.mockkObject import io.mockk.mockkObject
import io.mockk.unmockkAll import io.mockk.unmockkAll
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.assertIs import org.thoughtcrime.securesms.assertIs
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.RemoteConfig
import org.whispersystems.signalservice.api.push.ServiceId import org.whispersystems.signalservice.api.push.ServiceId
import java.util.UUID import java.util.UUID
@@ -23,14 +22,13 @@ import java.util.UUID
@Config(manifest = Config.NONE, application = Application::class) @Config(manifest = Config.NONE, application = Application::class)
class CrashConfigTest { class CrashConfigTest {
@get:Rule
val appDependencies = MockAppDependenciesRule()
@Before @Before
fun setup() { fun setup() {
mockkObject(RemoteConfig) mockkObject(RemoteConfig)
if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
mockkObject(SignalStore) mockkObject(SignalStore)
every { SignalStore.account.aci } returns ServiceId.ACI.from(UUID.randomUUID()) every { SignalStore.account.aci } returns ServiceId.ACI.from(UUID.randomUUID())
} }

View File

@@ -10,22 +10,25 @@ import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.conversation.colors.AvatarColor import org.thoughtcrime.securesms.conversation.colors.AvatarColor
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import org.thoughtcrime.securesms.notifications.profiles.NotificationProfile import org.thoughtcrime.securesms.notifications.profiles.NotificationProfile
import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.testing.TestDatabaseUtil import org.thoughtcrime.securesms.testing.TestDatabaseUtil
import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
import java.time.DayOfWeek import java.time.DayOfWeek
@RunWith(RobolectricTestRunner::class) @RunWith(RobolectricTestRunner::class)
@Config(manifest = Config.NONE, application = Application::class) @Config(manifest = Config.NONE, application = Application::class)
class NotificationProfileDatabaseTest { class NotificationProfileDatabaseTest {
@get:Rule
val appDependencies = MockAppDependenciesRule()
private lateinit var db: SQLiteDatabase private lateinit var db: SQLiteDatabase
private lateinit var database: NotificationProfileDatabase private lateinit var database: NotificationProfileDatabase
@@ -42,10 +45,6 @@ class NotificationProfileDatabaseTest {
} }
} }
if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
db = sqlCipher.writableDatabase db = sqlCipher.writableDatabase
database = NotificationProfileDatabase(ApplicationProvider.getApplicationContext(), sqlCipher) database = NotificationProfileDatabase(ApplicationProvider.getApplicationContext(), sqlCipher)
} }

View File

@@ -54,83 +54,83 @@ import java.util.function.Supplier
class MockApplicationDependencyProvider : AppDependencies.Provider { class MockApplicationDependencyProvider : AppDependencies.Provider {
override fun providePushServiceSocket(signalServiceConfiguration: SignalServiceConfiguration, groupsV2Operations: GroupsV2Operations): PushServiceSocket { override fun providePushServiceSocket(signalServiceConfiguration: SignalServiceConfiguration, groupsV2Operations: GroupsV2Operations): PushServiceSocket {
return mockk() return mockk(relaxed = true)
} }
override fun provideGroupsV2Operations(signalServiceConfiguration: SignalServiceConfiguration): GroupsV2Operations { override fun provideGroupsV2Operations(signalServiceConfiguration: SignalServiceConfiguration): GroupsV2Operations {
return mockk() return mockk(relaxed = true)
} }
override fun provideSignalServiceAccountManager(pushServiceSocket: PushServiceSocket, groupsV2Operations: GroupsV2Operations): SignalServiceAccountManager { override fun provideSignalServiceAccountManager(pushServiceSocket: PushServiceSocket, groupsV2Operations: GroupsV2Operations): SignalServiceAccountManager {
return mockk() return mockk(relaxed = true)
} }
override fun provideSignalServiceMessageSender(signalWebSocket: SignalWebSocket, protocolStore: SignalServiceDataStore, pushServiceSocket: PushServiceSocket): SignalServiceMessageSender { override fun provideSignalServiceMessageSender(signalWebSocket: SignalWebSocket, protocolStore: SignalServiceDataStore, pushServiceSocket: PushServiceSocket): SignalServiceMessageSender {
return mockk() return mockk(relaxed = true)
} }
override fun provideSignalServiceMessageReceiver(pushServiceSocket: PushServiceSocket): SignalServiceMessageReceiver { override fun provideSignalServiceMessageReceiver(pushServiceSocket: PushServiceSocket): SignalServiceMessageReceiver {
return mockk() return mockk(relaxed = true)
} }
override fun provideSignalServiceNetworkAccess(): SignalServiceNetworkAccess { override fun provideSignalServiceNetworkAccess(): SignalServiceNetworkAccess {
return mockk() return mockk(relaxed = true)
} }
override fun provideRecipientCache(): LiveRecipientCache { override fun provideRecipientCache(): LiveRecipientCache {
return mockk() return mockk(relaxed = true)
} }
override fun provideJobManager(): JobManager { override fun provideJobManager(): JobManager {
return mockk() return mockk(relaxed = true)
} }
override fun provideFrameRateTracker(): FrameRateTracker { override fun provideFrameRateTracker(): FrameRateTracker {
return mockk() return mockk(relaxed = true)
} }
override fun provideMegaphoneRepository(): MegaphoneRepository { override fun provideMegaphoneRepository(): MegaphoneRepository {
return mockk() return mockk(relaxed = true)
} }
override fun provideEarlyMessageCache(): EarlyMessageCache { override fun provideEarlyMessageCache(): EarlyMessageCache {
return mockk() return mockk(relaxed = true)
} }
override fun provideMessageNotifier(): MessageNotifier { override fun provideMessageNotifier(): MessageNotifier {
return mockk() return mockk(relaxed = true)
} }
override fun provideIncomingMessageObserver(): IncomingMessageObserver { override fun provideIncomingMessageObserver(): IncomingMessageObserver {
return mockk() return mockk(relaxed = true)
} }
override fun provideTrimThreadsByDateManager(): TrimThreadsByDateManager { override fun provideTrimThreadsByDateManager(): TrimThreadsByDateManager {
return mockk() return mockk(relaxed = true)
} }
override fun provideViewOnceMessageManager(): ViewOnceMessageManager { override fun provideViewOnceMessageManager(): ViewOnceMessageManager {
return mockk() return mockk(relaxed = true)
} }
override fun provideExpiringStoriesManager(): ExpiringStoriesManager { override fun provideExpiringStoriesManager(): ExpiringStoriesManager {
return mockk() return mockk(relaxed = true)
} }
override fun provideExpiringMessageManager(): ExpiringMessageManager { override fun provideExpiringMessageManager(): ExpiringMessageManager {
return mockk() return mockk(relaxed = true)
} }
override fun provideDeletedCallEventManager(): DeletedCallEventManager { override fun provideDeletedCallEventManager(): DeletedCallEventManager {
return mockk() return mockk(relaxed = true)
} }
override fun provideTypingStatusRepository(): TypingStatusRepository { override fun provideTypingStatusRepository(): TypingStatusRepository {
return mockk() return mockk(relaxed = true)
} }
override fun provideTypingStatusSender(): TypingStatusSender { override fun provideTypingStatusSender(): TypingStatusSender {
return mockk() return mockk(relaxed = true)
} }
override fun provideDatabaseObserver(): DatabaseObserver { override fun provideDatabaseObserver(): DatabaseObserver {
@@ -138,98 +138,98 @@ class MockApplicationDependencyProvider : AppDependencies.Provider {
} }
override fun providePayments(signalServiceAccountManager: SignalServiceAccountManager): Payments { override fun providePayments(signalServiceAccountManager: SignalServiceAccountManager): Payments {
return mockk() return mockk(relaxed = true)
} }
override fun provideShakeToReport(): ShakeToReport { override fun provideShakeToReport(): ShakeToReport {
return mockk() return mockk(relaxed = true)
} }
override fun provideSignalCallManager(): SignalCallManager { override fun provideSignalCallManager(): SignalCallManager {
return mockk() return mockk(relaxed = true)
} }
override fun providePendingRetryReceiptManager(): PendingRetryReceiptManager { override fun providePendingRetryReceiptManager(): PendingRetryReceiptManager {
return mockk() return mockk(relaxed = true)
} }
override fun providePendingRetryReceiptCache(): PendingRetryReceiptCache { override fun providePendingRetryReceiptCache(): PendingRetryReceiptCache {
return mockk() return mockk(relaxed = true)
} }
override fun provideSignalWebSocket(signalServiceConfigurationSupplier: Supplier<SignalServiceConfiguration>, libSignalNetworkSupplier: Supplier<Network>): SignalWebSocket { override fun provideSignalWebSocket(signalServiceConfigurationSupplier: Supplier<SignalServiceConfiguration>, libSignalNetworkSupplier: Supplier<Network>): SignalWebSocket {
return mockk() return mockk(relaxed = true)
} }
override fun provideProtocolStore(): SignalServiceDataStoreImpl { override fun provideProtocolStore(): SignalServiceDataStoreImpl {
return mockk() return mockk(relaxed = true)
} }
override fun provideGiphyMp4Cache(): GiphyMp4Cache { override fun provideGiphyMp4Cache(): GiphyMp4Cache {
return mockk() return mockk(relaxed = true)
} }
override fun provideExoPlayerPool(): SimpleExoPlayerPool { override fun provideExoPlayerPool(): SimpleExoPlayerPool {
return mockk() return mockk(relaxed = true)
} }
override fun provideAndroidCallAudioManager(): AudioManagerCompat { override fun provideAndroidCallAudioManager(): AudioManagerCompat {
return mockk() return mockk(relaxed = true)
} }
override fun provideDonationsService(pushServiceSocket: PushServiceSocket): DonationsService { override fun provideDonationsService(pushServiceSocket: PushServiceSocket): DonationsService {
return mockk() return mockk(relaxed = true)
} }
override fun provideCallLinksService(pushServiceSocket: PushServiceSocket): CallLinksService { override fun provideCallLinksService(pushServiceSocket: PushServiceSocket): CallLinksService {
return mockk() return mockk(relaxed = true)
} }
override fun provideProfileService(profileOperations: ClientZkProfileOperations, signalServiceMessageReceiver: SignalServiceMessageReceiver, signalWebSocket: SignalWebSocket): ProfileService { override fun provideProfileService(profileOperations: ClientZkProfileOperations, signalServiceMessageReceiver: SignalServiceMessageReceiver, signalWebSocket: SignalWebSocket): ProfileService {
return mockk() return mockk(relaxed = true)
} }
override fun provideDeadlockDetector(): DeadlockDetector { override fun provideDeadlockDetector(): DeadlockDetector {
return mockk() return mockk(relaxed = true)
} }
override fun provideClientZkReceiptOperations(signalServiceConfiguration: SignalServiceConfiguration): ClientZkReceiptOperations { override fun provideClientZkReceiptOperations(signalServiceConfiguration: SignalServiceConfiguration): ClientZkReceiptOperations {
return mockk() return mockk(relaxed = true)
} }
override fun provideScheduledMessageManager(): ScheduledMessageManager { override fun provideScheduledMessageManager(): ScheduledMessageManager {
return mockk() return mockk(relaxed = true)
} }
override fun provideLibsignalNetwork(config: SignalServiceConfiguration): Network { override fun provideLibsignalNetwork(config: SignalServiceConfiguration): Network {
return mockk() return mockk(relaxed = true)
} }
override fun provideBillingApi(): BillingApi { override fun provideBillingApi(): BillingApi {
return mockk() return mockk(relaxed = true)
} }
override fun provideArchiveApi(pushServiceSocket: PushServiceSocket): ArchiveApi { override fun provideArchiveApi(pushServiceSocket: PushServiceSocket): ArchiveApi {
return mockk() return mockk(relaxed = true)
} }
override fun provideKeysApi(pushServiceSocket: PushServiceSocket): KeysApi { override fun provideKeysApi(pushServiceSocket: PushServiceSocket): KeysApi {
return mockk() return mockk(relaxed = true)
} }
override fun provideAttachmentApi(signalWebSocket: SignalWebSocket, pushServiceSocket: PushServiceSocket): AttachmentApi { override fun provideAttachmentApi(signalWebSocket: SignalWebSocket, pushServiceSocket: PushServiceSocket): AttachmentApi {
return mockk() return mockk(relaxed = true)
} }
override fun provideLinkDeviceApi(pushServiceSocket: PushServiceSocket): LinkDeviceApi { override fun provideLinkDeviceApi(pushServiceSocket: PushServiceSocket): LinkDeviceApi {
return mockk() return mockk(relaxed = true)
} }
override fun provideRegistrationApi(pushServiceSocket: PushServiceSocket): RegistrationApi { override fun provideRegistrationApi(pushServiceSocket: PushServiceSocket): RegistrationApi {
return mockk() return mockk(relaxed = true)
} }
override fun provideStorageServiceApi(pushServiceSocket: PushServiceSocket): StorageServiceApi { override fun provideStorageServiceApi(pushServiceSocket: PushServiceSocket): StorageServiceApi {
return mockk() return mockk(relaxed = true)
} }
} }

View File

@@ -15,6 +15,7 @@ import org.hamcrest.Matchers
import org.hamcrest.Matchers.`is` import org.hamcrest.Matchers.`is`
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
@@ -34,12 +35,11 @@ import org.thoughtcrime.securesms.TestZkGroupServer
import org.thoughtcrime.securesms.database.GroupStateTestData import org.thoughtcrime.securesms.database.GroupStateTestData
import org.thoughtcrime.securesms.database.GroupTable import org.thoughtcrime.securesms.database.GroupTable
import org.thoughtcrime.securesms.database.model.databaseprotos.member import org.thoughtcrime.securesms.database.model.databaseprotos.member
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import org.thoughtcrime.securesms.groups.v2.GroupCandidateHelper import org.thoughtcrime.securesms.groups.v2.GroupCandidateHelper
import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.logging.CustomSignalProtocolLogger import org.thoughtcrime.securesms.logging.CustomSignalProtocolLogger
import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
import org.thoughtcrime.securesms.testutil.SystemOutLogger import org.thoughtcrime.securesms.testutil.SystemOutLogger
import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.RemoteConfig
import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations
@@ -68,6 +68,9 @@ class GroupManagerV2Test_edit {
val others: List<DecryptedMember> = listOf(member(otherAci)) val others: List<DecryptedMember> = listOf(member(otherAci))
} }
@get:Rule
val appDependencies = MockAppDependenciesRule()
private lateinit var groupTable: GroupTable private lateinit var groupTable: GroupTable
private lateinit var groupsV2API: GroupsV2Api private lateinit var groupsV2API: GroupsV2Api
private lateinit var groupsV2Operations: GroupsV2Operations private lateinit var groupsV2Operations: GroupsV2Operations
@@ -81,10 +84,6 @@ class GroupManagerV2Test_edit {
@Suppress("UsePropertyAccessSyntax") @Suppress("UsePropertyAccessSyntax")
@Before @Before
fun setUp() { fun setUp() {
if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
mockkObject(RemoteConfig) mockkObject(RemoteConfig)
mockkObject(SignalStore) mockkObject(SignalStore)
every { RemoteConfig.internalUser } returns false every { RemoteConfig.internalUser } returns false

View File

@@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.groups.v2.processing
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Application import android.app.Application
import androidx.test.core.app.ApplicationProvider
import io.mockk.every import io.mockk.every
import io.mockk.justRun import io.mockk.justRun
import io.mockk.mockk import io.mockk.mockk
@@ -17,6 +16,7 @@ import org.hamcrest.Matchers.hasItem
import org.hamcrest.Matchers.`is` import org.hamcrest.Matchers.`is`
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
@@ -45,7 +45,6 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.requestingMember
import org.thoughtcrime.securesms.database.setNewDescription import org.thoughtcrime.securesms.database.setNewDescription
import org.thoughtcrime.securesms.database.setNewTitle import org.thoughtcrime.securesms.database.setNewTitle
import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import org.thoughtcrime.securesms.groups.GroupId import org.thoughtcrime.securesms.groups.GroupId
import org.thoughtcrime.securesms.groups.GroupNotAMemberException import org.thoughtcrime.securesms.groups.GroupNotAMemberException
import org.thoughtcrime.securesms.groups.GroupsV2Authorization import org.thoughtcrime.securesms.groups.GroupsV2Authorization
@@ -57,6 +56,7 @@ import org.thoughtcrime.securesms.jobs.RequestGroupV2InfoJob
import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.logging.CustomSignalProtocolLogger import org.thoughtcrime.securesms.logging.CustomSignalProtocolLogger
import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
import org.thoughtcrime.securesms.testutil.SystemOutLogger import org.thoughtcrime.securesms.testutil.SystemOutLogger
import org.whispersystems.signalservice.api.NetworkResult import org.whispersystems.signalservice.api.NetworkResult
import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupResponse import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupResponse
@@ -90,6 +90,9 @@ class GroupsV2StateProcessorTest {
private val others: List<DecryptedMember> = listOf(member(otherAci)) private val others: List<DecryptedMember> = listOf(member(otherAci))
} }
@get:Rule
val appDependencies = MockAppDependenciesRule()
private lateinit var groupTable: GroupTable private lateinit var groupTable: GroupTable
private lateinit var recipientTable: RecipientTable private lateinit var recipientTable: RecipientTable
private lateinit var threadTable: ThreadTable private lateinit var threadTable: ThreadTable
@@ -103,10 +106,6 @@ class GroupsV2StateProcessorTest {
@Before @Before
fun setUp() { fun setUp() {
if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
mockkObject(SignalStore) mockkObject(SignalStore)
every { SignalStore.internal.gv2IgnoreP2PChanges } returns false every { SignalStore.internal.gv2IgnoreP2PChanges } returns false

View File

@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.keyvalue package org.thoughtcrime.securesms.keyvalue
import android.app.Application import android.app.Application
import androidx.test.core.app.ApplicationProvider
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.mockkObject import io.mockk.mockkObject
@@ -9,26 +8,25 @@ import io.mockk.unmockkAll
import org.junit.After import org.junit.After
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.RemoteConfig
@RunWith(RobolectricTestRunner::class) @RunWith(RobolectricTestRunner::class)
@Config(manifest = Config.NONE, application = Application::class) @Config(manifest = Config.NONE, application = Application::class)
class PaymentsValuesTest { class PaymentsValuesTest {
@get:Rule
val appDependencies = MockAppDependenciesRule()
private lateinit var paymentValues: PaymentsValues private lateinit var paymentValues: PaymentsValues
@Before @Before
fun setup() { fun setup() {
if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
mockkObject(RemoteConfig) mockkObject(RemoteConfig)
mockkObject(SignalStore) mockkObject(SignalStore)

View File

@@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.megaphone
import android.app.Application import android.app.Application
import android.net.Uri import android.net.Uri
import androidx.test.core.app.ApplicationProvider
import io.mockk.clearMocks import io.mockk.clearMocks
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
@@ -14,8 +13,8 @@ import org.hamcrest.Matchers.nullValue
import org.json.JSONObject import org.json.JSONObject
import org.junit.After import org.junit.After
import org.junit.AfterClass import org.junit.AfterClass
import org.junit.Before
import org.junit.BeforeClass import org.junit.BeforeClass
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
@@ -23,8 +22,7 @@ import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.database.RemoteMegaphoneTable import org.thoughtcrime.securesms.database.RemoteMegaphoneTable
import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.database.model.RemoteMegaphoneRecord import org.thoughtcrime.securesms.database.model.RemoteMegaphoneRecord
import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import org.thoughtcrime.securesms.util.toMillis import org.thoughtcrime.securesms.util.toMillis
import java.time.LocalDateTime import java.time.LocalDateTime
import java.util.UUID import java.util.UUID
@@ -37,12 +35,8 @@ import java.util.UUID
@Config(manifest = Config.NONE, application = Application::class) @Config(manifest = Config.NONE, application = Application::class)
class RemoteMegaphoneRepositoryTest { class RemoteMegaphoneRepositoryTest {
@Before @get:Rule
fun setUp() { val appDependencies = MockAppDependenciesRule()
if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
}
@After @After
fun tearDown() { fun tearDown() {

View File

@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.notifications package org.thoughtcrime.securesms.notifications
import android.app.Application import android.app.Application
import androidx.test.core.app.ApplicationProvider
import io.mockk.every import io.mockk.every
import io.mockk.mockkObject import io.mockk.mockkObject
import io.mockk.mockkStatic import io.mockk.mockkStatic
@@ -9,6 +8,7 @@ import io.mockk.unmockkAll
import org.junit.After import org.junit.After
import org.junit.Assert import org.junit.Assert
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
@@ -20,13 +20,13 @@ import org.thoughtcrime.securesms.database.MessageTable.SyncMessageId
import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.database.model.MessageId
import org.thoughtcrime.securesms.database.model.StoryType import org.thoughtcrime.securesms.database.model.StoryType
import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import org.thoughtcrime.securesms.jobmanager.Job import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JobManager import org.thoughtcrime.securesms.jobmanager.JobManager
import org.thoughtcrime.securesms.jobmanager.JsonJobData import org.thoughtcrime.securesms.jobmanager.JsonJobData
import org.thoughtcrime.securesms.jobs.MultiDeviceReadUpdateJob import org.thoughtcrime.securesms.jobs.MultiDeviceReadUpdateJob
import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.TextSecurePreferences
import java.util.LinkedList import java.util.LinkedList
@@ -34,17 +34,13 @@ import java.util.LinkedList
@Config(manifest = Config.NONE, application = Application::class) @Config(manifest = Config.NONE, application = Application::class)
class MarkReadReceiverTest { class MarkReadReceiverTest {
@get:Rule
val appDependencies = MockAppDependenciesRule()
private val jobs: MutableList<Job> = LinkedList() private val jobs: MutableList<Job> = LinkedList()
@Before @Before
fun setUp() { fun setUp() {
if (!AppDependencies.isInitialized) {
AppDependencies.init(
ApplicationProvider.getApplicationContext(),
MockApplicationDependencyProvider()
)
}
val jobManager: JobManager = AppDependencies.jobManager val jobManager: JobManager = AppDependencies.jobManager
every { jobManager.add(capture(jobs)) } returns Unit every { jobManager.add(capture(jobs)) } returns Unit

View File

@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.notifications.profiles package org.thoughtcrime.securesms.notifications.profiles
import android.app.Application import android.app.Application
import androidx.test.core.app.ApplicationProvider
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.mockkObject import io.mockk.mockkObject
@@ -11,14 +10,14 @@ import org.hamcrest.Matchers.`is`
import org.hamcrest.Matchers.nullValue import org.hamcrest.Matchers.nullValue
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import org.thoughtcrime.securesms.keyvalue.NotificationProfileValues import org.thoughtcrime.securesms.keyvalue.NotificationProfileValues
import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
import org.thoughtcrime.securesms.util.toMillis import org.thoughtcrime.securesms.util.toMillis
import java.time.DayOfWeek import java.time.DayOfWeek
import java.time.LocalDateTime import java.time.LocalDateTime
@@ -29,6 +28,9 @@ import java.time.ZoneOffset
@Config(manifest = Config.NONE, application = Application::class) @Config(manifest = Config.NONE, application = Application::class)
class NotificationProfilesTest { class NotificationProfilesTest {
@get:Rule
val appDependencies = MockAppDependenciesRule()
private val sunday830am: LocalDateTime = LocalDateTime.of(2021, 7, 4, 8, 30, 0) private val sunday830am: LocalDateTime = LocalDateTime.of(2021, 7, 4, 8, 30, 0)
private val sunday9am: LocalDateTime = LocalDateTime.of(2021, 7, 4, 9, 0, 0) private val sunday9am: LocalDateTime = LocalDateTime.of(2021, 7, 4, 9, 0, 0)
private val sunday930am: LocalDateTime = LocalDateTime.of(2021, 7, 4, 9, 30, 0) private val sunday930am: LocalDateTime = LocalDateTime.of(2021, 7, 4, 9, 30, 0)
@@ -55,10 +57,6 @@ class NotificationProfilesTest {
@Before @Before
fun setUp() { fun setUp() {
if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
notificationProfileValues = mockk() notificationProfileValues = mockk()
every { notificationProfileValues.manuallyEnabledUntil } returns 0 every { notificationProfileValues.manuallyEnabledUntil } returns 0
every { notificationProfileValues.manuallyDisabledAt } returns 0 every { notificationProfileValues.manuallyDisabledAt } returns 0

View File

@@ -0,0 +1,143 @@
/*
* Copyright 2024 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.registration.util
import android.app.Application
import io.mockk.Runs
import io.mockk.every
import io.mockk.just
import io.mockk.mockkObject
import io.mockk.unmockkAll
import io.mockk.verify
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.signal.core.util.logging.Log.initialize
import org.thoughtcrime.securesms.assertIs
import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues
import org.thoughtcrime.securesms.profiles.ProfileName
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.testutil.LogRecorder
import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
import org.thoughtcrime.securesms.testutil.MockSignalStoreRule
import org.thoughtcrime.securesms.util.RemoteConfig
@RunWith(RobolectricTestRunner::class)
@Config(application = Application::class, manifest = Config.NONE)
class RegistrationUtilTest {
@get:Rule
val signalStore = MockSignalStoreRule(relaxed = setOf(PhoneNumberPrivacyValues::class))
@get:Rule
val appDependencies = MockAppDependenciesRule()
private lateinit var logRecorder: LogRecorder
@Before
fun setup() {
mockkObject(Recipient)
mockkObject(RemoteConfig)
every { RemoteConfig.init() } just Runs
logRecorder = LogRecorder()
initialize(logRecorder)
}
@After
fun tearDown() {
unmockkAll()
}
@Test
fun maybeMarkRegistrationComplete_allValidNoRestoreOption() {
every { signalStore.registration.isRegistrationComplete } returns false
every { signalStore.account.isRegistered } returns true
every { Recipient.self() } returns Recipient(profileName = ProfileName.fromParts("Dark", "Helmet"))
every { signalStore.svr.hasOptedInWithAccess() } returns true
every { RemoteConfig.restoreAfterRegistration } returns false
RegistrationUtil.maybeMarkRegistrationComplete()
verify { signalStore.registration.markRegistrationComplete() }
}
@Test
fun maybeMarkRegistrationComplete_allValidNoRestoreOptionSvrOptOut() {
every { signalStore.registration.isRegistrationComplete } returns false
every { signalStore.account.isRegistered } returns true
every { Recipient.self() } returns Recipient(profileName = ProfileName.fromParts("Dark", "Helmet"))
every { signalStore.svr.hasOptedInWithAccess() } returns false
every { signalStore.svr.hasOptedOut() } returns true
every { RemoteConfig.restoreAfterRegistration } returns false
RegistrationUtil.maybeMarkRegistrationComplete()
verify { signalStore.registration.markRegistrationComplete() }
}
@Test
fun maybeMarkRegistrationComplete_allValidWithRestoreOption() {
every { signalStore.registration.isRegistrationComplete } returns false
every { signalStore.account.isRegistered } returns true
every { Recipient.self() } returns Recipient(profileName = ProfileName.fromParts("Dark", "Helmet"))
every { signalStore.svr.hasOptedInWithAccess() } returns true
every { RemoteConfig.restoreAfterRegistration } returns true
every { signalStore.registration.hasSkippedTransferOrRestore() } returns true
RegistrationUtil.maybeMarkRegistrationComplete()
verify { signalStore.registration.markRegistrationComplete() }
}
@Test
fun maybeMarkRegistrationComplete_missingData() {
every { signalStore.registration.isRegistrationComplete } returns false
every { signalStore.account.isRegistered } returns false
RegistrationUtil.maybeMarkRegistrationComplete()
every { signalStore.account.isRegistered } returns true
every { Recipient.self() } returns Recipient(profileName = ProfileName.EMPTY)
RegistrationUtil.maybeMarkRegistrationComplete()
every { Recipient.self() } returns Recipient(profileName = ProfileName.fromParts("Dark", "Helmet"))
every { signalStore.svr.hasOptedInWithAccess() } returns false
every { signalStore.svr.hasOptedOut() } returns false
RegistrationUtil.maybeMarkRegistrationComplete()
every { signalStore.svr.hasOptedInWithAccess() } returns true
every { RemoteConfig.restoreAfterRegistration } returns true
every { signalStore.registration.hasSkippedTransferOrRestore() } returns false
every { signalStore.registration.hasCompletedRestore() } returns false
RegistrationUtil.maybeMarkRegistrationComplete()
verify(exactly = 0) { signalStore.registration.markRegistrationComplete() }
val regUtilLogs = logRecorder.information.filter { it.tag == "RegistrationUtil" }
regUtilLogs.size assertIs 4
regUtilLogs.all { it.message == "Registration is not yet complete." } assertIs true
}
@Test
fun maybeMarkRegistrationComplete_alreadyMarked() {
every { signalStore.registration.isRegistrationComplete } returns true
RegistrationUtil.maybeMarkRegistrationComplete()
verify(exactly = 0) { signalStore.registration.markRegistrationComplete() }
val regUtilLogs = logRecorder.information.filter { it.tag == "RegistrationUtil" }
regUtilLogs.size assertIs 0
}
}

View File

@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.storage package org.thoughtcrime.securesms.storage
import android.app.Application import android.app.Application
import androidx.test.core.app.ApplicationProvider
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.mockkObject import io.mockk.mockkObject
@@ -12,16 +11,16 @@ import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before import org.junit.Before
import org.junit.BeforeClass import org.junit.BeforeClass
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import org.signal.core.util.logging.Log import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.database.RecipientTable import org.thoughtcrime.securesms.database.RecipientTable
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.testutil.EmptyLogger import org.thoughtcrime.securesms.testutil.EmptyLogger
import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
import org.whispersystems.signalservice.api.push.ServiceId.ACI import org.whispersystems.signalservice.api.push.ServiceId.ACI
import org.whispersystems.signalservice.api.push.ServiceId.PNI import org.whispersystems.signalservice.api.push.ServiceId.PNI
import org.whispersystems.signalservice.api.storage.SignalContactRecord import org.whispersystems.signalservice.api.storage.SignalContactRecord
@@ -33,14 +32,13 @@ import java.util.UUID
@Config(application = Application::class) @Config(application = Application::class)
class ContactRecordProcessorTest { class ContactRecordProcessorTest {
@get:Rule
val appDependencies = MockAppDependenciesRule()
lateinit var recipientTable: RecipientTable lateinit var recipientTable: RecipientTable
@Before @Before
fun setup() { fun setup() {
if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
mockkObject(SignalStore) mockkObject(SignalStore)
every { SignalStore.account.isPrimaryDevice } returns true every { SignalStore.account.isPrimaryDevice } returns true

View File

@@ -0,0 +1,50 @@
/*
* Copyright 2024 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.testutil
import androidx.test.core.app.ApplicationProvider
import io.mockk.clearMocks
import org.junit.rules.ExternalResource
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import kotlin.reflect.KVisibility
import kotlin.reflect.full.memberProperties
/**
* Facilitates mocking and clearing components of [AppDependencies]. Clearing is particularly important as the
* mocks will be reused since [AppDependencies] is scoped to the entire test suite and stays initialized with prior
* test runs leading to unpredictable results based on how tests are run.
*/
class MockAppDependenciesRule : ExternalResource() {
private val skipList = setOf(
"application",
"databaseObserver",
"groupsV2Authorization",
"isInitialized",
"okHttpClient",
"signalOkHttpClient",
"webSocketObserver"
)
private val properties = AppDependencies::class
.memberProperties
.filter { it.visibility == KVisibility.PUBLIC }
.filterNot { skipList.contains(it.name) }
override fun before() {
if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
}
override fun after() {
properties
.forEach { property ->
property.get(AppDependencies)?.let { clearMocks(it) }
}
}
}

View File

@@ -0,0 +1,60 @@
/*
* Copyright 2024 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.testutil
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.unmockkObject
import org.junit.rules.ExternalResource
import org.thoughtcrime.securesms.keyvalue.AccountValues
import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues
import org.thoughtcrime.securesms.keyvalue.RegistrationValues
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.keyvalue.SvrValues
import kotlin.reflect.KClass
/**
* Mocks [SignalStore] to return mock versions of the various values. Mocks will default to not be relaxed (each
* method call on them will need to be mocked) except for unit functions which will do nothing.
*
* Expand mocked values as necessary when needed.
*
* @param relaxed Set of value classes that should default to relaxed thus defaulting all methods. Useful
* when value is not part of the input state under test but called within the under test code.
*/
@Suppress("MemberVisibilityCanBePrivate")
class MockSignalStoreRule(private val relaxed: Set<KClass<*>> = emptySet()) : ExternalResource() {
lateinit var account: AccountValues
private set
lateinit var phoneNumberPrivacy: PhoneNumberPrivacyValues
private set
lateinit var registration: RegistrationValues
private set
lateinit var svr: SvrValues
private set
override fun before() {
account = mockk(relaxed = relaxed.contains(AccountValues::class), relaxUnitFun = true)
phoneNumberPrivacy = mockk(relaxed = relaxed.contains(PhoneNumberPrivacyValues::class), relaxUnitFun = true)
registration = mockk(relaxed = relaxed.contains(RegistrationValues::class), relaxUnitFun = true)
svr = mockk(relaxed = relaxed.contains(SvrValues::class), relaxUnitFun = true)
mockkObject(SignalStore)
every { SignalStore.account } returns account
every { SignalStore.phoneNumberPrivacy } returns phoneNumberPrivacy
every { SignalStore.registration } returns registration
every { SignalStore.svr } returns svr
}
override fun after() {
unmockkObject(SignalStore)
}
}

View File

@@ -1,33 +1,31 @@
package org.thoughtcrime.securesms.util package org.thoughtcrime.securesms.util
import android.app.Application import android.app.Application
import androidx.test.core.app.ApplicationProvider
import io.mockk.every import io.mockk.every
import io.mockk.mockkObject import io.mockk.mockkObject
import io.mockk.unmockkAll import io.mockk.unmockkAll
import org.junit.After import org.junit.After
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.ParameterizedRobolectricTestRunner import org.robolectric.ParameterizedRobolectricTestRunner
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.dependencies.AppDependencies.application import org.thoughtcrime.securesms.dependencies.AppDependencies.application
import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider
import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.testutil.MockAppDependenciesRule
import org.thoughtcrime.securesms.util.SignalMeUtil.parseE164FromLink import org.thoughtcrime.securesms.util.SignalMeUtil.parseE164FromLink
@RunWith(ParameterizedRobolectricTestRunner::class) @RunWith(ParameterizedRobolectricTestRunner::class)
@Config(manifest = Config.NONE, application = Application::class) @Config(manifest = Config.NONE, application = Application::class)
class SignalMeUtilText_parseE164FromLink(private val input: String?, private val output: String?) { class SignalMeUtilText_parseE164FromLink(private val input: String?, private val output: String?) {
@get:Rule
val appDependencies = MockAppDependenciesRule()
@Before @Before
fun setUp() { fun setUp() {
if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
mockkObject(SignalStore) mockkObject(SignalStore)
every { SignalStore.account.e164 } returns "+15555555555" every { SignalStore.account.e164 } returns "+15555555555"
} }