|
@@ -398,3 +398,78 @@ class ParseSearchQueryBackendTest(unittest.TestCase):
|
|
|
InvalidSearchQuery, ".*queries are not supported in this search.*"
|
|
|
):
|
|
|
parse_search_query("is:unassigned")
|
|
|
+
|
|
|
+ def test_escaping_asterisk(self):
|
|
|
+ # the asterisk is escaped with a preceding backslash, so it's a literal and not a wildcard
|
|
|
+ search_filter = parse_search_query(r"title:a\*b")
|
|
|
+ assert search_filter == [
|
|
|
+ SearchFilter(key=SearchKey(name="title"), operator="=", value=SearchValue(r"a\*b"))
|
|
|
+ ]
|
|
|
+ search_filter = search_filter[0]
|
|
|
+ # the slash should be removed in the final value
|
|
|
+ assert search_filter.value.value == "a*b"
|
|
|
+
|
|
|
+ # the first and last asterisks arent escaped with a preceding backslash, so they're
|
|
|
+ # wildcards and not literals
|
|
|
+ search_filter = parse_search_query(r"title:*\**")
|
|
|
+ assert search_filter == [
|
|
|
+ SearchFilter(key=SearchKey(name="title"), operator="=", value=SearchValue(r"*\**"))
|
|
|
+ ]
|
|
|
+ search_filter = search_filter[0]
|
|
|
+ assert search_filter.value.value == r"^.*\*.*$"
|
|
|
+
|
|
|
+ @pytest.mark.xfail(reason="escaping backslashes is not supported yet")
|
|
|
+ def test_escaping_backslashes(self):
|
|
|
+ search_filter = parse_search_query(r"title:a\\b")
|
|
|
+ assert search_filter == [
|
|
|
+ SearchFilter(key=SearchKey(name="title"), operator="=", value=SearchValue(r"a\\b"))
|
|
|
+ ]
|
|
|
+ search_filter = search_filter[0]
|
|
|
+ # the extra slash should be removed in the final value
|
|
|
+ assert search_filter.value.value == r"a\b"
|
|
|
+
|
|
|
+ @pytest.mark.xfail(reason="escaping backslashes is not supported yet")
|
|
|
+ def test_trailing_escaping_backslashes(self):
|
|
|
+ search_filter = parse_search_query(r"title:a\\")
|
|
|
+ assert search_filter == [
|
|
|
+ SearchFilter(key=SearchKey(name="title"), operator="=", value=SearchValue(r"a\\"))
|
|
|
+ ]
|
|
|
+ search_filter = search_filter[0]
|
|
|
+ # the extra slash should be removed in the final value
|
|
|
+ assert search_filter.value.value == "a\\"
|
|
|
+
|
|
|
+ def test_escaping_quotes(self):
|
|
|
+ search_filter = parse_search_query(r"title:a\"b")
|
|
|
+ assert search_filter == [
|
|
|
+ SearchFilter(key=SearchKey(name="title"), operator="=", value=SearchValue(r'a"b'))
|
|
|
+ ]
|
|
|
+ search_filter = search_filter[0]
|
|
|
+ # the slash should be removed in the final value
|
|
|
+ assert search_filter.value.value == 'a"b'
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.parametrize(
|
|
|
+ "raw,result",
|
|
|
+ [
|
|
|
+ (r"", r""),
|
|
|
+ (r"foo", r"foo"),
|
|
|
+ (r"foo*bar", r"^foo.*bar$"),
|
|
|
+ (r"foo\*bar", r"foo*bar"),
|
|
|
+ (r"foo\\*bar", r"^foo\\.*bar$"),
|
|
|
+ (r"foo\\\*bar", r"foo\\*bar"),
|
|
|
+ (r"foo*", r"^foo.*$"),
|
|
|
+ (r"foo\*", r"foo*"),
|
|
|
+ (r"foo\\*", r"^foo\\.*$"),
|
|
|
+ (r"foo\\\*", r"foo\\*"),
|
|
|
+ (r"*bar", r"^.*bar$"),
|
|
|
+ (r"\*bar", r"*bar"),
|
|
|
+ (r"\\*bar", r"^\\.*bar$"),
|
|
|
+ (r"\\\*bar", r"\\*bar"),
|
|
|
+ (r"*\**", r"^.*\*.*$"),
|
|
|
+ (r"\*a\*b\*c\*", r"*a*b*c*"),
|
|
|
+ (r"\*\*\*aaa\*\*\*", r"***aaa***"),
|
|
|
+ ],
|
|
|
+)
|
|
|
+def test_search_value(raw, result):
|
|
|
+ search_value = SearchValue(raw)
|
|
|
+ assert search_value.value == result
|