]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Test] selectors: cases for partially-parsed selectors 6127/head
authorVsevolod Stakhov <vsevolod@rspamd.com>
Fri, 10 Jul 2026 13:16:22 +0000 (14:16 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Fri, 10 Jul 2026 13:16:22 +0000 (14:16 +0100)
Negative cases: a second ':' method, a stray closing paren and junk
after a ';' list element must be rejected. Control cases: valid
method/transform chains, selector lists and trailing whitespace must
keep parsing.

test/lua/unit/selectors.negative.lua

index 84f95c0c4fe6a58618936db08c48d2f1fd4b9f0e..fa927d6737b4c4c42fb2fc969cc121d2fc038bcc 100644 (file)
@@ -53,6 +53,18 @@ context("Selectors test", function()
 
       ["unknown transformation"] = {
                 selector = "urls.somethingnew"},
+
+      ["second method"] = {
+                selector = "from('smtp'):domain:lower"},
+
+      ["second method after transform-less method"] = {
+                selector = "urls:get_host:lower"},
+
+      ["stray paren"] = {
+                selector = "header('Subject').lower)"},
+
+      ["junk after list element"] = {
+                selector = "ip;from:addr garbage"},
   }
 
   for case_name, case in pairs(cases) do
@@ -62,6 +74,34 @@ context("Selectors test", function()
       assert_nil(sels)
     end)
   end
+
+  -- Selectors which must be parsed in whole
+  local valid_cases = {
+      ["method then transform"] = {
+                selector = "from('smtp'):domain.lower"},
+
+      ["method then transform chain"] = {
+                selector = "urls:get_host.lower.uniq"},
+
+      ["transform with arguments"] = {
+                selector = "header('Subject').lower.digest('hex')"},
+
+      ["list of selectors"] = {
+                selector = "from:addr;ip"},
+
+      ["method then transform with tld"] = {
+                selector = "from('smtp'):domain.get_tld"},
+
+      ["trailing whitespace"] = {
+                selector = "from('smtp'):domain.lower "},
+  }
+
+  for case_name, case in pairs(valid_cases) do
+    test("valid case " .. case_name, function()
+      local sels = lua_selectors.parse_selector(cfg, case.selector)
+      assert_not_nil(sels)
+    end)
+  end
 end)