Skip to content

Commit 8a54ff0

Browse files
rossbacherAndreas Rossbacher
andauthored
Added error throwable to result in error case. (#340)
Added test for method deep link. Co-authored-by: Andreas Rossbacher <[email protected]>
1 parent 592498a commit 8a54ff0

File tree

3 files changed

+98
-27
lines changed

3 files changed

+98
-27
lines changed

deeplinkdispatch/src/main/java/com/airbnb/deeplinkdispatch/BaseDeepLinkDelegate.kt

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -273,21 +273,14 @@ open class BaseDeepLinkDelegate @JvmOverloads constructor(
273273
val originalIntentUri = sourceIntent.data
274274
?: return DeepLinkResult(
275275
isSuccessful = false,
276-
uriString = null,
277276
error = "No Uri in given activity's intent.",
278277
deepLinkMatchResult = deeplinkMatchResult,
279-
methodResult = DeepLinkMethodResult(null, null),
280-
deepLinkHandlerResult = null
281278
)
282279
val deepLinkUri = DeepLinkUri.parse(originalIntentUri.toString())
283280
if (deeplinkMatchResult == null) {
284281
return DeepLinkResult(
285282
isSuccessful = false,
286-
uriString = null,
287283
error = "DeepLinkEntry cannot be null",
288-
deepLinkMatchResult = null,
289-
methodResult = DeepLinkMethodResult(null, null),
290-
deepLinkHandlerResult = null
291284
)
292285
}
293286
val queryAndPathParameters = queryAndPathParameters(
@@ -320,7 +313,6 @@ open class BaseDeepLinkDelegate @JvmOverloads constructor(
320313
DeepLinkResult(
321314
isSuccessful = true,
322315
uriString = originalIntentUri.toString(),
323-
error = "",
324316
deepLinkMatchResult = deeplinkMatchResult,
325317
methodResult = DeepLinkMethodResult(
326318
intent,
@@ -345,9 +337,8 @@ open class BaseDeepLinkDelegate @JvmOverloads constructor(
345337
isSuccessful = false,
346338
uriString = originalIntentUri.toString(),
347339
error = deepLinkMethodError.message ?: "",
348-
deepLinkMatchResult = deeplinkMatchResult,
349-
methodResult = DeepLinkMethodResult(null, null),
350-
deepLinkHandlerResult = null
340+
errorThrowable = deepLinkMethodError,
341+
deepLinkMatchResult = deeplinkMatchResult
351342
)
352343
}
353344
}
@@ -395,11 +386,20 @@ open class BaseDeepLinkDelegate @JvmOverloads constructor(
395386
)
396387
}
397388
} catch (exception: NoSuchMethodException) {
398-
throw DeeplLinkMethodError("Deep link to non-existent method: ${matchedDeeplinkEntry.method}")
389+
throw DeeplLinkMethodError(
390+
message = "Deep link to non-existent method: ${matchedDeeplinkEntry.method}",
391+
cause = exception
392+
)
399393
} catch (exception: IllegalAccessException) {
400-
throw DeeplLinkMethodError("Could not deep link to method: ${matchedDeeplinkEntry.method}")
394+
throw DeeplLinkMethodError(
395+
message = "Could not deep link to method: ${matchedDeeplinkEntry.method}",
396+
cause = exception
397+
)
401398
} catch (exception: InvocationTargetException) {
402-
throw DeeplLinkMethodError("Could not deep link to method: ${matchedDeeplinkEntry.method}")
399+
throw DeeplLinkMethodError(
400+
message = "Could not deep link to method: ${matchedDeeplinkEntry.method}",
401+
cause = exception
402+
)
403403
}
404404
}
405405
is DeepLinkEntry.HandlerDeepLinkEntry -> {
@@ -507,7 +507,10 @@ open class BaseDeepLinkDelegate @JvmOverloads constructor(
507507
}
508508
}
509509

510-
class DeeplLinkMethodError(message: String) : IllegalStateException(message)
510+
class DeeplLinkMethodError(
511+
message: String,
512+
override val cause: Throwable? = null
513+
) : IllegalStateException(message, cause)
511514

512515
/**
513516
* Retruns a bundle that contains all the parameter, either from placeholder (path/{parameterName})

deeplinkdispatch/src/main/java/com/airbnb/deeplinkdispatch/DeepLinkResult.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@ data class DeepLinkResult(
99
* @return whether or not the dispatch was a success.
1010
*/
1111
val isSuccessful: Boolean,
12-
val uriString: String?,
13-
val error: String,
14-
val deepLinkMatchResult: DeepLinkMatchResult?,
15-
val methodResult: DeepLinkMethodResult,
12+
val uriString: String? = null,
13+
val error: String = "",
14+
val errorThrowable: Throwable? = null,
15+
val deepLinkMatchResult: DeepLinkMatchResult? = null,
16+
val methodResult: DeepLinkMethodResult = DeepLinkMethodResult(null, null),
1617
val parameters: Map<String, String> = emptyMap(),
17-
val deepLinkHandlerResult: DeepLinkHandlerResult<Any>?,
18+
val deepLinkHandlerResult: DeepLinkHandlerResult<Any>? = null,
1819
) {
1920
/**
2021
* This exists so that calls from Kotlin code [error()] are maintained across major version 4.

deeplinkdispatch/src/test/java/com/airbnb/deeplinkdispatch/BaseDeepLinkDelegateTest.kt

Lines changed: 74 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,52 @@ import org.junit.Test
1212
@kotlin.ExperimentalUnsignedTypes
1313
class BaseDeepLinkDelegateTest {
1414

15+
@Test
16+
fun testFindMethodDeepLinkWrongMethod() {
17+
val uriTemplate = "airbnb://foo/{bar}"
18+
val uriString = "airbnb://foo/1"
19+
val uri = mockk<Uri>()
20+
every { uri.toString() } returns uriString
21+
val entry = methodDeepLinkEntry(
22+
uriTemplate,
23+
TestDeepLinkClassStatic::class.java.name,
24+
"wrongMethod"
25+
)
26+
val activityMock = mockk<Activity>()
27+
val testDelegate = getOneRegistryTestDelegate(listOf(entry), null)
28+
val intent = mockk<Intent>(relaxed = true)
29+
every { intent.data } returns uri
30+
every { activityMock.intent } returns intent
31+
val result =
32+
testDelegate.createResult(activityMock, intent, testDelegate.findEntry(uriTemplate))
33+
assertThat(result.isSuccessful).isFalse
34+
assertThat(result.uriString).isEqualTo(uriString)
35+
assertThat(result.error).isEqualTo("Deep link to non-existent method: wrongMethod")
36+
assertThat(result.errorThrowable).isInstanceOf(BaseDeepLinkDelegate.DeeplLinkMethodError::class.java)
37+
assertThat(result.errorThrowable?.cause).isInstanceOf(NoSuchMethodException::class.java)
38+
}
39+
40+
@Test
41+
fun testFindMethodDeepLinkethod() {
42+
val uriTemplate = "airbnb://foo/{bar}"
43+
val uriString = "airbnb://foo/1"
44+
val uri = mockk<Uri>()
45+
every { uri.toString() } returns uriString
46+
val entry =
47+
methodDeepLinkEntry(uriTemplate, TestDeepLinkClassStatic::class.java.name, "testMethod")
48+
val activityMock = mockk<Activity>(relaxed = true)
49+
val testDelegate = getOneRegistryTestDelegate(listOf(entry), null)
50+
val intent = mockk<Intent>(relaxed = true)
51+
every { intent.data } returns uri
52+
every { activityMock.intent } returns intent
53+
val result =
54+
testDelegate.createResult(activityMock, intent, testDelegate.findEntry(uriTemplate))
55+
assertThat(result.isSuccessful).isTrue
56+
assertThat(result.uriString).isEqualTo(uriString)
57+
assertThat(result.error).isEqualTo("")
58+
assertThat(result.errorThrowable).isNull()
59+
}
60+
1561
@Test
1662
fun testFindEntry() {
1763
val entry = activityDeepLinkEntry("airbnb://foo/{bar}")
@@ -102,11 +148,8 @@ class BaseDeepLinkDelegateTest {
102148
val result = testDelegate.createResult(activity, intent, null)
103149
assertThat(result).isEqualTo(
104150
DeepLinkResult(
105-
false, null, "No Uri in given activity's intent.", null,
106-
DeepLinkMethodResult(
107-
null,
108-
null
109-
),
151+
isSuccessful = false,
152+
error = "No Uri in given activity's intent.",
110153
deepLinkHandlerResult = null
111154
)
112155
)
@@ -128,7 +171,7 @@ class BaseDeepLinkDelegateTest {
128171
every { activity.applicationContext } returns appContext
129172
val errorHandler = DuplicatedMatchTestErrorHandler()
130173
val testDelegate = getTwoRegistriesTestDelegate(listOf(entry), listOf(entry), errorHandler)
131-
val (_, _, _, match) = testDelegate.dispatchFrom(activity, intent)
174+
val (_, _, _, _, match) = testDelegate.dispatchFrom(activity, intent)
132175
assertThat(errorHandler.duplicateMatchCalled).isTrue
133176
assertThat(errorHandler.duplicatedMatches).isNotNull
134177
assertThat(errorHandler.duplicatedMatches!!.size).isEqualTo(2)
@@ -155,7 +198,7 @@ class BaseDeepLinkDelegateTest {
155198
every { activity.applicationContext } returns appContext
156199
val errorHandler = DuplicatedMatchTestErrorHandler()
157200
val testDelegate = getTwoRegistriesTestDelegate(listOf(entry1), listOf(entry2), errorHandler)
158-
val (_, _, _, deepLinkEntry) = testDelegate.dispatchFrom(activity, intent)
201+
val (_, _, _, _, deepLinkEntry) = testDelegate.dispatchFrom(activity, intent)
159202
assertThat(errorHandler.duplicateMatchCalled).isFalse
160203
assertThat(deepLinkEntry!!.equals(entry2))
161204
}
@@ -184,6 +227,22 @@ class BaseDeepLinkDelegateTest {
184227
return DeepLinkEntry.ActivityDeeplinkEntry(uri, className)
185228
}
186229

230+
private fun methodDeepLinkEntry(
231+
uri: String,
232+
className: String,
233+
methodName: String
234+
): DeepLinkEntry.MethodDeeplinkEntry {
235+
return DeepLinkEntry.MethodDeeplinkEntry(uri, className, methodName)
236+
}
237+
238+
private fun handlerDeepLinkEntry(
239+
uri: String,
240+
className: String,
241+
methodName: String
242+
): DeepLinkEntry.MethodDeeplinkEntry {
243+
return DeepLinkEntry.MethodDeeplinkEntry(uri, className, methodName)
244+
}
245+
187246
private fun getTwoRegistriesTestDelegate(entriesFirstRegistry: List<DeepLinkEntry>, entriesSecondRegistry: List<DeepLinkEntry>, errorHandler: ErrorHandler): TestDeepLinkDelegate {
188247
return TestDeepLinkDelegate(listOf(testRegistry(entriesFirstRegistry), testRegistry(entriesSecondRegistry)), errorHandler)
189248
}
@@ -193,3 +252,11 @@ class BaseDeepLinkDelegateTest {
193252
}
194253
}
195254
}
255+
256+
object TestDeepLinkClassStatic {
257+
@DeepLink("airbnb://foo/{bar}")
258+
@JvmStatic
259+
fun testMethod(context: Context): Intent {
260+
return Intent()
261+
}
262+
}

0 commit comments

Comments
 (0)