Skip to content

Commit

Permalink
fix(outputHandler_json): for pending tests and json encoding
Browse files Browse the repository at this point in the history
  • Loading branch information
YaroSpace committed Nov 28, 2024
1 parent 94d0081 commit eab3271
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 6 deletions.
26 changes: 20 additions & 6 deletions busted/outputHandlers/json.lua
Original file line number Diff line number Diff line change
@@ -1,25 +1,39 @@
local json = require 'dkjson'
local json = require("dkjson")
local io_write = io.write
local io_flush = io.flush

return function(options)
local busted = require 'busted'
local handler = require 'busted.outputHandlers.base'()
local busted = require("busted")
local handler = require("busted.outputHandlers.base")()

handler.suiteEnd = function()
local error_info = {
pendings = handler.pendings,
successes = handler.successes,
failures = handler.failures,
errors = handler.errors,
duration = handler.getDuration()
duration = handler.getDuration(),
}
local ok, result = pcall(json.encode, error_info)

for _, test in ipairs(handler.pendings) do
test.element.attributes.default_fn = nil -- functions cannot be encoded into json
end

local ok, result = pcall(json.encode, error_info, {
exception = function(reason, value, state, default_reason)
local state_short = table.concat(state.buffer, "")
state_short = ("... %s %s"):format(state_short:sub(#state_short - 100), tostring(state.exception))

local err_msg = (default_reason .. " in (%s)\n"):format(state_short)
io.stderr:write(err_msg)
end,
})

if ok then
io_write(result)
else
io_write("Failed to encode test results to json: " .. result)
os.exit(1)
end

io_write("\n")
Expand All @@ -28,7 +42,7 @@ return function(options)
return nil, true
end

busted.subscribe({ 'suite', 'end' }, handler.suiteEnd)
busted.subscribe({ "suite", "end" }, handler.suiteEnd)

return handler
end
5 changes: 5 additions & 0 deletions spec/cl_output_json.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
-- supporting testfile; belongs to 'cl_output_json_spec.lua'

describe("spec with non string attributes", function()
non_string_spec('throws an error when encoded into json', function() end)
end)
9 changes: 9 additions & 0 deletions spec/cl_output_json_helper.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
return function(busted, helper, options)
busted.register('non_string_spec', busted.pending, {
default_fn = function() end,
non_string_attribute_1 = function() end,
non_string_attribute_2 = function() end,
non_string_attribute_3 = function() end
})
return true
end
35 changes: 35 additions & 0 deletions spec/cl_output_json_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
local utils = require("pl.utils")
local path = require("pl.path")
local busted_cmd = path.is_windows and "lua bin/busted" or "eval $(luarocks path) && bin/busted"

-- if exitcode >256, then take MSB as exit code
local modexit = function(exitcode)
if exitcode > 255 then
return math.floor(exitcode / 256), exitcode - math.floor(exitcode / 256) * 256
else
return exitcode
end
end

local execute = function(cmd)
local success, exitcode, out, err = utils.executeex(cmd)
return not not success, modexit(exitcode), out, err
end

describe("Tests the busted json output", function()
it("encodes pending tests", function()
local success, exit_code, out, err = execute(busted_cmd .. ' ' .. "--pattern=cl_pending.lua$ --output=busted/outputHandlers/json.lua")

assert.is_true(success)
assert.is_true(exit_code == 0)
assert.is_true(err == '')
end)

it("notifies with error if results cannot be encoded", function()
local success, exit_code, out, err = execute(busted_cmd .. " --helper=spec/cl_output_json_helper.lua spec/cl_output_json.lua --output=busted/outputHandlers/json.lua")

assert.is_false(success)
assert.is_true(exit_code ~= 0)
assert.is_truthy(err:find("type 'function' is not supported by JSON"))
end)
end)

0 comments on commit eab3271

Please sign in to comment.