@@ -40,6 +40,7 @@ import com.salesforce.androidsdk.accounts.UserAccountManager
4040import com.salesforce.androidsdk.analytics.AnalyticsPublishingWorker
4141import com.salesforce.androidsdk.analytics.logger.SalesforceLogger
4242import com.salesforce.androidsdk.app.SalesforceSDKManager
43+ import com.salesforce.androidsdk.auth.AppAttestationClient
4344import com.salesforce.androidsdk.auth.OAuth2.FRONTDOOR_URL_KEY
4445import com.salesforce.androidsdk.config.OAuthConfig
4546import com.salesforce.androidsdk.rest.RestClient
@@ -80,6 +81,7 @@ class TokenMigrationActivityTest {
8081 private lateinit var mockUser: UserAccount
8182 private lateinit var mockClientManager: com.salesforce.androidsdk.rest.ClientManager
8283 private lateinit var savedFactory: ViewModelProvider .Factory
84+ private var savedAppAttestationClient: AppAttestationClient ? = null
8385
8486 @Before
8587 fun setUp () {
@@ -113,12 +115,17 @@ class TokenMigrationActivityTest {
113115 // Get the REAL SalesforceSDKManager instance and save properties
114116 val realSdkManager = SalesforceSDKManager .getInstance()
115117 savedFactory = realSdkManager.loginViewModelFactory
118+ savedAppAttestationClient = realSdkManager.appAttestationClient
116119
117120 // Mock only the clientManager on the real instance using spyk
118121 val sdkManagerSpy = spyk(realSdkManager)
119122 every { sdkManagerSpy.clientManager } returns mockClientManager
120123 every { mockClientManager.peekRestClient(any<UserAccount >()) } returns mockRestClient
121124
125+ // CRITICAL: Set appAttestationClient to null to prevent blocking network calls
126+ // in LoginViewModel.getAuthorizationUrl() and OAuth2.makeTokenEndpointRequest()
127+ every { sdkManagerSpy.appAttestationClient } returns null
128+
122129 // Replace getInstance() to return our spy instead of completely mocking the object
123130 mockkStatic(SalesforceSDKManager ::class )
124131 every { SalesforceSDKManager .getInstance() } returns sdkManagerSpy
@@ -136,10 +143,11 @@ class TokenMigrationActivityTest {
136143
137144 @After
138145 fun tearDown () {
139- // Restore the loginViewModelFactory on the real instance before unmocking
146+ // Restore the loginViewModelFactory and appAttestationClient on the real instance before unmocking
140147 try {
141148 val realSdkManager = SalesforceSDKManager .getInstance()
142149 realSdkManager.loginViewModelFactory = savedFactory
150+ realSdkManager.appAttestationClient = savedAppAttestationClient
143151 } catch (e: Exception ) {
144152 // If getInstance() is still mocked, this will fail - unmockkAll will clean it up
145153 }
0 commit comments