Skip to content

Commit

Permalink
[no-jira]: migrate KSUri.java to URI kotlin extension (#1368)
Browse files Browse the repository at this point in the history
  • Loading branch information
Arkariang committed Aug 19, 2021
1 parent fbf34a0 commit f5983e8
Show file tree
Hide file tree
Showing 2 changed files with 344 additions and 0 deletions.
165 changes: 165 additions & 0 deletions app/src/main/java/com/kickstarter/libs/utils/extensions/UriExt.kt
Expand Up @@ -2,6 +2,9 @@
package com.kickstarter.libs.utils.extensions

import android.net.Uri
import com.kickstarter.libs.utils.ObjectUtils
import com.kickstarter.libs.utils.Secrets
import java.util.regex.Pattern

fun Uri.host(): String {
return this.host ?: ""
Expand Down Expand Up @@ -30,3 +33,165 @@ fun Uri.query(): String {
fun Uri.getTokenFromQueryParams(): String {
return this.getQueryParameter("at") ?: ""
}

fun Uri.isSettingsUrl(): Boolean {
return this.toString().contains("/settings/notify_mobile_of_marketing_update/true")
}

fun Uri.isVerificationEmailUrl(): Boolean {
return this.toString().contains(VERIFICATION)
}

fun Uri.isApiUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && Secrets.RegExpPattern.API.matcher(host())
.matches()
}

fun Uri.isCheckoutUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && NATIVE_CHECKOUT_PATTERN.matcher(path())
.matches()
}

fun Uri.isDiscoverCategoriesPath(): Boolean {
return DISCOVER_CATEGORIES_PATTERN.matcher(path()).matches()
}

fun Uri.isDiscoverScopePath(scope: String): Boolean {
val matcher = DISCOVER_SCOPE_PATTERN.matcher(path())
return matcher.matches() && scope == matcher.group(1)
}

fun Uri.isDiscoverPlacesPath(): Boolean {
return DISCOVER_PLACES_PATTERN.matcher(path()).matches()
}

fun Uri.isHivequeenUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && Secrets.RegExpPattern.HIVEQUEEN.matcher(host()).matches()
}

fun Uri.isKickstarterUri(webEndpoint: String): Boolean {
return host() == Uri.parse(webEndpoint).host()
}

fun Uri.isKSFavIcon(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && lastPathSegment() == "favicon.ico"
}

fun Uri.isWebViewUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && !isKSFavIcon(webEndpoint)
}

fun Uri.isNewGuestCheckoutUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && NEW_GUEST_CHECKOUT_PATTERN.matcher(path())
.matches()
}

fun Uri.isProjectUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && PROJECT_PATTERN.matcher(path()).matches()
}

fun Uri.isProjectPreviewUri(webEndpoint: String): Boolean {
return isProjectUri(
webEndpoint
) && ObjectUtils.isNotNull(getQueryParameter("token"))
}

fun Uri.isSignupUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && path() == "/signup"
}

fun Uri.isStagingUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && Secrets.RegExpPattern.STAGING.matcher(host()).matches()
}

fun Uri.isCheckoutThanksUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && CHECKOUT_THANKS_PATTERN.matcher(path())
.matches()
}

fun Uri.isModalUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && getQueryParameter("modal") != null && getQueryParameter("modal") == "true"
}

fun Uri.isProjectSurveyUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && PROJECT_SURVEY.matcher(path()).matches()
}

fun Uri.isProjectUpdateCommentsUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && PROJECT_UPDATE_COMMENTS_PATTERN.matcher(path()).matches()
}

fun Uri.isProjectUpdateUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && PROJECT_UPDATE_PATTERN.matcher(path())
.matches()
}

fun Uri.isProjectUpdatesUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && PROJECT_UPDATES_PATTERN.matcher(path())
.matches()
}

fun Uri.isUserSurveyUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && USER_SURVEY.matcher(path()).matches()
}

fun Uri.isWebUri(webEndpoint: String): Boolean {
return isKickstarterUri(webEndpoint) && !isApiUri(webEndpoint)
}

