Skip to content

Commit 3cb9392

Browse files
authored
Using proper errors when discovering Applicatin Password URL (#21876)
* Updating version and using proper errors * Minor cleaning * Adding tests * detekt
1 parent 03e565b commit 3cb9392

File tree

3 files changed

+70
-17
lines changed

3 files changed

+70
-17
lines changed

WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteViewModel.kt

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ import javax.inject.Named
5959
import androidx.core.content.edit
6060
import kotlinx.coroutines.withContext
6161
import org.wordpress.android.fluxc.persistence.SiteSqlUtils
62+
import rs.wordpress.api.kotlin.ApiDiscoveryResult
6263

6364
@Suppress("LargeClass", "LongMethod", "LongParameterList")
6465
class MySiteViewModel @Inject constructor(
@@ -248,17 +249,37 @@ class MySiteViewModel @Inject constructor(
248249
@Suppress("TooGenericExceptionCaught")
249250
private suspend fun getAuthorizationUrlComplete(siteUrl: String): String = withContext(bgDispatcher) {
250251
try {
251-
val urlDiscovery = wpLoginClient.apiDiscovery(siteUrl)
252-
val authorizationUrl = urlDiscovery.apiDetails.findApplicationPasswordsAuthenticationUrl()
253-
val authorizationUrlComplete =
254-
applicationPasswordLoginHelper.appendParamsToRestAuthorizationUrl(authorizationUrl)
255-
Log.d("WP_RS", "Found authorization for ${siteUrl} URL: $authorizationUrlComplete")
256-
AnalyticsTracker.track(Stat.BACKGROUND_REST_AUTODISCOVERY_SUCCESSFUL)
257-
authorizationUrlComplete
252+
getAuthorizationUrlCompleteInternal(siteUrl)
258253
} catch (throwable: Throwable) {
259-
Log.e("WP_RS", "VM: Error during API discovery for ${siteUrl}", throwable)
260-
AnalyticsTracker.track(Stat.BACKGROUND_REST_AUTODISCOVERY_FAILED)
261-
""
254+
handleAuthenticationDiscoveryError(siteUrl, throwable)
255+
}
256+
}
257+
258+
private fun handleAuthenticationDiscoveryError(siteUrl: String, throwable: Throwable): String {
259+
Log.e("WP_RS", "VM: Error during API discovery for $siteUrl", throwable)
260+
AnalyticsTracker.track(Stat.BACKGROUND_REST_AUTODISCOVERY_FAILED)
261+
return ""
262+
}
263+
264+
private suspend fun getAuthorizationUrlCompleteInternal(siteUrl: String): String = withContext(bgDispatcher) {
265+
when (val urlDiscoveryResult = wpLoginClient.apiDiscovery(siteUrl)) {
266+
is ApiDiscoveryResult.Success -> {
267+
val authorizationUrl = urlDiscoveryResult.success.applicationPasswordsAuthenticationUrl.url()
268+
val authorizationUrlComplete =
269+
applicationPasswordLoginHelper.appendParamsToRestAuthorizationUrl(authorizationUrl)
270+
Log.d("WP_RS", "Found authorization for $siteUrl URL: $authorizationUrlComplete")
271+
AnalyticsTracker.track(Stat.BACKGROUND_REST_AUTODISCOVERY_SUCCESSFUL)
272+
authorizationUrlComplete
273+
}
274+
275+
is ApiDiscoveryResult.FailureFetchAndParseApiRoot ->
276+
handleAuthenticationDiscoveryError(siteUrl, Exception("FailureFetchAndParseApiRoot"))
277+
278+
is ApiDiscoveryResult.FailureFindApiRoot ->
279+
handleAuthenticationDiscoveryError(siteUrl, Exception("FailureFindApiRoot"))
280+
281+
is ApiDiscoveryResult.FailureParseSiteUrl ->
282+
handleAuthenticationDiscoveryError(siteUrl, urlDiscoveryResult.error)
262283
}
263284
}
264285

WordPress/src/test/java/org/wordpress/android/ui/mysite/MySiteViewModelTest.kt

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,10 @@ import org.wordpress.android.util.QuickStartUtilsWrapper
6464
import org.wordpress.android.util.SnackbarSequencer
6565
import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper
6666
import org.wordpress.android.util.config.LandOnTheEditorFeatureConfig
67+
import rs.wordpress.api.kotlin.ApiDiscoveryResult
6768
import rs.wordpress.api.kotlin.WpLoginClient
6869
import uniffi.wp_api.AutoDiscoveryAttemptSuccess
70+
import uniffi.wp_api.ParseUrlException
6971
import uniffi.wp_api.ParsedUrl
7072
import uniffi.wp_api.WpApiDetails
7173
import java.util.Date
@@ -163,6 +165,9 @@ class MySiteViewModelTest : BaseUnitTest() {
163165
@Mock
164166
lateinit var wpApiDetails: WpApiDetails
165167

168+
@Mock
169+
lateinit var authParsedUrl: ParsedUrl
170+
166171
@Mock
167172
lateinit var sharedPreferences: SharedPreferences
168173

@@ -730,13 +735,16 @@ class MySiteViewModelTest : BaseUnitTest() {
730735
).thenReturn(false)
731736
whenever(wpLoginClient.apiDiscovery(eq(TEST_URL)))
732737
.thenReturn(
733-
AutoDiscoveryAttemptSuccess(
734-
ParsedUrl(Pointer.createConstant(1)),
735-
ParsedUrl(Pointer.createConstant(1)),
736-
wpApiDetails
738+
ApiDiscoveryResult.Success(
739+
AutoDiscoveryAttemptSuccess(
740+
ParsedUrl(Pointer.createConstant(1)),
741+
ParsedUrl(Pointer.createConstant(1)),
742+
wpApiDetails,
743+
authParsedUrl
744+
)
737745
)
738746
)
739-
whenever(wpApiDetails.findApplicationPasswordsAuthenticationUrl()).thenReturn(TEST_URL_AUTH)
747+
whenever(authParsedUrl.url()).thenReturn(TEST_URL_AUTH)
740748
whenever(applicationPasswordLoginHelper.appendParamsToRestAuthorizationUrl(any()))
741749
.thenReturn("$TEST_URL_AUTH$TEST_URL_AUTH_SUFFIX")
742750

@@ -746,6 +754,30 @@ class MySiteViewModelTest : BaseUnitTest() {
746754
verify(wpLoginClient).apiDiscovery(eq(TEST_URL))
747755
}
748756

757+
@Test
758+
fun `given login scenario, when api discovery is failed, then show nothing`() = runTest {
759+
whenever(selectedSiteRepository.getSelectedSite()).thenReturn(siteTest)
760+
whenever(sharedPreferences.getBoolean(
761+
eq(FIRST_TIME_SITE_OPENED_SP_TAG),
762+
eq(false))
763+
).thenReturn(true)
764+
whenever(sharedPreferences.getBoolean(
765+
eq(SKIPPED_SITE_SP_TAG),
766+
eq(false))
767+
).thenReturn(false)
768+
whenever(wpLoginClient.apiDiscovery(eq(TEST_URL)))
769+
.thenReturn(
770+
ApiDiscoveryResult.FailureParseSiteUrl(
771+
ParseUrlException.Generic("")
772+
)
773+
)
774+
775+
viewModel.runApplicationPasswordDiscovery()
776+
777+
assertThat(showApplicationPasswordLoginDialog).isEmpty()
778+
verify(wpLoginClient).apiDiscovery(eq(TEST_URL))
779+
}
780+
749781
@Test
750782
fun `given login scenario, when api discovery is fails, then return empty authentication url`() = runTest {
751783
whenever(selectedSiteRepository.getSelectedSite()).thenReturn(siteTest)

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ indexos-media-for-mobile = '43a9026f0973a2f0a74fa813132f6a16f7499c3a'
7878
jackson-databind = '2.12.7.1'
7979
java = '11'
8080
jetty-webapp = '9.4.51.v20230217'
81-
jna = '5.15.0@aar'
81+
jna = '5.17.0@aar'
8282
json-path = '2.9.0'
8383
jsoup = '1.20.1'
8484
junit = '4.13.2'
@@ -103,7 +103,7 @@ wiremock = '2.26.3'
103103
wordpress-aztec = 'v2.1.4'
104104
wordpress-lint = '2.1.0'
105105
wordpress-persistent-edittext = '1.0.2'
106-
wordpress-rs = 'alpha-20250411'
106+
wordpress-rs = 'trunk-db86370a4ce7ae45e210e57a0403cc70ce70f167'
107107
wordpress-utils = '3.14.0'
108108
automattic-ucrop = '2.2.11'
109109
zendesk = '5.4.0'

0 commit comments

Comments
 (0)