_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)