Skip to content

Commit f7278ea

Browse files
committed
chore: replace MockK resource stubs with FakeResourceHelper
Add FakeResourceHelper as a testFixtures class that auto-discovers R classes from the test classloader and resolves resource IDs to their field names via reflection. This eliminates all per-string MockK stubs across 8 test files while keeping assertions locale-independent. Also removes getKinSuffix()/getOfKinSuffix() from ResourceHelper interface, inlining the getString calls in Currency.kt. Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent e0993f2 commit f7278ea

20 files changed

Lines changed: 160 additions & 96 deletions

File tree

apps/flipcash/features/cash/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ android {
99
dependencies {
1010
testImplementation(kotlin("test"))
1111
testImplementation(libs.bundles.unit.testing)
12+
testImplementation(testFixtures(project(":ui:resources")))
1213
testImplementation(libs.mockito.kotlin)
1314
testImplementation(libs.robolectric)
1415

apps/flipcash/features/cash/src/test/kotlin/com/flipcash/app/cash/internal/CashScreenViewModelTest.kt

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule
44
import com.flipcash.app.core.MainCoroutineRule
55
import com.flipcash.app.core.dispatchers.TestDispatchers
66
import com.flipcash.app.tokens.TokenCoordinator
7-
import com.flipcash.features.cash.R
87
import com.getcode.manager.BottomBarManager
98
import com.getcode.opencode.controllers.TransactionOperations
109
import com.getcode.opencode.exchange.Exchange
@@ -19,7 +18,7 @@ import com.getcode.opencode.model.financial.SendLimit
1918
import com.getcode.opencode.model.financial.Token
2019
import com.getcode.opencode.model.financial.TokenWithLocalizedBalance
2120
import com.getcode.solana.keys.Mint
22-
import com.getcode.util.resources.ResourceHelper
21+
import com.getcode.util.resources.FakeResourceHelper
2322
import io.mockk.every
2423
import io.mockk.mockk
2524
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -45,7 +44,7 @@ class CashScreenViewModelTest {
4544
@get:Rule
4645
var mainCoroutineRule = MainCoroutineRule(UnconfinedTestDispatcher())
4746

48-
private val resources: ResourceHelper = mockk(relaxed = true)
47+
private val resources = FakeResourceHelper()
4948
private val exchange: Exchange = mockk(relaxed = true)
5049
private val verifiedFiatCalculator: VerifiedFiatCalculator = mockk(relaxed = true)
5150
private val tokenCoordinator: TokenCoordinator = mockk(relaxed = true)
@@ -59,14 +58,6 @@ class CashScreenViewModelTest {
5958
fun setUp() {
6059
BottomBarManager.clear()
6160

62-
// Stub resource strings used by the ViewModel
63-
every { resources.getString(R.string.error_title_youNeedMoreCash) } returns "error_title_youNeedMoreCash"
64-
every { resources.getString(R.string.error_description_youNeedMoreCash) } returns "error_description_youNeedMoreCash"
65-
every { resources.getString(R.string.action_addMoreCash) } returns "action_addMoreCash"
66-
every { resources.getString(R.string.action_dismiss) } returns "action_dismiss"
67-
every { resources.getString(R.string.error_title_sendLimitReached) } returns "error_title_sendLimitReached"
68-
every { resources.getString(R.string.error_description_sendLimitReached) } returns "error_description_sendLimitReached"
69-
7061
// Default stubs for flows consumed in init
7162
every { exchange.observePreferredRate() } returns emptyFlow()
7263
every { exchange.preferredRate } returns Rate.oneToOne

apps/flipcash/features/contact-verification/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ android {
99
dependencies {
1010
testImplementation(kotlin("test"))
1111
testImplementation(libs.bundles.unit.testing)
12+
testImplementation(testFixtures(project(":ui:resources")))
1213
testImplementation(libs.mockito.kotlin)
1314

1415
implementation(libs.bundles.kotlinx.serialization)

apps/flipcash/features/contact-verification/src/test/kotlin/com/flipcash/app/contact/verification/internal/email/EmailVerificationViewModelErrorTest.kt

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package com.flipcash.app.contact.verification.internal.email
22

3-
import com.flipcash.features.contact.verification.R
43
import com.flipcash.app.core.verification.email.EmailCodeChannel
54
import com.flipcash.services.controllers.ContactVerificationController
65
import com.flipcash.services.controllers.ProfileController
76
import com.flipcash.services.models.EmailVerificationError
87
import com.getcode.manager.BottomBarManager
9-
import com.getcode.util.resources.ResourceHelper
8+
import com.getcode.util.resources.FakeResourceHelper
109
import com.flipcash.app.core.MainCoroutineRule
1110
import com.flipcash.app.core.dispatchers.TestDispatchers
12-
import io.mockk.every
1311
import io.mockk.mockk
1412
import kotlinx.coroutines.ExperimentalCoroutinesApi
1513
import kotlinx.coroutines.test.UnconfinedTestDispatcher
@@ -33,26 +31,13 @@ class EmailVerificationViewModelErrorTest {
3331
// Mockito for Result-returning methods (MockK double-boxes Result inline class)
3432
private val verificationController: ContactVerificationController = mock()
3533
private val profileController = mockk<ProfileController>(relaxed = true)
36-
private val resources = mockk<ResourceHelper>(relaxed = true)
34+
private val resources = FakeResourceHelper()
3735

3836
private lateinit var dispatchers: TestDispatchers
3937

4038
@Before
4139
fun setUp() {
4240
BottomBarManager.clear()
43-
44-
every { resources.getString(R.string.error_title_failedToSendCodeToEmail) } returns "error_title_failedToSendCodeToEmail"
45-
every { resources.getString(R.string.error_description_failedToSendCodeToEmail) } returns "error_description_failedToSendCodeToEmail"
46-
every { resources.getString(R.string.error_title_maxAttemptsReached) } returns "error_title_maxAttemptsReached"
47-
every { resources.getString(R.string.error_description_maxAttemptsReached) } returns "error_description_maxAttemptsReached"
48-
every { resources.getString(R.string.error_title_emailVerificationFailed) } returns "error_title_emailVerificationFailed"
49-
every { resources.getString(R.string.error_description_emailVerificationFailed) } returns "error_description_emailVerificationFailed"
50-
every { resources.getString(R.string.error_title_emailVerificationLinkInvalid) } returns "error_title_emailVerificationLinkInvalid"
51-
every { resources.getString(R.string.error_description_emailVerificationLinkInvalid) } returns "error_description_emailVerificationLinkInvalid"
52-
every { resources.getString(R.string.error_title_emailVerificationLinkExpired) } returns "error_title_emailVerificationLinkExpired"
53-
every { resources.getString(R.string.error_description_emailVerificationLinkExpired) } returns "error_description_emailVerificationLinkExpired"
54-
every { resources.getString(R.string.action_resendVerificationEmail) } returns "action_resendVerificationEmail"
55-
every { resources.getString(R.string.action_ok) } returns "OK"
5641
}
5742

5843
@After

apps/flipcash/features/contact-verification/src/test/kotlin/com/flipcash/app/contact/verification/internal/phone/PhoneVerificationViewModelErrorTest.kt

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@ package com.flipcash.app.contact.verification.internal.phone
22

33
import com.flipcash.app.featureflags.FeatureFlagController
44
import com.flipcash.app.phone.PhoneUtils
5-
import com.flipcash.features.contact.verification.R
65
import com.flipcash.services.controllers.ContactVerificationController
76
import com.flipcash.services.controllers.ProfileController
87
import com.flipcash.services.models.PhoneVerificationError
98
import com.flipcash.services.user.UserManager
109
import com.getcode.manager.BottomBarManager
11-
import com.getcode.util.resources.ResourceHelper
10+
import com.getcode.util.resources.FakeResourceHelper
1211
import com.flipcash.app.core.MainCoroutineRule
1312
import com.flipcash.app.core.dispatchers.TestDispatchers
14-
import io.mockk.every
1513
import io.mockk.mockk
1614
import kotlinx.coroutines.ExperimentalCoroutinesApi
1715
import kotlinx.coroutines.test.UnconfinedTestDispatcher
@@ -38,22 +36,13 @@ class PhoneVerificationViewModelErrorTest {
3836
private val profileController = mockk<ProfileController>(relaxed = true)
3937
private val userManager = mockk<UserManager>(relaxed = true)
4038
private val featureFlags = mockk<FeatureFlagController>(relaxed = true)
41-
private val resources = mockk<ResourceHelper>(relaxed = true)
39+
private val resources = FakeResourceHelper()
4240

4341
private lateinit var dispatchers: TestDispatchers
4442

4543
@Before
4644
fun setUp() {
4745
BottomBarManager.clear()
48-
49-
every { resources.getString(R.string.error_title_failedToSendCodeToPhone) } returns "error_title_failedToSendCodeToPhone"
50-
every { resources.getString(R.string.error_description_failedToSendCodeToPhone) } returns "error_description_failedToSendCodeToPhone"
51-
every { resources.getString(R.string.error_title_maxAttemptsReached) } returns "error_title_maxAttemptsReached"
52-
every { resources.getString(R.string.error_description_maxAttemptsReached) } returns "error_description_maxAttemptsReached"
53-
every { resources.getString(R.string.error_title_deviceNotSupported) } returns "error_title_deviceNotSupported"
54-
every { resources.getString(R.string.error_description_deviceNotSupported) } returns "error_description_deviceNotSupported"
55-
every { resources.getString(R.string.error_description_invalidVerificationCode) } returns "error_description_invalidVerificationCode"
56-
every { resources.getString(R.string.error_description_codeTimedOut) } returns "error_description_codeTimedOut"
5746
}
5847

5948
@After

apps/flipcash/features/login/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ android {
99
dependencies {
1010
testImplementation(kotlin("test"))
1111
testImplementation(libs.bundles.unit.testing)
12+
testImplementation(testFixtures(project(":ui:resources")))
1213
testImplementation(libs.mockito.kotlin)
1314

1415
implementation(project(":apps:flipcash:shared:accesskey"))

apps/flipcash/features/login/src/test/kotlin/com/flipcash/app/login/router/LoginViewModelErrorTest.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@ import com.flipcash.app.auth.AuthManager
66
import com.flipcash.app.featureflags.FeatureFlagController
77
import com.flipcash.app.core.MainCoroutineRule
88
import com.flipcash.app.core.dispatchers.TestDispatchers
9-
import com.flipcash.features.login.R
109
import com.flipcash.services.controllers.AccountController
1110
import com.flipcash.services.user.UserManager
1211
import com.getcode.manager.BottomBarManager
13-
import com.getcode.util.resources.ResourceHelper
12+
import com.getcode.util.resources.FakeResourceHelper
1413
import io.mockk.every
1514
import io.mockk.mockk
1615
import io.mockk.mockkStatic
@@ -41,7 +40,7 @@ class LoginViewModelErrorTest {
4140
private val accounts: AccountController = mock()
4241

4342
// MockK for everything else
44-
private val resources: ResourceHelper = mockk(relaxed = true)
43+
private val resources = FakeResourceHelper()
4544
private val analytics: FlipcashAnalyticsService = mockk(relaxed = true)
4645
private val userManager: UserManager = mockk(relaxed = true)
4746
private val featureFlags: FeatureFlagController = mockk(relaxed = true)
@@ -54,10 +53,6 @@ class LoginViewModelErrorTest {
5453
// android.util.Base64 is stubbed in unit tests; mock it so encodeBase64() doesn't NPE
5554
mockkStatic(android.util.Base64::class)
5655
every { android.util.Base64.encodeToString(any(), any()) } answers { java.util.Base64.getEncoder().encodeToString(firstArg()) }
57-
every { resources.getString(R.string.error_title_createAccountFailed) } returns "error_title_createAccountFailed"
58-
every { resources.getString(R.string.error_description_createAccountFailed) } returns "error_description_createAccountFailed"
59-
every { resources.getString(R.string.error_title_loginFailed) } returns "error_title_loginFailed"
60-
every { resources.getString(R.string.error_description_loginFailed) } returns "error_description_loginFailed"
6156
}
6257

6358
@After

apps/flipcash/features/transactions/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ android {
99
dependencies {
1010
testImplementation(kotlin("test"))
1111
testImplementation(libs.bundles.unit.testing)
12+
testImplementation(testFixtures(project(":ui:resources")))
1213
testImplementation(libs.mockito.kotlin)
1314

1415
implementation(libs.compose.paging)

apps/flipcash/features/transactions/src/test/kotlin/com/flipcash/app/transactions/internal/TransactionHistoryViewModelErrorTest.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@ package com.flipcash.app.transactions.internal
33
import com.flipcash.app.activityfeed.ActivityFeedCoordinator
44
import com.flipcash.app.featureflags.FeatureFlagController
55
import com.flipcash.app.tokens.TokenCoordinator
6-
import com.flipcash.features.transactions.R
76
import com.flipcash.services.user.UserManager
87
import com.getcode.manager.BottomBarManager
98
import com.getcode.opencode.controllers.TransactionOperations
109
import com.getcode.opencode.model.accounts.AccountCluster
1110
import com.getcode.solana.keys.PublicKey
12-
import com.getcode.util.resources.ResourceHelper
11+
import com.getcode.util.resources.FakeResourceHelper
1312
import com.flipcash.app.core.MainCoroutineRule
1413
import com.flipcash.app.core.dispatchers.TestDispatchers
1514
import io.mockk.every
@@ -39,7 +38,7 @@ class TransactionHistoryViewModelErrorTest {
3938
private val transactionController: TransactionOperations = mock()
4039
private val featureFlags = mockk<FeatureFlagController>(relaxed = true)
4140
private val userManager = mockk<UserManager>(relaxed = true)
42-
private val resources = mockk<ResourceHelper>(relaxed = true)
41+
private val resources = FakeResourceHelper()
4342

4443
private val accountCluster = mockk<AccountCluster>(relaxed = true)
4544

@@ -50,8 +49,6 @@ class TransactionHistoryViewModelErrorTest {
5049
BottomBarManager.clear()
5150

5251
every { userManager.accountCluster } returns accountCluster
53-
every { resources.getString(R.string.error_title_failedToCancelTransfer) } returns "error_title_failedToCancelTransfer"
54-
every { resources.getString(R.string.error_description_failedToCancelTransfer) } returns "error_description_failedToCancelTransfer"
5552
}
5653

5754
@After

apps/flipcash/features/withdrawal/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ android {
99
dependencies {
1010
testImplementation(kotlin("test"))
1111
testImplementation(libs.bundles.unit.testing)
12+
testImplementation(testFixtures(project(":ui:resources")))
1213
testImplementation(libs.bundles.compose.ui.testing)
1314

1415
implementation(project(":apps:flipcash:shared:amount-entry"))

0 commit comments

Comments
 (0)