80 lines
2.7 KiB
Lua
80 lines
2.7 KiB
Lua
|
|
_G.spy = spy
|
|
function assertf(stmt, fmt, ...)
|
|
if not stmt then
|
|
error(string.format(fmt,...))
|
|
end
|
|
end
|
|
|
|
local mock_env = require("spec.env_mock")
|
|
|
|
describe("smr search parser #parsers #working",function()
|
|
setup(mock_env.setup)
|
|
teardown(mock_env.teardown)
|
|
it("should load without error",function()
|
|
local parser = require("parser_search")
|
|
end)
|
|
it("should accept a string and return a string",function()
|
|
local parser = require("parser_search")
|
|
local input = "Hello, world!"
|
|
local output = parser(input)
|
|
assert(type(output) == "string","Expected string, got: %s",type(output))
|
|
end)
|
|
it("should parse a string into it's components",function()
|
|
local parser = require("parser_search")
|
|
local input = "+search +test +author=admin"
|
|
local search_tag, test_tag, author_parsed = false, false, false
|
|
local sql, ast = parser(input)
|
|
for _,v in pairs(ast.tags) do
|
|
if v[3] == "Search" then
|
|
search_tag = true
|
|
elseif v[3] == "Test" then
|
|
test_tag = true
|
|
end
|
|
end
|
|
for _,v in pairs(ast.author) do
|
|
if v[3] == "%admin%" then
|
|
author_parsed = true
|
|
end
|
|
end
|
|
|
|
assert(search_tag, "Search tag must be found")
|
|
assert(test_tag, "Test tag must be found")
|
|
assert(author_parsed, "Author tag must be found")
|
|
end)
|
|
it("should parse tags with a hyphen in the middle",function()
|
|
local parser = require("parser_search")
|
|
local input = "+post-modern"
|
|
local sql, ast = parser(input)
|
|
assert(#ast.tags == 1, "+post-modern should be one tag")
|
|
end)
|
|
it("should parse an empty string without errors",function()
|
|
local parser = require("parser_search")
|
|
local input = ""
|
|
local sql, ast = parser(input)
|
|
assert(sql,"Did not receive sql")
|
|
assert(ast,"Did not receive ast")
|
|
end)
|
|
it("should parse a hits request",function()
|
|
local parser = require("parser_search")
|
|
local input = "+hits>=0"
|
|
local sql, ast = parser(input)
|
|
assert(ast.hits, "should have a .hits table")
|
|
local hit = ast.hits[1]
|
|
assert(hit[1] == "+", "Failed to have an intersect constraint for hits, got " .. hit[1])
|
|
assert(hit[2] == ">=", "Failed to have a greater-than-or-equal constraint for hits, got " .. hit[2])
|
|
assert(hit[3] == 0, "Failed to find >=0 for hits, got " .. hit[3])
|
|
end)
|
|
it("should parse a title request", function()
|
|
local parser = require("parser_search")
|
|
local input = "+title=the balled of pala-al-din"
|
|
local sql, ast = parser(input)
|
|
assert(ast.title, "should have a .title table")
|
|
local title = ast.title[1]
|
|
assert(title[1] == "+", "Failed to have an intersect constraint for title, got " .. title[1])
|
|
assert(title[2] == "=", "Failed to have a like constraint for title, got " .. title[2])
|
|
assert(title[3] == "%the balled of pala-al-din%", "Failed to find title name, got " .. title[3])
|
|
end)
|
|
end)
|
|
|