File

spec/util_json_spec.lua @ 12592:d580e6a57cbb 0.12

mod_storage_sql: Fix bypass of load procedure under prosodyctl There's no 'prosody.prosodyctl' property other than this one, introduced in 6216743c188c in 2015. Guessing that the intent was to skip this when running as a prosodyctl command. The module.command code does its own version of this initialization, so this seems likely. Thanks raja for noticing
author Kim Alvefur <zash@zash.se>
date Tue, 26 Jul 2022 00:39:16 +0200
parent 10591:d78c5c9b0cf6
line wrap: on
line source


local json = require "util.json";
local array = require "util.array";

describe("util.json", function()
	describe("#encode()", function()
		it("should work", function()
			local function test(f, j, e)
				if e then
					assert.are.equal(f(j), e);
				end
				assert.are.equal(f(j), f(json.decode(f(j))));
			end
			test(json.encode, json.null, "null")
			test(json.encode, {}, "{}")
			test(json.encode, {a=1});
			test(json.encode, {a={1,2,3}});
			test(json.encode, {1}, "[1]");
		end);
	end);

	describe("#decode()", function()
		it("should work", function()
			local empty_array = json.decode("[]");
			assert.are.equal(type(empty_array), "table");
			assert.are.equal(#empty_array, 0);
			assert.are.equal(next(empty_array), nil);
		end);
	end);

	describe("testcases", function()

		local valid_data = {};
		local invalid_data = {};

		local skip = "fail1.json fail9.json fail18.json fail15.json fail13.json fail25.json fail26.json fail27.json fail28.json fail17.json pass1.json";

		setup(function()
			local lfs = require "lfs";
			local path = "spec/json";
			for name in lfs.dir(path) do
				if name:match("%.json$") then
					local f = assert(io.open(path.."/"..name));
					local content = assert(f:read("*a"));
					assert(f:close());
					if skip:find(name) then --luacheck: ignore 542
						-- Skip
					elseif name:match("^pass") then
						valid_data[name] = content;
					elseif name:match("^fail") then
						invalid_data[name] = content;
					end
				end
			end
		end)

		it("should pass valid testcases", function()
			for name, content in pairs(valid_data) do
				local parsed, err = json.decode(content);
				assert(parsed, name..": "..tostring(err));
			end
		end);

		it("should fail invalid testcases", function()
			for name, content in pairs(invalid_data) do
				local parsed, err = json.decode(content);
				assert(not parsed, name..": "..tostring(err));
			end
		end);
	end)

	describe("util.array integration", function ()
		it("works", function ()
			assert.equal("[]", json.encode(array()));
			assert.equal("[1,2,3]", json.encode(array({1,2,3})));
			assert.equal(getmetatable(array()), getmetatable(json.decode("[]")));
		end);
	end);

end);