From 69fa86586b2bb0f349fb0e318246d9e24a282876 Mon Sep 17 00:00:00 2001 From: Yaro Date: Mon, 25 Nov 2024 20:20:01 +0000 Subject: [PATCH] fix(outputHandler_json): for pending tests and json encoding --- busted/outputHandlers/json.lua | 26 +++++++++++++++++++------ spec/cl_output_json.lua | 5 +++++ spec/cl_output_json_helper.lua | 9 +++++++++ spec/cl_output_json_spec.lua | 35 ++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 spec/cl_output_json.lua create mode 100644 spec/cl_output_json_helper.lua create mode 100644 spec/cl_output_json_spec.lua diff --git a/busted/outputHandlers/json.lua b/busted/outputHandlers/json.lua index 97a07f37..2365b078 100644 --- a/busted/outputHandlers/json.lua +++ b/busted/outputHandlers/json.lua @@ -1,10 +1,10 @@ -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 = { @@ -12,14 +12,28 @@ return function(options) 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") @@ -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 diff --git a/spec/cl_output_json.lua b/spec/cl_output_json.lua new file mode 100644 index 00000000..3d9cf87a --- /dev/null +++ b/spec/cl_output_json.lua @@ -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) diff --git a/spec/cl_output_json_helper.lua b/spec/cl_output_json_helper.lua new file mode 100644 index 00000000..b55188e7 --- /dev/null +++ b/spec/cl_output_json_helper.lua @@ -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 diff --git a/spec/cl_output_json_spec.lua b/spec/cl_output_json_spec.lua new file mode 100644 index 00000000..6ffe858b --- /dev/null +++ b/spec/cl_output_json_spec.lua @@ -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)