private const val VERIFICATION = "/profile/verify_email"

// /projects/:creator_param/:project_param/checkouts/1/thanks
private val CHECKOUT_THANKS_PATTERN = Pattern.compile(
"\\A\\/projects(\\/[a-zA-Z0-9_-]+)?\\/[a-zA-Z0-9_-]+\\/checkouts\\/\\d+\\/thanks\\z"
)

// /discover/categories/param
private val DISCOVER_CATEGORIES_PATTERN = Pattern.compile("\\A\\/discover\\/categories\\/.*")

// /discover/param
private val DISCOVER_SCOPE_PATTERN = Pattern.compile("\\A\\/discover\\/([a-zA-Z0-9-_]+)\\z")

// /discover/places/param
private val DISCOVER_PLACES_PATTERN =
Pattern.compile("\\A\\/discover\\/places\\/[a-zA-Z0-9-_]+\\z")

// /projects/:creator_param/:project_param/pledge
private val NATIVE_CHECKOUT_PATTERN = Pattern.compile(
"\\A\\/projects(\\/[a-zA-Z0-9_-]+)?\\/[a-zA-Z0-9_-]+\\/pledge\\z"
)

// /checkouts/:checkout_id/guest/new
private val NEW_GUEST_CHECKOUT_PATTERN = Pattern.compile(
"\\A\\/checkouts\\/[a-zA-Z0-9-_]+\\/guest\\/new\\z"
)

// /projects/:creator_param/:project_param
private val PROJECT_PATTERN = Pattern.compile(
"\\A\\/projects(\\/[a-zA-Z0-9_-]+)?\\/[a-zA-Z0-9_-]+\\/?\\z"
)

// /projects/:creator_param/:project_param/surveys/:survey_param
private val PROJECT_SURVEY = Pattern.compile(
"\\A\\/projects(\\/[a-zA-Z0-9_-]+)?\\/[a-zA-Z0-9_-]+\\/surveys\\/[a-zA-Z0-9-_]+\\z"
)

// /projects/:creator_param/:project_param/posts/:update_param/comments
private val PROJECT_UPDATE_COMMENTS_PATTERN = Pattern.compile(
"\\A\\/projects(\\/[a-zA-Z0-9_-]+)?\\/[a-zA-Z0-9_-]+\\/posts\\/[a-zA-Z0-9-_]+\\/comments\\z"
)

// /projects/:creator_param/:project_param/posts/:update_param
private val PROJECT_UPDATE_PATTERN = Pattern.compile(
"\\A\\/projects(\\/[a-zA-Z0-9_-]+)?\\/[a-zA-Z0-9_-]+\\/posts\\/[a-zA-Z0-9-_]+\\z"
)

// /projects/:creator_param/:project_param/posts
private val PROJECT_UPDATES_PATTERN = Pattern.compile(
"\\A\\/projects(\\/[a-zA-Z0-9_-]+)?\\/[a-zA-Z0-9_-]+\\/posts\\z"
)

// /users/:user_param/surveys/:survey_response_id": userSurvey
private val USER_SURVEY = Pattern.compile(
"\\A\\/users(\\/[a-zA-Z0-9_-]+)?\\/surveys\\/[a-zA-Z0-9-_]+\\z"
)
179 changes: 179 additions & 0 deletions app/src/test/java/com/kickstarter/services/UriExtTest.kt
@@ -0,0 +1,179 @@
package com.kickstarter.services

