Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(outputHandler_json): for pending tests and json encoding #748

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions busted/outputHandlers/json.lua
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,27 @@ return function(options)
errors = handler.errors,
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 err_msg
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 - 200), tostring(state.exception))

err_msg = ('Error: %s in (%s)\n'):format(default_reason, 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)
io_write(err_msg)
error(err_msg)
Comment on lines +36 to +37
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why write and error the same message? Is this what the other instances in the code base of manually writing to stderr and then exiting are working around?

Suggested change
io_write(err_msg)
error(err_msg)
error(err_msg)

Copy link
Author

@YaroSpace YaroSpace Nov 30, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In my undertading, writing to stdout here is for the cases when json output is redirected to a file, so that the error goes to the file too. I assumed someone maybe relying on that, so left this line just in case, but with a better error message.

end

io_write("\n")
Expand Down
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')
end)
19 changes: 19 additions & 0 deletions spec/cl_output_json_helper.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
return function(busted, helper, options)
local non_string_spec = function(element)
local parent = busted.context.parent(element)
local status = 'custom'
if busted.safe_publish('it', { 'test', 'start' }, element, parent) then
busted.safe_publish('it', { 'test', 'end' }, element, parent, status)
else
status = 'error'
end
end

busted.register('non_string_spec', non_string_spec, {
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.equal(exit_code, 0)
assert.is.equal(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_not.equal(exit_code, 0)
assert.is_truthy(err:find("type 'function' is not supported by JSON"))
end)
end)