File

spec/core_moduleapi_spec.lua @ 11741:dcf38ac6a38c

net.server: Add a predrain callaback just before writes Allows sneaking in things in the write buffer just before it's sent to the network stack. For example ack requests, compression flushes or other things that make sense to send after stanzas or other things. This ensures any additional trailing data sent is included in the same write, and possibly the same TCP packet. Other methods used such as timers or nextTick might not have the same effect as it depends on scheduling.
author Kim Alvefur <zash@zash.se>
date Mon, 16 Aug 2021 12:34:52 +0200
parent 8562:a6188f5d5bb5
child 13400:786c7707f306
line wrap: on
line source


package.loaded["core.configmanager"] = {};
package.loaded["core.statsmanager"] = {};
package.loaded["net.server"] = {};

local set = require "util.set";

_G.prosody = { hosts = {}, core_post_stanza = true };

local api = require "core.moduleapi";

local module = setmetatable({}, {__index = api});
local opt = nil;
function module:log() end
function module:get_option(name)
	if name == "opt" then
		return opt;
	else
		return nil;
	end
end

function test_option_value(value, returns)
	opt = value;
	assert(module:get_option_number("opt") == returns.number, "number doesn't match");
	assert(module:get_option_string("opt") == returns.string, "string doesn't match");
	assert(module:get_option_boolean("opt") == returns.boolean, "boolean doesn't match");

	if type(returns.array) == "table" then
		local target_array, returned_array = returns.array, module:get_option_array("opt");
		assert(#target_array == #returned_array, "array length doesn't match");
		for i=1,#target_array do
			assert(target_array[i] == returned_array[i], "array item doesn't match");
		end
	else
		assert(module:get_option_array("opt") == returns.array, "array is returned (not nil)");
	end

	if type(returns.set) == "table" then
		local target_items, returned_items = set.new(returns.set), module:get_option_set("opt");
		assert(target_items == returned_items, "set doesn't match");
	else
		assert(module:get_option_set("opt") == returns.set, "set is returned (not nil)");
	end
end

describe("core.moduleapi", function()
	describe("#get_option_*()", function()
		it("should handle missing options", function()
			test_option_value(nil, {});
		end);

		it("should return correctly handle boolean options", function()
			test_option_value(true, { boolean = true, string = "true", array = {true}, set = {true} });
			test_option_value(false, { boolean = false, string = "false", array = {false}, set = {false} });
			test_option_value("true", { boolean = true, string = "true", array = {"true"}, set = {"true"} });
			test_option_value("false", { boolean = false, string = "false", array = {"false"}, set = {"false"} });
			test_option_value(1, { boolean = true, string = "1", array = {1}, set = {1}, number = 1 });
			test_option_value(0, { boolean = false, string = "0", array = {0}, set = {0}, number = 0 });
		end);

		it("should return handle strings", function()
			test_option_value("hello world", { string = "hello world", array = {"hello world"}, set = {"hello world"} });
		end);

		it("should return handle numbers", function()
			test_option_value(1234, { string = "1234", number = 1234, array = {1234}, set = {1234} });
		end);

		it("should return handle arrays", function()
			test_option_value({1, 2, 3}, { boolean = true, string = "1", number = 1, array = {1, 2, 3}, set = {1, 2, 3} });
			test_option_value({1, 2, 3, 3, 4}, {boolean = true, string = "1", number = 1, array = {1, 2, 3, 3, 4}, set = {1, 2, 3, 4} });
			test_option_value({0, 1, 2, 3}, { boolean = false, string = "0", number = 0, array = {0, 1, 2, 3}, set = {0, 1, 2, 3} });
		end);
	end)
end)