import android.net.Uri
import com.kickstarter.KSRobolectricTestCase
import com.kickstarter.libs.utils.extensions.isCheckoutUri
import com.kickstarter.libs.utils.extensions.isDiscoverCategoriesPath
import com.kickstarter.libs.utils.extensions.isDiscoverPlacesPath
import com.kickstarter.libs.utils.extensions.isDiscoverScopePath
import com.kickstarter.libs.utils.extensions.isKSFavIcon
import com.kickstarter.libs.utils.extensions.isKickstarterUri
import com.kickstarter.libs.utils.extensions.isModalUri
import com.kickstarter.libs.utils.extensions.isNewGuestCheckoutUri
import com.kickstarter.libs.utils.extensions.isProjectPreviewUri
import com.kickstarter.libs.utils.extensions.isProjectSurveyUri
import com.kickstarter.libs.utils.extensions.isProjectUpdateCommentsUri
import com.kickstarter.libs.utils.extensions.isProjectUpdateUri
import com.kickstarter.libs.utils.extensions.isProjectUpdatesUri
import com.kickstarter.libs.utils.extensions.isProjectUri
import com.kickstarter.libs.utils.extensions.isSettingsUrl
import com.kickstarter.libs.utils.extensions.isSignupUri
import com.kickstarter.libs.utils.extensions.isUserSurveyUri
import com.kickstarter.libs.utils.extensions.isVerificationEmailUrl
import com.kickstarter.libs.utils.extensions.isWebViewUri
import org.junit.Test

