From 13941a20dd36b916d5668e3ece0d62961c3c570e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 2 Oct 2023 13:14:32 +0200 Subject: [PATCH 1/3] Move `appPrompt` and `confineToRoom` to the fragment part of the URL --- .../features/call/CallIntentDataParser.kt | 37 +++++++++++++-- .../call/CallIntentDataParserTests.kt | 45 ++++++++++++++++--- 2 files changed, 71 insertions(+), 11 deletions(-) diff --git a/features/call/src/main/kotlin/io/element/android/features/call/CallIntentDataParser.kt b/features/call/src/main/kotlin/io/element/android/features/call/CallIntentDataParser.kt index b3e2f9227a..b903b437d8 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/CallIntentDataParser.kt +++ b/features/call/src/main/kotlin/io/element/android/features/call/CallIntentDataParser.kt @@ -54,21 +54,50 @@ class CallIntentDataParser @Inject constructor() { } /** - * Ensure the uri has the following parameters and value: + * Ensure the uri has the following parameters and value in the fragment: * - appPrompt=false * - confineToRoom=true * to ensure that the rendering will bo correct on the embedded Webview. */ private fun Uri.withCustomParameters(): String { val builder = buildUpon() + // Remove the existing query parameters builder.clearQuery() queryParameterNames.forEach { if (it == APP_PROMPT_PARAMETER || it == CONFINE_TO_ROOM_PARAMETER) return@forEach builder.appendQueryParameter(it, getQueryParameter(it)) } - builder.appendQueryParameter(APP_PROMPT_PARAMETER, "false") - builder.appendQueryParameter(CONFINE_TO_ROOM_PARAMETER, "true") - return builder.build().toString() + // Remove the existing fragment parameters, and build the new fragment + val currentFragment = fragment ?: "" + // Reset the current fragment + builder.fragment("") + val queryFragmentPosition = currentFragment.lastIndexOf("?") + val newFragment = if (queryFragmentPosition == -1) { + // No existing query, build it. + "$currentFragment?$APP_PROMPT_PARAMETER=false&$CONFINE_TO_ROOM_PARAMETER=true" + } else { + buildString { + append(currentFragment.substring(0, queryFragmentPosition + 1)) + val queryFragment = currentFragment.substring(queryFragmentPosition + 1) + // Replace the existing parameters + val newQueryFragment = queryFragment + .replace("$APP_PROMPT_PARAMETER=true", "$APP_PROMPT_PARAMETER=false") + .replace("$CONFINE_TO_ROOM_PARAMETER=false", "$CONFINE_TO_ROOM_PARAMETER=true") + append(newQueryFragment) + // Ensure the parameters are there + if (!newQueryFragment.contains("$APP_PROMPT_PARAMETER=false")) { + if (newQueryFragment.isNotEmpty()) { + append("&") + } + append("$APP_PROMPT_PARAMETER=false") + } + if (!newQueryFragment.contains("$CONFINE_TO_ROOM_PARAMETER=true")) { + append("&$CONFINE_TO_ROOM_PARAMETER=true") + } + } + } + // We do not want to encode the Fragment part, so append it manually + return builder.build().toString() + "#" + newFragment } private const val APP_PROMPT_PARAMETER = "appPrompt" diff --git a/features/call/src/test/kotlin/io/element/android/features/call/CallIntentDataParserTests.kt b/features/call/src/test/kotlin/io/element/android/features/call/CallIntentDataParserTests.kt index aee97ed982..148c2fe30d 100644 --- a/features/call/src/test/kotlin/io/element/android/features/call/CallIntentDataParserTests.kt +++ b/features/call/src/test/kotlin/io/element/android/features/call/CallIntentDataParserTests.kt @@ -63,8 +63,8 @@ class CallIntentDataParserTests { fun `Element Call urls will be returned as is`() { val httpsBaseUrl = "https://call.element.io" val httpsCallUrl = VALID_CALL_URL_WITH_PARAM - assertThat(callIntentDataParser.parse(httpsBaseUrl)).isEqualTo("$httpsBaseUrl?$EXTRA_PARAMS") - assertThat(callIntentDataParser.parse(httpsCallUrl)).isEqualTo("$httpsCallUrl&$EXTRA_PARAMS") + assertThat(callIntentDataParser.parse(httpsBaseUrl)).isEqualTo("$httpsBaseUrl#?$EXTRA_PARAMS") + assertThat(callIntentDataParser.parse(httpsCallUrl)).isEqualTo("$httpsCallUrl#?$EXTRA_PARAMS") } @Test @@ -92,7 +92,7 @@ class CallIntentDataParserTests { val embeddedUrl = VALID_CALL_URL_WITH_PARAM val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") val url = "element://call?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM&$EXTRA_PARAMS") + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS") } @Test @@ -108,7 +108,7 @@ class CallIntentDataParserTests { val embeddedUrl = VALID_CALL_URL_WITH_PARAM val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM&$EXTRA_PARAMS") + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS") } @Test @@ -160,7 +160,15 @@ class CallIntentDataParserTests { val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}&appPrompt=true" val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM&$EXTRA_PARAMS") + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS") + } + + @Test + fun `element scheme 2 with url extra param in fragment appPrompt gets url extracted`() { + val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?appPrompt=true" + val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") + val url = "io.element.call:/?url=$encodedUrl" + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?appPrompt=false&confineToRoom=true") } @Test @@ -168,7 +176,15 @@ class CallIntentDataParserTests { val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}&confineToRoom=false" val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM&$EXTRA_PARAMS") + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS") + } + + @Test + fun `element scheme 2 with url extra param in fragment confineToRoom gets url extracted`() { + val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?confineToRoom=false" + val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") + val url = "io.element.call:/?url=$encodedUrl" + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?confineToRoom=true&appPrompt=false") } @Test @@ -176,9 +192,24 @@ class CallIntentDataParserTests { val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#fragment" val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM&$EXTRA_PARAMS#fragment") + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#fragment?$EXTRA_PARAMS") } + @Test + fun `element scheme 2 with empty fragment`() { + val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#" + val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") + val url = "io.element.call:/?url=$encodedUrl" + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS") + } + + @Test + fun `element scheme 2 with empty fragment and fragment query`() { + val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?" + val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") + val url = "io.element.call:/?url=$encodedUrl" + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS") + } companion object { const val VALID_CALL_URL_WITH_PARAM = "https://call.element.io/some-actual-call?with=parameters" From 238d470f6dc24cc3b42b8107c53752351a5c1629 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 2 Oct 2023 13:25:47 +0200 Subject: [PATCH 2/3] Add more tests --- .../call/CallIntentDataParserTests.kt | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/features/call/src/test/kotlin/io/element/android/features/call/CallIntentDataParserTests.kt b/features/call/src/test/kotlin/io/element/android/features/call/CallIntentDataParserTests.kt index 148c2fe30d..8650fad444 100644 --- a/features/call/src/test/kotlin/io/element/android/features/call/CallIntentDataParserTests.kt +++ b/features/call/src/test/kotlin/io/element/android/features/call/CallIntentDataParserTests.kt @@ -171,6 +171,14 @@ class CallIntentDataParserTests { assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?appPrompt=false&confineToRoom=true") } + @Test + fun `element scheme 2 with url extra param in fragment appPrompt and other gets url extracted`() { + val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?appPrompt=true&otherParam=maybe" + val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") + val url = "io.element.call:/?url=$encodedUrl" + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?appPrompt=false&otherParam=maybe&confineToRoom=true") + } + @Test fun `element scheme 2 with url extra param confineToRoom gets url extracted`() { val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}&confineToRoom=false" @@ -187,6 +195,14 @@ class CallIntentDataParserTests { assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?confineToRoom=true&appPrompt=false") } + @Test + fun `element scheme 2 with url extra param in fragment confineToRoom and more gets url extracted`() { + val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?confineToRoom=false&otherParam=maybe" + val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") + val url = "io.element.call:/?url=$encodedUrl" + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?confineToRoom=true&otherParam=maybe&appPrompt=false") + } + @Test fun `element scheme 2 with url fragment gets url extracted`() { val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#fragment" @@ -195,6 +211,22 @@ class CallIntentDataParserTests { assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#fragment?$EXTRA_PARAMS") } + @Test + fun `element scheme 2 with url fragment with params gets url extracted`() { + val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#fragment?otherParam=maybe" + val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") + val url = "io.element.call:/?url=$encodedUrl" + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#fragment?otherParam=maybe&$EXTRA_PARAMS") + } + + @Test + fun `element scheme 2 with url fragment with other params gets url extracted`() { + val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?otherParam=maybe" + val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") + val url = "io.element.call:/?url=$encodedUrl" + assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?otherParam=maybe&$EXTRA_PARAMS") + } + @Test fun `element scheme 2 with empty fragment`() { val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#" From 35b37f0caadd8dd40c1d96c5e99a643fdfa5c664 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 2 Oct 2023 13:51:16 +0200 Subject: [PATCH 3/3] Refactor tests. --- .../call/CallIntentDataParserTests.kt | 213 ++++++++---------- 1 file changed, 94 insertions(+), 119 deletions(-) diff --git a/features/call/src/test/kotlin/io/element/android/features/call/CallIntentDataParserTests.kt b/features/call/src/test/kotlin/io/element/android/features/call/CallIntentDataParserTests.kt index 8650fad444..f23a5fb43c 100644 --- a/features/call/src/test/kotlin/io/element/android/features/call/CallIntentDataParserTests.kt +++ b/features/call/src/test/kotlin/io/element/android/features/call/CallIntentDataParserTests.kt @@ -35,92 +35,51 @@ class CallIntentDataParserTests { @Test fun `empty data returns null`() { - val url = "" - assertThat(callIntentDataParser.parse(url)).isNull() + doTest("", null) } @Test fun `invalid data returns null`() { - val url = "!" - assertThat(callIntentDataParser.parse(url)).isNull() + doTest("!", null) } @Test fun `data with no scheme returns null`() { - val url = "test" - assertThat(callIntentDataParser.parse(url)).isNull() + doTest("test", null) } @Test fun `Element Call http urls returns null`() { - val httpBaseUrl = "http://call.element.io" - val httpCallUrl = "http://call.element.io/some-actual-call?with=parameters" - assertThat(callIntentDataParser.parse(httpBaseUrl)).isNull() - assertThat(callIntentDataParser.parse(httpCallUrl)).isNull() + doTest("http://call.element.io", null) + doTest("http://call.element.io/some-actual-call?with=parameters", null) } @Test fun `Element Call urls will be returned as is`() { - val httpsBaseUrl = "https://call.element.io" - val httpsCallUrl = VALID_CALL_URL_WITH_PARAM - assertThat(callIntentDataParser.parse(httpsBaseUrl)).isEqualTo("$httpsBaseUrl#?$EXTRA_PARAMS") - assertThat(callIntentDataParser.parse(httpsCallUrl)).isEqualTo("$httpsCallUrl#?$EXTRA_PARAMS") + doTest( + url = "https://call.element.io", + expectedResult = "https://call.element.io#?$EXTRA_PARAMS" + ) + } + + @Test + fun `Element Call url with url param gets url extracted`() { + doTest( + url = VALID_CALL_URL_WITH_PARAM, + expectedResult = "$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS" + ) } @Test fun `HTTP and HTTPS urls that don't come from EC return null`() { - val httpBaseUrl = "http://app.element.io" - val httpsBaseUrl = "https://app.element.io" - val httpInvalidUrl = "http://" - val httpsInvalidUrl = "http://" - assertThat(callIntentDataParser.parse(httpBaseUrl)).isNull() - assertThat(callIntentDataParser.parse(httpsBaseUrl)).isNull() - assertThat(callIntentDataParser.parse(httpInvalidUrl)).isNull() - assertThat(callIntentDataParser.parse(httpsInvalidUrl)).isNull() + doTest("http://app.element.io", null) + doTest("https://app.element.io", null, testEmbedded = false) + doTest("http://", null) + doTest("https://", null) } @Test - fun `element scheme with call host and url with http will returns null`() { - val embeddedUrl = "http://call.element.io/some-actual-call?with=parameters" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "element://call?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isNull() - } - - @Test - fun `element scheme with call host and url param gets url extracted`() { - val embeddedUrl = VALID_CALL_URL_WITH_PARAM - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "element://call?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS") - } - - @Test - fun `element scheme 2 with url param with http returns null`() { - val embeddedUrl = "http://call.element.io/some-actual-call?with=parameters" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isNull() - } - - @Test - fun `element scheme 2 with url param gets url extracted`() { - val embeddedUrl = VALID_CALL_URL_WITH_PARAM - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS") - } - - @Test - fun `element scheme with call host and no url param returns null`() { - val embeddedUrl = "http://call.element.io/some-actual-call?with=parameters" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "element://call?no-url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isNull() - } - - @Test - fun `element scheme 2 with no url returns null`() { + fun `Element Call url with no url returns null`() { val embeddedUrl = VALID_CALL_URL_WITH_PARAM val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") val url = "io.element.call:/?no_url=$encodedUrl" @@ -142,7 +101,7 @@ class CallIntentDataParserTests { } @Test - fun `element scheme 2 with no data returns null`() { + fun `Element Call url with no data returns null`() { val url = "io.element.call:/?url=" assertThat(callIntentDataParser.parse(url)).isNull() } @@ -156,91 +115,107 @@ class CallIntentDataParserTests { } @Test - fun `element scheme 2 with url extra param appPrompt gets url extracted`() { - val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}&appPrompt=true" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS") + fun `Element Call url with url extra param appPrompt gets url extracted`() { + doTest( + url = "${VALID_CALL_URL_WITH_PARAM}&appPrompt=true", + expectedResult = "$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS" + ) } @Test - fun `element scheme 2 with url extra param in fragment appPrompt gets url extracted`() { - val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?appPrompt=true" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?appPrompt=false&confineToRoom=true") + fun `Element Call url with url extra param in fragment appPrompt gets url extracted`() { + doTest( + url = "${VALID_CALL_URL_WITH_PARAM}#?appPrompt=true", + expectedResult = "$VALID_CALL_URL_WITH_PARAM#?appPrompt=false&confineToRoom=true" + ) } @Test - fun `element scheme 2 with url extra param in fragment appPrompt and other gets url extracted`() { - val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?appPrompt=true&otherParam=maybe" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?appPrompt=false&otherParam=maybe&confineToRoom=true") + fun `Element Call url with url extra param in fragment appPrompt and other gets url extracted`() { + doTest( + url = "${VALID_CALL_URL_WITH_PARAM}#?appPrompt=true&otherParam=maybe", + expectedResult = "$VALID_CALL_URL_WITH_PARAM#?appPrompt=false&otherParam=maybe&confineToRoom=true" + ) } @Test - fun `element scheme 2 with url extra param confineToRoom gets url extracted`() { - val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}&confineToRoom=false" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS") + fun `Element Call url with url extra param confineToRoom gets url extracted`() { + doTest( + url = "${VALID_CALL_URL_WITH_PARAM}&confineToRoom=false", + expectedResult = "$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS" + ) } @Test - fun `element scheme 2 with url extra param in fragment confineToRoom gets url extracted`() { - val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?confineToRoom=false" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?confineToRoom=true&appPrompt=false") + fun `Element Call url with url extra param in fragment confineToRoom gets url extracted`() { + doTest( + url = "${VALID_CALL_URL_WITH_PARAM}#?confineToRoom=false", + expectedResult = "$VALID_CALL_URL_WITH_PARAM#?confineToRoom=true&appPrompt=false" + ) } @Test - fun `element scheme 2 with url extra param in fragment confineToRoom and more gets url extracted`() { - val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?confineToRoom=false&otherParam=maybe" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?confineToRoom=true&otherParam=maybe&appPrompt=false") + fun `Element Call url with url extra param in fragment confineToRoom and more gets url extracted`() { + doTest( + url = "${VALID_CALL_URL_WITH_PARAM}#?confineToRoom=false&otherParam=maybe", + expectedResult = "$VALID_CALL_URL_WITH_PARAM#?confineToRoom=true&otherParam=maybe&appPrompt=false" + ) } @Test - fun `element scheme 2 with url fragment gets url extracted`() { - val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#fragment" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#fragment?$EXTRA_PARAMS") + fun `Element Call url with url fragment gets url extracted`() { + doTest( + url = "${VALID_CALL_URL_WITH_PARAM}#fragment", + expectedResult = "$VALID_CALL_URL_WITH_PARAM#fragment?$EXTRA_PARAMS" + ) } @Test - fun `element scheme 2 with url fragment with params gets url extracted`() { - val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#fragment?otherParam=maybe" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#fragment?otherParam=maybe&$EXTRA_PARAMS") + fun `Element Call url with url fragment with params gets url extracted`() { + doTest( + url = "${VALID_CALL_URL_WITH_PARAM}#fragment?otherParam=maybe", + expectedResult = "$VALID_CALL_URL_WITH_PARAM#fragment?otherParam=maybe&$EXTRA_PARAMS" + ) } @Test - fun `element scheme 2 with url fragment with other params gets url extracted`() { - val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?otherParam=maybe" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?otherParam=maybe&$EXTRA_PARAMS") + fun `Element Call url with url fragment with other params gets url extracted`() { + doTest( + url = "${VALID_CALL_URL_WITH_PARAM}#?otherParam=maybe", + expectedResult = "$VALID_CALL_URL_WITH_PARAM#?otherParam=maybe&$EXTRA_PARAMS" + ) } @Test - fun `element scheme 2 with empty fragment`() { - val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS") + fun `Element Call url with empty fragment`() { + doTest( + url = "${VALID_CALL_URL_WITH_PARAM}#", + expectedResult = "$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS" + ) } @Test - fun `element scheme 2 with empty fragment and fragment query`() { - val embeddedUrl = "${VALID_CALL_URL_WITH_PARAM}#?" - val encodedUrl = URLEncoder.encode(embeddedUrl, "utf-8") - val url = "io.element.call:/?url=$encodedUrl" - assertThat(callIntentDataParser.parse(url)).isEqualTo("$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS") + fun `Element Call url with empty fragment query`() { + doTest( + url = "${VALID_CALL_URL_WITH_PARAM}#?", + expectedResult = "$VALID_CALL_URL_WITH_PARAM#?$EXTRA_PARAMS" + ) + } + + private fun doTest(url: String, expectedResult: String?, testEmbedded: Boolean = true) { + // Test direct parsing + assertThat(callIntentDataParser.parse(url)).isEqualTo(expectedResult) + + if (testEmbedded) { + // Test embedded url, scheme 1 + val encodedUrl = URLEncoder.encode(url, "utf-8") + val urlScheme1 = "element://call?url=$encodedUrl" + assertThat(callIntentDataParser.parse(urlScheme1)).isEqualTo(expectedResult) + + // Test embedded url, scheme 2 + val urlScheme2 = "io.element.call:/?url=$encodedUrl" + assertThat(callIntentDataParser.parse(urlScheme2)).isEqualTo(expectedResult) + } } companion object {