local msg
context("Selectors test", function()
  local rspamd_task = require "rspamd_task"
  local logger = require "rspamd_logger"
  local lua_selectors = require "lua_selectors"
  local ok, ffi = pcall(require, "ffi")
  if not ok then
    ffi = require("cffi")
  end
  local cfg = rspamd_config

  local task

  ffi.cdef[[
  void rspamd_url_init (const char *tld_file);
  ]]

  local test_dir = string.gsub(debug.getinfo(1).source, "^@(.+/)[^/]+$", "%1")

  ffi.C.rspamd_url_init(string.format('%s/%s', test_dir, "test_tld.dat"))

  before(function()
    local res
    res,task = rspamd_task.load_from_string(msg, cfg)
    task:set_from_ip("198.172.22.91")
    task:set_user("cool user name")
    task:set_helo("hello mail")
    task:set_request_header("hdr1", "value1")
    task:process_message()
    task:get_mempool():set_variable("int_var", 1)
    task:get_mempool():set_variable("str_var", "str 1")
    if not res then
      assert_true(false, "failed to load message")
    end
  end)

  local function check_selector(selector_string)
    local sels = lua_selectors.parse_selector(cfg, selector_string)
    local elts = lua_selectors.process_selectors(task, sels)
    return elts
  end

  -- Selectors which should not be parse
  local cases = {
      ["random string"] = {
                selector = "'xxx'"},

      ["random nonsense"] = {
                selector = "13 / sd 42 x"},

      ["unknown selector"] = {
                selector = "unknownselector"},

      ["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
    test("case " .. case_name, function()
      local sels = lua_selectors.parse_selector(cfg, case.selector)
      print(logger.slog("%1", sels))
      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)


--[=========[ *******************  message  ******************* ]=========]
msg = [[
Received: from ca-18-193-131.service.infuturo.it ([151.18.193.131] helo=User)
    by server.chat-met-vreemden.nl with esmtpa (Exim 4.76)
    (envelope-from <upwest201diana@outlook.com>)
    id 1ZC1sl-0006b4-TU; Mon, 06 Jul 2015 10:36:08 +0200
From: <whoknows@nowhere.com>
To: <nobody@example.com>, <no-one@example.com>
Date: Wed, 19 Sep 2018 14:36:51 +0100 (BST)
subject: Second, lower-cased header subject
Subject: Test subject
Content-Type: multipart/alternative;
    boundary="_000_6be055295eab48a5af7ad4022f33e2d0_"

--_000_6be055295eab48a5af7ad4022f33e2d0_
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

Hello world


--_000_6be055295eab48a5af7ad4022f33e2d0_
Content-Type: text/html; charset="utf-8"

<html><body>
<a href="http://example.net">http://example.net</a>
<a href="mailto:test@example.net">mail me</a>
</html>


--_000_6be055295eab48a5af7ad4022f33e2d0_
Content-Type: application/zip; name=f.zip
Content-Disposition: attachment; size=166; filename=f.zip
Content-Transfer-Encoding: base64

UEsDBAoAAAAAAINe6kgAAAAAAAAAAAAAAAAIABwAZmFrZS5leGVVVAkAA8YaglfGGoJXdXgLAAEE
6AMAAAToAwAAUEsBAh4DCgAAAAAAg17qSAAAAAAAAAAAAAAAAAgAGAAAAAAAAAAAALSBAAAAAGZh
a2UuZXhlVVQFAAPGGoJXdXgLAAEE6AMAAAToAwAAUEsFBgAAAAABAAEATgAAAEIAAAAAAA==


--_000_6be055295eab48a5af7ad4022f33e2d0_
Content-Type: application/zip; name=f.zip
Content-Disposition: attachment; size=166; filename=f2.zip
Content-Transfer-Encoding: base64

UEsDBAoAAAAAAINe6kgAAAAAAAAAAAAAAAAIABwAZmFrZS5leGVVVAkAA8YaglfGGoJXdXgLAAEE
6AMAAAToAwAAUEsBAh4DCgAAAAAAg17qSAAAAAAAAAAAAAAAAAgAGAAAAAAAAAAAALSBAAAAAGZh
a2UuZXhlVVQFAAPGGoJXdXgLAAEE6AMAAAToAwAAUEsFBgAAAAABAAEATgAAAEIAAAAAAA==
]]