class UriExtTest : KSRobolectricTestCase() {
private val checkoutUri = Uri.parse("https://www.ksr.com/projects/creator/project/pledge")
private val deepLinkMarketingHttps =
Uri.parse("https://www.kickstarter.com/settings/notify_mobile_of_marketing_update/true")
private val deepLinkMarketingHttpsStaging =
Uri.parse("https://staging.kickstarter.com/settings/notify_mobile_of_marketing_update/true")
private val deepLinkMarketingKsr =
Uri.parse("ksr://www.kickstarter.com/settings/notify_mobile_of_marketing_update/true")
private val deepLinkMarketingKsrStaging =
Uri.parse("ksr://staging.kickstarter.com/settings/notify_mobile_of_marketing_update/true")
private val discoverCategoriesUri = Uri.parse("https://www.ksr.com/discover/categories/art")
private val discoverScopeUri = Uri.parse("https://www.kickstarter.com/discover/ending-soon")
private val discoverPlacesUri = Uri.parse("https://www.ksr.com/discover/places/newest")
private val newGuestCheckoutUri = Uri.parse("https://www.ksr.com/checkouts/1/guest/new")
private val projectUri = Uri.parse("https://www.ksr.com/projects/creator/project")
private val signUpUri = Uri.parse("https://www.ksr.com/signup")
private val verificationEmail = Uri.parse("https://www.ksr.com/profile/verify_email")
private val projectPreviewUri =
Uri.parse("https://www.ksr.com/projects/creator/project?token=token")
private val projectSurveyUri =
Uri.parse("https://www.ksr.com/projects/creator/project/surveys/survey-param")
private val updatesUri = Uri.parse("https://www.ksr.com/projects/creator/project/posts")
private val updateUri = Uri.parse("https://www.ksr.com/projects/creator/project/posts/id")
private val userSurveyUri = Uri.parse("https://www.ksr.com/users/user-param/surveys/survey-id")
private val webEndpoint = "https://www.ksr.com"

@Test
fun testUri_isCheckoutUri() {
assertTrue(checkoutUri.isCheckoutUri(webEndpoint))
}

@Test
fun testUri_isSettingsURI() {
assertTrue(deepLinkMarketingHttps.isSettingsUrl())
assertTrue(deepLinkMarketingKsr.isSettingsUrl())
assertTrue(deepLinkMarketingHttpsStaging.isSettingsUrl())
assertTrue(deepLinkMarketingKsrStaging.isSettingsUrl())
}

@Test
fun testUri_isDiscoverCategoriesPath() {
assertTrue(discoverCategoriesUri.isDiscoverCategoriesPath())
assertFalse(discoverPlacesUri.isDiscoverCategoriesPath())
}

@Test
fun testUri_isDiscoverPlacesPath() {
assertTrue(discoverPlacesUri.isDiscoverPlacesPath())
assertFalse(discoverCategoriesUri.isDiscoverPlacesPath())
}

@Test
fun testUri_isDiscoverScopePath() {
assertTrue(discoverScopeUri.isDiscoverScopePath("ending-soon"))
}

@Test
fun testUri_isKickstarterUri() {
val ksrUri = Uri.parse("https://www.ksr.com/discover")
val uri = Uri.parse("https://www.hello-world.org/goodbye")
assertTrue(ksrUri.isKickstarterUri(webEndpoint))
assertFalse(uri.isKickstarterUri(webEndpoint))
}

@Test
fun testUri_isWebViewUri() {
val ksrUri = Uri.parse("https://www.ksr.com/project")
val uri = Uri.parse("https://www.hello-world.org/goodbye")
val ksrGraphUri = Uri.parse("https://www.ksr.com/graph")
val graphUri = Uri.parse("https://www.hello-world.org/graph")
val favIconUri = Uri.parse("https://www.ksr.com/favicon.ico")
assertTrue(ksrUri.isWebViewUri(webEndpoint))
assertFalse(uri.isWebViewUri(webEndpoint))
assertTrue(ksrGraphUri.isWebViewUri(webEndpoint))
assertFalse(graphUri.isWebViewUri(webEndpoint))
assertFalse(favIconUri.isWebViewUri(webEndpoint))
}

@Test
fun testUri_isKSFavIcon() {
val ksrUri = Uri.parse("https://www.ksr.com/favicon.ico")
val uri = Uri.parse("https://www.hello-world.org/goodbye")
assertTrue(ksrUri.isKSFavIcon(webEndpoint))
assertFalse(uri.isKSFavIcon(webEndpoint))
}

@Test
fun testUri_isModalUri() {
val modalUri = Uri.parse("https://www.ksr.com/project?modal=true")
assertTrue(modalUri.isModalUri(webEndpoint))
assertFalse(projectUri.isModalUri(webEndpoint))
}

@Test
fun testUri_isNewGuestCheckoutUri() {
assertTrue(newGuestCheckoutUri.isNewGuestCheckoutUri(webEndpoint))
}

@Test
fun testUri_isProjectSurveyUri() {
assertTrue(projectSurveyUri.isProjectSurveyUri(webEndpoint))
assertFalse(userSurveyUri.isProjectSurveyUri(webEndpoint))
}

@Test
fun testUri_isProjectUpdateCommentsUri() {
val updateCommentsUri = Uri.parse("https://www.ksr.com/projects/creator/project/posts/id/comments")
assertTrue(updateCommentsUri.isProjectUpdateCommentsUri(webEndpoint))
assertFalse(updatesUri.isProjectUpdateCommentsUri(webEndpoint))
}

@Test
fun testUri_isProjectUpdateUri() {
assertTrue(updateUri.isProjectUpdateUri(webEndpoint))
assertFalse(updatesUri.isProjectUpdateUri(webEndpoint))
}

@Test
fun testUri_isProjectUpdatesUri() {
assertTrue(updatesUri.isProjectUpdatesUri(webEndpoint))
assertFalse(updateUri.isProjectUpdatesUri(webEndpoint))
}

@Test
fun testUri_isProjectUri() {
assertTrue(projectUri.isProjectUri(webEndpoint))
assertTrue(projectPreviewUri.isProjectUri(webEndpoint))
assertFalse(updateUri.isProjectUri(webEndpoint))
}

@Test
fun testUri_isProjectPreviewUri() {
assertTrue(projectPreviewUri.isProjectPreviewUri(webEndpoint))
assertFalse(projectUri.isProjectPreviewUri(webEndpoint))
}

@Test
fun testUri_isUserSurveyUri() {
assertTrue(userSurveyUri.isUserSurveyUri(webEndpoint))
assertFalse(projectSurveyUri.isUserSurveyUri(webEndpoint))
}

@Test
fun testUri_isSignupUri() {
assertFalse(projectUri.isSignupUri(webEndpoint))
assertTrue(signUpUri.isSignupUri(webEndpoint))
}

@Test
fun testUri_isVerificationEmailUrl() {
assertFalse(projectUri.isVerificationEmailUrl())
assertTrue(verificationEmail.isVerificationEmailUrl())
}
}

0 comments on commit f5983e8

Please sign in to comment.