summaryrefslogtreecommitdiffstats
path: root/browser/components/search/test/unit/test_search_telemetry_compare_urls.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/search/test/unit/test_search_telemetry_compare_urls.js')
-rw-r--r--browser/components/search/test/unit/test_search_telemetry_compare_urls.js188
1 files changed, 188 insertions, 0 deletions
diff --git a/browser/components/search/test/unit/test_search_telemetry_compare_urls.js b/browser/components/search/test/unit/test_search_telemetry_compare_urls.js
new file mode 100644
index 0000000000..c99c28607a
--- /dev/null
+++ b/browser/components/search/test/unit/test_search_telemetry_compare_urls.js
@@ -0,0 +1,188 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/*
+ * This test ensures we compare URLs correctly. For more info on the scores,
+ * please read the function definition.
+ */
+
+ChromeUtils.defineESModuleGetters(this, {
+ SearchSERPTelemetry: "resource:///modules/SearchSERPTelemetry.sys.mjs",
+});
+
+const TESTS = [
+ {
+ title: "No difference",
+ url1: "https://www.example.org/search?a=b&c=d#hash",
+ url2: "https://www.example.org/search?a=b&c=d#hash",
+ expected: Infinity,
+ },
+ {
+ // Since the ordering is different, a strict equality match is not going
+ // match. The score will be high, but not Infinity.
+ title: "Different ordering of query parameters",
+ url1: "https://www.example.org/search?c=d&a=b#hash",
+ url2: "https://www.example.org/search?a=b&c=d#hash",
+ expected: 7,
+ },
+ {
+ title: "Different protocol",
+ url1: "http://www.example.org/search",
+ url2: "https://www.example.org/search",
+ expected: 0,
+ },
+ {
+ title: "Different origin",
+ url1: "https://example.org/search",
+ url2: "https://www.example.org/search",
+ expected: 0,
+ },
+ {
+ title: "Different path",
+ url1: "https://www.example.org/serp",
+ url2: "https://www.example.org/search",
+ expected: 1,
+ },
+ {
+ title: "Different path, path on",
+ url1: "https://www.example.org/serp",
+ url2: "https://www.example.org/search",
+ options: {
+ path: true,
+ },
+ expected: 0,
+ },
+ {
+ title: "Different query parameter keys",
+ url1: "https://www.example.org/search?a=c",
+ url2: "https://www.example.org/search?b=c",
+ expected: 3,
+ },
+ {
+ title: "Different query parameter keys, paramValues on",
+ url1: "https://www.example.org/search?a=c",
+ url2: "https://www.example.org/search?b=c",
+ options: {
+ paramValues: true,
+ },
+ // Shouldn't change the score because the option should only nullify
+ // the result if one of the keys match but has different values.
+ expected: 3,
+ },
+ {
+ title: "Some different query parameter keys",
+ url1: "https://www.example.org/search?a=b&c=d",
+ url2: "https://www.example.org/search?a=b",
+ expected: 5,
+ },
+ {
+ title: "Some different query parameter keys, paramValues on",
+ url1: "https://www.example.org/search?a=b&c=d",
+ url2: "https://www.example.org/search?a=b",
+ options: {
+ paramValues: true,
+ },
+ // Shouldn't change the score because the option should only trigger
+ // if the keys match but values differ.
+ expected: 5,
+ },
+ {
+ title: "Different query parameter values",
+ url1: "https://www.example.org/search?a=b",
+ url2: "https://www.example.org/search?a=c",
+ expected: 4,
+ },
+ {
+ title: "Different query parameter values, paramValues on",
+ url1: "https://www.example.org/search?a=b&c=d",
+ url2: "https://www.example.org/search?a=b&c=e",
+ options: {
+ paramValues: true,
+ },
+ expected: 0,
+ },
+ {
+ title: "Some different query parameter values",
+ url1: "https://www.example.org/search?a=b&c=d",
+ url2: "https://www.example.org/search?a=b&c=e",
+ expected: 6,
+ },
+ {
+ title: "Different query parameter values, paramValues on",
+ url1: "https://www.example.org/search?a=b&c=d",
+ url2: "https://www.example.org/search?a=b&c=e",
+ options: {
+ paramValues: true,
+ },
+ expected: 0,
+ },
+ {
+ title: "Empty query parameter",
+ url1: "https://www.example.org/search?a=b&c",
+ url2: "https://www.example.org/search?c&a=b",
+ expected: 7,
+ },
+ {
+ title: "Empty query parameter, paramValues on",
+ url1: "https://www.example.org/search?a=b&c",
+ url2: "https://www.example.org/search?c&a=b",
+ options: {
+ paramValues: true,
+ },
+ expected: 7,
+ },
+ {
+ title: "Missing empty query parameter",
+ url1: "https://www.example.org/search?c&a=b",
+ url2: "https://www.example.org/search?a=b",
+ expected: 5,
+ },
+ {
+ title: "Missing empty query parameter, paramValues on",
+ url1: "https://www.example.org/search?c&a=b",
+ url2: "https://www.example.org/search?a=b",
+ options: {
+ paramValues: true,
+ },
+ expected: 5,
+ },
+ {
+ title: "Different empty query parameter",
+ url1: "https://www.example.org/search?c&a=b",
+ url2: "https://www.example.org/search?a=b&c=foo",
+ expected: 6,
+ },
+ {
+ title: "Different empty query parameter, paramValues on",
+ url1: "https://www.example.org/search?c&a=b",
+ url2: "https://www.example.org/search?a=b&c=foo",
+ options: {
+ paramValues: true,
+ },
+ expected: 0,
+ },
+];
+
+add_setup(async function () {
+ await SearchSERPTelemetry.init();
+});
+
+add_task(async function test_parsing_extracted_urls() {
+ for (let test of TESTS) {
+ info(test.title);
+ let result = SearchSERPTelemetry.compareUrls(
+ new URL(test.url1),
+ new URL(test.url2),
+ test.options
+ );
+ Assert.equal(result, test.expected, "Equality: url1, url2");
+
+ // Flip the URLs to ensure order doesn't matter.
+ result = SearchSERPTelemetry.compareUrls(
+ new URL(test.url2),
+ new URL(test.url1),
+ test.options
+ );
+ Assert.equal(result, test.expected, "Equality: url2, url1");
+ }
+});