blob: b26ce1c3330a7451b17fcd676096cf7bc5a65315 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.navigation
import android.net.Uri
import androidx.navigation.test.intArgument
import androidx.navigation.test.nullableStringArgument
import androidx.navigation.test.stringArgument
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
import org.junit.Assert.fail
import org.junit.Test
import java.io.UnsupportedEncodingException
@SmallTest
class NavDeepLinkTest {
companion object {
private const val DEEP_LINK_EXACT_NO_SCHEME = "www.example.com"
private const val DEEP_LINK_EXACT_HTTP = "http://$DEEP_LINK_EXACT_NO_SCHEME"
private const val DEEP_LINK_EXACT_HTTPS = "https://$DEEP_LINK_EXACT_NO_SCHEME"
}
@Test
fun deepLinkExactMatch() {
val deepLink = NavDeepLink(DEEP_LINK_EXACT_HTTP)
assertWithMessage("HTTP link should match HTTP")
.that(deepLink.matches(Uri.parse(DEEP_LINK_EXACT_HTTP)))
.isTrue()
assertWithMessage("HTTP link should not match HTTPS")
.that(deepLink.matches(Uri.parse(DEEP_LINK_EXACT_HTTPS)))
.isFalse()
}
@Test
fun deepLinkExactMatchWithHyphens() {
val deepLinkString = "android-app://com.example"
val deepLink = NavDeepLink(deepLinkString)
assertThat(deepLink.matches(Uri.parse(deepLinkString)))
.isTrue()
}
@Test
fun deepLinkExactMatchWithPlus() {
val deepLinkString = "android+app://com.example"
val deepLink = NavDeepLink(deepLinkString)
assertThat(deepLink.matches(Uri.parse(deepLinkString)))
.isTrue()
}
@Test
fun deepLinkExactMatchWithPeriods() {
val deepLinkString = "android.app://com.example"
val deepLink = NavDeepLink(deepLinkString)
assertThat(deepLink.matches(Uri.parse(deepLinkString)))
.isTrue()
}
@Test
fun deepLinkExactMatchNoScheme() {
val deepLink = NavDeepLink(DEEP_LINK_EXACT_NO_SCHEME)
assertWithMessage("No scheme deep links should match http")
.that(deepLink.matches(Uri.parse(DEEP_LINK_EXACT_HTTP)))
.isTrue()
assertWithMessage("No scheme deep links should match https")
.that(deepLink.matches(Uri.parse(DEEP_LINK_EXACT_HTTPS)))
.isTrue()
}
@Test
fun deepLinkArgumentMatchWithoutArguments() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users/{id}/posts"
val deepLink = NavDeepLink(deepLinkArgument)
val id = "2"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkArgument.replace("{id}", id)),
mapOf()
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getString("id"))
.isEqualTo(id)
}
@Test
fun deepLinkArgumentMatch() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users/{id}/posts"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkArgument.replace("{id}", id.toString())),
mapOf("id" to intArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
@Test
fun deepLinkArgumentInvalidMatch() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users/{id}/posts"
val deepLink = NavDeepLink(deepLinkArgument)
val id = "invalid"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkArgument.replace("{id}", id)),
mapOf("id" to intArgument())
)
assertWithMessage("Args should be null")
.that(matchArgs)
.isNull()
}
@Test
fun deepLinkQueryParamArgumentMatch() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?id={id}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkArgument.replace("{id}", id.toString())),
mapOf("id" to intArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
@Test
fun deepLinkQueryParamArgumentInvalidMatch() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?id={id}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = "invalid"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkArgument.replace("{id}", id)),
mapOf("id" to intArgument())
)
assertWithMessage("Args should be null")
.that(matchArgs)
.isNull()
}
@Test
fun deepLinkQueryParamMultipleArgumentMatch() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?id={id}&myarg={myarg}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val myarg = "test"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkArgument
.replace("{id}", id.toString()).replace("{myarg}", myarg)),
mapOf("id" to intArgument(),
"myarg" to stringArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
assertWithMessage("Args should contain the argument")
.that(matchArgs?.getString("myarg"))
.isEqualTo(myarg)
}
@Test
fun deepLinkQueryParamDefaultArgumentMatch() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?id={id}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users"),
mapOf("id" to intArgument(id))
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
@Test
fun deepLinkQueryParamNullableArgumentMatch() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?myarg={myarg}"
val deepLink = NavDeepLink(deepLinkArgument)
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users"),
mapOf("myarg" to nullableStringArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the argument and it should be null")
.that(matchArgs?.getString("myarg"))
.isEqualTo("@null")
}
// Ensure case when matching the exact argument query (i.e. param names in braces) is handled
@Test
fun deepLinkQueryParamDefaultArgumentMatchParamsInBraces() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?id={id}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkArgument),
mapOf("id" to intArgument(id))
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
// Ensure case when matching the exact argument query (i.e. param names in braces) is handled
@Test
fun deepLinkQueryParamNullableArgumentMatchParamsInBraces() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?myarg={myarg}"
val deepLink = NavDeepLink(deepLinkArgument)
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkArgument),
mapOf("myarg" to nullableStringArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the argument and it should be null")
.that(matchArgs?.getString("myarg"))
.isEqualTo("@null")
}
@Test
fun deepLinkQueryParamMultipleArgumentMatchOptionalDefault() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?id={id}&optional={optional}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val optional = "test"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?id={id}".replace("{id}", id.toString())),
mapOf("id" to intArgument(),
"optional" to stringArgument(optional))
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
assertWithMessage("Args should contain optional")
.that(matchArgs?.getString("optional"))
.isEqualTo(optional)
}
@Test
fun deepLinkQueryParamMultipleArgumentReverseMatchOptionalDefault() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?id={id}&optional={optional}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val optional = "test"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?optional={optional}&id={id}"
.replace("{id}", id.toString())),
mapOf("id" to intArgument(),
"optional" to stringArgument(optional))
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
assertWithMessage("Args should contain optional")
.that(matchArgs?.getString("optional"))
.isEqualTo(optional)
}
@Test
fun deepLinkQueryParamMultipleArgumentMatchOptionalNullable() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?id={id}&optional={optional}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?id={id}".replace("{id}", id.toString())),
mapOf("id" to intArgument(),
"optional" to nullableStringArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
assertWithMessage("Args should contain optional")
.that(matchArgs?.getString("optional"))
.isEqualTo("@null")
}
@Test
fun deepLinkQueryParamArgumentMatchExtraParam() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?id={id}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
try {
deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?id={id}&invalid={invalid}"
.replace("{id}", id.toString())),
mapOf("id" to intArgument(),
"invalid" to nullableStringArgument()))
fail(
"Adding parameter that does not exists in the NavDeepLink should throw " +
"IllegalArgumentException"
)
} catch (e: IllegalArgumentException) {
assertThat(e)
.hasMessageThat().contains(
"Please ensure the given query parameters are a subset of those in " +
"NavDeepLink $deepLink"
)
}
}
@Test
fun deepLinkQueryParamArgumentMatchDifferentParamName() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?string={id}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?string={id}"
.replace("{id}", id.toString())),
mapOf("id" to intArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
@Test
fun deepLinkQueryNullableParamArgumentMatchDifferentParamName() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?string={myarg}"
val deepLink = NavDeepLink(deepLinkArgument)
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users"),
mapOf("myarg" to nullableStringArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the argument and it should be null")
.that(matchArgs?.getString("myarg"))
.isEqualTo("@null")
}
@Test
fun deepLinkQueryDefaultParamArgumentMatchDifferentParamName() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?string={id}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users"),
mapOf("id" to intArgument(id))
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
@Test
fun deepLinkQueryParamArgumentMatchOnlyPartOfParam() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?id={id}L"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkArgument.replace("{id}", id.toString())),
mapOf("id" to intArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
@Test
fun deepLinkQueryNullableParamArgumentMatchOnlyPartOfParam() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?myarg={myarg}L"
val deepLink = NavDeepLink(deepLinkArgument)
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users"),
mapOf("myarg" to nullableStringArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the argument and it should be null")
.that(matchArgs?.getString("myarg"))
.isEqualTo("@null")
}
@Test
fun deepLinkQueryDefaultParamArgumentMatchOnlyPartOfParam() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?id={id}L"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users"),
mapOf("id" to intArgument(id))
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
@Test
fun deepLinkQueryParamArgumentMatchMultiArgsOneParam() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?name={first}_{last}"
val deepLink = NavDeepLink(deepLinkArgument)
val first = "Jane"
val last = "Doe"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkArgument.replace("{first}", first).replace("{last}", last)),
mapOf("first" to stringArgument(),
"last" to stringArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the first name")
.that(matchArgs?.getString("first"))
.isEqualTo(first)
assertWithMessage("Args should contain the last name")
.that(matchArgs?.getString("last"))
.isEqualTo(last)
}
@Test
fun deepLinkQueryDefaultParamArgumentMatchMultiArgsOneParam() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?name={first}_{last}"
val deepLink = NavDeepLink(deepLinkArgument)
val first = "Jane"
val last = "Doe"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users"),
mapOf("first" to stringArgument(first),
"last" to stringArgument(last))
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the first name")
.that(matchArgs?.getString("first"))
.isEqualTo(first)
assertWithMessage("Args should contain the last name")
.that(matchArgs?.getString("last"))
.isEqualTo(last)
}
@Test
fun deepLinkQueryParamOneDefaultArgumentMatchMultiArgsOneParam() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?name={first}_{last}"
val deepLink = NavDeepLink(deepLinkArgument)
val first = "Jane"
val last = "Doe"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?name=Jane_"),
mapOf("first" to stringArgument(),
"last" to stringArgument(last))
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the first name")
.that(matchArgs?.getString("first"))
.isEqualTo(first)
assertWithMessage("Args should contain the last name")
.that(matchArgs?.getString("last"))
.isEqualTo(last)
}
@Test
fun deepLinkQueryNullableParamArgumentMatchMultiArgsOneParam() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?name={first}_{last}"
val deepLink = NavDeepLink(deepLinkArgument)
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users"),
mapOf("first" to nullableStringArgument(),
"last" to nullableStringArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the first name")
.that(matchArgs?.getString("first"))
.isEqualTo("@null")
assertWithMessage("Args should contain the last name")
.that(matchArgs?.getString("last"))
.isEqualTo("@null")
}
@Test
fun deepLinkQueryParamArgumentWithWildCard() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?productId=.*-{id}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?productId=wildCardMatch-{id}"
.replace("{id}", id.toString())),
mapOf("id" to intArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
@Test
fun deepLinkQueryParamDefaultArgumentWithWildCard() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?productId=.*-{id}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users"),
mapOf("id" to intArgument(id))
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
@Test
fun deepLinkQueryParamNullableArgumentWithWildCard() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?productId=.*-{myarg}"
val deepLink = NavDeepLink(deepLinkArgument)
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?productId=wildCardMatch-{myarg}"),
mapOf("myarg" to nullableStringArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain arg as null")
.that(matchArgs?.getString("myarg"))
.isEqualTo("@null")
}
// Handle the case were the input is wild card and separator with no argument
@Test
fun deepLinkQueryParamDefaultArgumentWithWildCardOnly() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?productId=.*-{id}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?productId=.*-"),
mapOf("id" to intArgument(id))
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
@Test
fun deepLinkQueryParamArgumentWithStarInFront() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?productId=A*B{id}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?productId=A*B{id}"
.replace("{id}", id.toString())),
mapOf("id" to intArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
@Test
fun deepLinkQueryParamArgumentWithStarInBack() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?productId={id}A*B"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?productId={id}A*B"
.replace("{id}", id.toString())),
mapOf("id" to intArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
@Test
fun deepLinkQueryParamArgumentWithRegex() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?path=go/to/{path}"
val deepLink = NavDeepLink(deepLinkArgument)
val path = "directions"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?path=go/to/{path}".replace("{path}", path)),
mapOf("path" to stringArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the path")
.that(matchArgs?.getString("path"))
.isEqualTo(path)
}
@Test
fun deepLinkQueryParamDefaultArgumentWithRegex() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?path=go/to/{path}"
val deepLink = NavDeepLink(deepLinkArgument)
val path = "directions"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users"),
mapOf("path" to stringArgument(path))
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the path")
.that(matchArgs?.getString("path"))
.isEqualTo(path)
}
@Test
fun deepLinkQueryParamNullableArgumentWithRegex() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?path=go/to/{path}"
val deepLink = NavDeepLink(deepLinkArgument)
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users"),
mapOf("path" to nullableStringArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the path as null")
.that(matchArgs?.getString("path"))
.isEqualTo("@null")
}
// Handle the case were the input could be entire path except for the argument
@Test
fun deepLinkQueryParamDefaultArgumentWithRegexOnly() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users?path=go/to/{path}"
val deepLink = NavDeepLink(deepLinkArgument)
val path = "directions"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse("$DEEP_LINK_EXACT_HTTPS/users?path=go/to/"),
mapOf("path" to stringArgument(path))
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the path")
.that(matchArgs?.getString("path"))
.isEqualTo(path)
}
@Test
@Throws(UnsupportedEncodingException::class)
fun deepLinkArgumentMatchEncoded() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users/{name}/posts"
val deepLink = NavDeepLink(deepLinkArgument)
val name = "John Doe"
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkArgument.replace("{name}", Uri.encode(name))),
mapOf("name" to stringArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the name")
.that(matchArgs?.getString("name"))
.isEqualTo(name)
}
@Test
fun deepLinkMultipleArgumentMatch() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users/{id}/posts/{postId}"
val deepLink = NavDeepLink(deepLinkArgument)
val id = 2
val postId = 42
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkArgument
.replace("{id}", id.toString())
.replace("{postId}", postId.toString())),
mapOf("id" to intArgument(),
"postId" to intArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
assertWithMessage("Args should contain the postId")
.that(matchArgs?.getInt("postId"))
.isEqualTo(postId)
}
@Test
fun deepLinkEmptyArgumentNoMatch() {
val deepLinkArgument = "$DEEP_LINK_EXACT_HTTPS/users/{id}/posts"
val deepLink = NavDeepLink(deepLinkArgument)
assertThat(deepLink.matches(Uri.parse(deepLinkArgument.replace("{id}", ""))))
.isFalse()
}
@Test
fun deepLinkPrefixMatch() {
val deepLinkPrefix = "$DEEP_LINK_EXACT_HTTPS/posts/.*"
val deepLink = NavDeepLink(deepLinkPrefix)
assertThat(deepLink.matches(Uri.parse(deepLinkPrefix.replace(".*", "test"))))
.isTrue()
}
@Test
fun deepLinkWildcardMatch() {
val deepLinkWildcard = "$DEEP_LINK_EXACT_HTTPS/posts/.*/new"
val deepLink = NavDeepLink(deepLinkWildcard)
assertThat(deepLink.matches(Uri.parse(deepLinkWildcard.replace(".*", "test"))))
.isTrue()
}
@Test
fun deepLinkWildcardBeforeArgumentMatch() {
val deepLinkMultiple = "$DEEP_LINK_EXACT_HTTPS/users/.*/posts/{postId}"
val deepLink = NavDeepLink(deepLinkMultiple)
val postId = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkMultiple
.replace(".*", "test")
.replace("{postId}", postId.toString())),
mapOf("postId" to intArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the postId")
.that(matchArgs?.getInt("postId"))
.isEqualTo(postId)
}
@Test
fun deepLinkMultipleMatch() {
val deepLinkMultiple = "$DEEP_LINK_EXACT_HTTPS/users/{id}/posts/.*"
val deepLink = NavDeepLink(deepLinkMultiple)
val id = 2
val matchArgs = deepLink.getMatchingArguments(
Uri.parse(deepLinkMultiple
.replace("{id}", id.toString())
.replace(".*", "test")),
mapOf("id" to intArgument())
)
assertWithMessage("Args should not be null")
.that(matchArgs)
.isNotNull()
assertWithMessage("Args should contain the id")
.that(matchArgs?.getInt("id"))
.isEqualTo(id)
}
}