Skip to content

Commit 1b994fb

Browse files
@W-21933885: [MSDK Android] App Attestation Implementation (Fix Cross-Test Singleton Contamination In TokenMigrationActivityTest And TokenMigrationWebViewTest)
1 parent ffce923 commit 1b994fb

2 files changed

Lines changed: 32 additions & 12 deletions

File tree

libs/test/SalesforceSDKTest/src/com/salesforce/androidsdk/ui/TokenMigrationActivityTest.kt

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import io.mockk.every
4747
import io.mockk.mockk
4848
import io.mockk.mockkObject
4949
import io.mockk.mockkStatic
50+
import io.mockk.spyk
5051
import io.mockk.unmockkAll
5152
import org.junit.After
5253
import org.junit.Assert.assertEquals
@@ -75,9 +76,10 @@ class TokenMigrationActivityTest {
7576
)
7677

7778
private lateinit var mockUserAccountManager: UserAccountManager
78-
private lateinit var mockSdkManager: SalesforceSDKManager
7979
private lateinit var mockRestClient: RestClient
8080
private lateinit var mockUser: UserAccount
81+
private lateinit var mockClientManager: com.salesforce.androidsdk.rest.ClientManager
82+
private lateinit var savedFactory: ViewModelProvider.Factory
8183

8284
@Before
8385
fun setUp() {
@@ -92,9 +94,9 @@ class TokenMigrationActivityTest {
9294
SalesforceLogger.resetLoggerPrefs(getApplicationContext())
9395

9496
mockUserAccountManager = mockk(relaxed = true)
95-
mockSdkManager = mockk(relaxed = true)
9697
mockRestClient = mockk(relaxed = true)
9798
mockUser = mockk(relaxed = true)
99+
mockClientManager = mockk(relaxed = true)
98100

99101
// Mock user properties needed for getAuthorizationUrl
100102
every { mockUser.instanceServer } returns "https://test.salesforce.com"
@@ -108,13 +110,18 @@ class TokenMigrationActivityTest {
108110
mockUserAccountManager.getUserFromOrgAndUserId(INVALID_ORG, INVALID_USER)
109111
} returns null
110112

111-
mockkObject(SalesforceSDKManager)
112-
mockkObject(SalesforceSDKManager.Companion)
113-
every { SalesforceSDKManager.getInstance() } returns mockSdkManager
114-
every { mockSdkManager.appContext } returns getApplicationContext()
115-
every { mockSdkManager.clientManager.peekRestClient(any<UserAccount>()) } returns mockRestClient
116-
every { mockSdkManager.useHybridAuthentication } returns false
117-
every { mockSdkManager.userAgent } returns "MockUserAgent"
113+
// Get the REAL SalesforceSDKManager instance and save properties
114+
val realSdkManager = SalesforceSDKManager.getInstance()
115+
savedFactory = realSdkManager.loginViewModelFactory
116+
117+
// Mock only the clientManager on the real instance using spyk
118+
val sdkManagerSpy = spyk(realSdkManager)
119+
every { sdkManagerSpy.clientManager } returns mockClientManager
120+
every { mockClientManager.peekRestClient(any<UserAccount>()) } returns mockRestClient
121+
122+
// Replace getInstance() to return our spy instead of completely mocking the object
123+
mockkStatic(SalesforceSDKManager::class)
124+
every { SalesforceSDKManager.getInstance() } returns sdkManagerSpy
118125

119126
// Default mock for sendSync to prevent hanging - tests can override this
120127
val mockResponse = mockk<com.salesforce.androidsdk.rest.RestResponse>(relaxed = true)
@@ -129,6 +136,13 @@ class TokenMigrationActivityTest {
129136

130137
@After
131138
fun tearDown() {
139+
// Restore the loginViewModelFactory on the real instance before unmocking
140+
try {
141+
val realSdkManager = SalesforceSDKManager.getInstance()
142+
realSdkManager.loginViewModelFactory = savedFactory
143+
} catch (e: Exception) {
144+
// If getInstance() is still mocked, this will fail - unmockkAll will clean it up
145+
}
132146
unmockkAll()
133147
}
134148

@@ -326,7 +340,7 @@ class TokenMigrationActivityTest {
326340

327341
// Throw exception when getting client
328342
every {
329-
mockSdkManager.clientManager.peekRestClient(any<UserAccount>())
343+
mockClientManager.peekRestClient(any<UserAccount>())
330344
} throws RuntimeException("Account not found")
331345

332346
// When
@@ -372,8 +386,8 @@ class TokenMigrationActivityTest {
372386
every { asString() } returns "{}"
373387
}
374388

375-
// Mock loginViewModelFactory
376-
every { mockSdkManager.loginViewModelFactory } returns object : ViewModelProvider.Factory {
389+
// Mock loginViewModelFactory on the real/spied instance
390+
SalesforceSDKManager.getInstance().loginViewModelFactory = object : ViewModelProvider.Factory {
377391
@Suppress("UNCHECKED_CAST")
378392
override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
379393
return mockk<LoginViewModel>(relaxed = true) as T

libs/test/SalesforceSDKTest/src/com/salesforce/androidsdk/ui/TokenMigrationWebViewTest.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class TokenMigrationWebViewTest {
4848
)
4949

5050
private lateinit var savedFactory: ViewModelProvider.Factory
51+
private lateinit var savedWebViewFactory: (Context) -> WebView
5152
private lateinit var mockViewModel: LoginViewModel
5253
private lateinit var mockWebView: WebView
5354
private var testActivity: TokenMigrationActivity? = null
@@ -58,6 +59,9 @@ class TokenMigrationWebViewTest {
5859
// Save the real loginViewModelFactory so it can be restored in tearDown
5960
savedFactory = SalesforceSDKManager.getInstance().loginViewModelFactory
6061

62+
// Save the original webViewFactory so it can be restored in tearDown
63+
savedWebViewFactory = TokenMigrationActivity.webViewFactory
64+
6165
// Mock loginViewModelFactory to return a mock LoginViewModel
6266
mockViewModel = mockk<LoginViewModel>(relaxed = true) {
6367
every { dynamicBackgroundColor } returns mutableStateOf(Color.White)
@@ -98,6 +102,8 @@ class TokenMigrationWebViewTest {
98102
testActivity = null
99103
// Restore the real loginViewModelFactory
100104
SalesforceSDKManager.getInstance().loginViewModelFactory = savedFactory
105+
// Restore the original webViewFactory
106+
TokenMigrationActivity.webViewFactory = savedWebViewFactory
101107
unmockkAll() // cleans up any mockk() instances created in tests
102108
}
103109

0 commit comments

Comments
 (0)