File

spec/util_argparse_spec.lua @ 13816:4122978f2575 13.0

spec/tls: Add TLS/certificate integration tests These tests help to verify that various configurations translate into the expected running TLS setups. Specifically right now we are checking the correct certificate is served.
author Matthew Wild <mwild1@gmail.com>
date Thu, 03 Apr 2025 15:11:58 +0100
parent 13762:81856814d74f
line wrap: on
line source

describe("parse", function()
	local parse
	setup(function() parse = require"util.argparse".parse; end);

	it("works", function()
		-- basic smoke test
		local opts = parse({ "--help" });
		assert.same({ help = true }, opts);
	end);

	it("returns if no args", function() assert.same({}, parse({})); end);

	it("supports boolean flags", function()
		local opts, err = parse({ "--foo"; "--no-bar" });
		assert.falsy(err);
		assert.same({ foo = true; bar = false }, opts);
	end);

	it("consumes input until the first argument", function()
		local arg = { "--foo"; "bar"; "--baz" };
		local opts, err = parse(arg);
		assert.falsy(err);
		assert.same({ foo = true, "bar", "--baz" }, opts);
		assert.same({ "bar"; "--baz" }, arg);
	end);

	it("allows continuation beyond first positional argument", function()
		local arg = { "--foo"; "bar"; "--baz" };
		local opts, err = parse(arg, { stop_on_positional = false });
		assert.falsy(err);
		assert.same({ foo = true, baz = true, "bar" }, opts);
		-- All input should have been consumed:
		assert.same({ }, arg);
	end);

	it("expands short options", function()
		do
			local opts, err = parse({ "--foo"; "-b" }, { short_params = { b = "bar" } });
			assert.falsy(err);
			assert.same({ foo = true; bar = true }, opts);
		end

		do
			-- Same test with strict mode enabled and all parameters declared
			local opts, err = parse({ "--foo"; "-b" }, { kv_params = { foo = true, bar = true }; short_params = { b = "bar" }, strict = true });
			assert.falsy(err);
			assert.same({ foo = true; bar = true }, opts);
		end
	end);

	it("supports value arguments", function()
		local opts, err = parse({ "--foo"; "bar"; "--baz=moo" }, { value_params = { foo = true; bar = true } });
		assert.falsy(err);
		assert.same({ foo = "bar"; baz = "moo" }, opts);
	end);

	it("supports value arguments in strict mode", function()
		local opts, err = parse({ "--foo"; "bar"; "--baz=moo" }, { strict = true, value_params = { foo = true; baz = true } });
		assert.falsy(err);
		assert.same({ foo = "bar"; baz = "moo" }, opts);
	end);

	it("demands values for value params", function()
		local opts, err, where = parse({ "--foo" }, { value_params = { foo = true } });
		assert.falsy(opts);
		assert.equal("missing-value", err);
		assert.equal("--foo", where);
	end);

	it("reports where the problem is", function()
		local opts, err, where = parse({ "-h" });
		assert.falsy(opts);
		assert.equal("param-not-found", err);
		assert.equal("-h", where, "returned where");
	end);

	it("supports array arguments", function ()
		do
			local opts, err = parse({ "--item"; "foo"; "--item"; "bar" }, { array_params = { item = true } });
			assert.falsy(err);
			assert.same({"foo","bar"}, opts.item);
		end

		do
			-- Same test with strict mode enabled
			local opts, err = parse({ "--item"; "foo"; "--item"; "bar" }, { array_params = { item = true }, strict = true });
			assert.falsy(err);
			assert.same({"foo","bar"}, opts.item);
		end
	end)

	it("rejects unknown parameters in strict mode", function ()
		local opts, err, err2 = parse({ "--item"; "foo"; "--item"; "bar", "--foobar" }, { array_params = { item = true }, strict = true });
		assert.falsy(opts);
		assert.same("param-not-found", err);
		assert.same("--foobar", err2);
	end);

	it("accepts known kv parameters in strict mode", function ()
		local opts, err = parse({ "--item=foo" }, { kv_params = { item = true }, strict = true });
		assert.falsy(err);
		assert.same("foo", opts.item);
	end);
end);