mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2026-09-21 17:04:00 +00:00
- The generic parts move to test/ in the repository root so other plugins can reuse them: the factorio and clusterio stubs, the test framework, the fengari runner, and clusterio's testMatrix and round trip helpers. A plugin composes them from its own env.lua, which adds its stubs and fixtures. - Tests are declared with Test.test(name, fn) and every test function receives a fresh environment, so nothing carries over between them. A test which errors is reported as a failure rather than aborting the file. - Every stub raises on properties it does not implement, which mirrors the game api. game.player is the one property allowed to read as nil. - Test.deep_eq compares tables recursively with keys checked from both sides. - The message records round trip through the same testMatrix and testRoundTripJsonSerialisable helpers the clusterio tests use, covering every optional field combination of the records, events and requests. - controller.test.js and instance.test.js cover the node side of the plugin against faked controller and instance internals: property creation and sweeping, record building, broadcasts, subscription replay, assignment validation, auto assignment and its blocking role, seeding, the initialise payload, sync mode gating, and the rejection rollback. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
85 lines
3.0 KiB
Lua
85 lines
3.0 KiB
Lua
--[[-- Test environment for module/control.lua
|
|
Composes the shared stubs and framework from the repository test folder with
|
|
the fixtures for this plugin. Each call to Env.new() is an independent
|
|
environment with a fresh copy of the roles module.
|
|
|
|
Run as a chunk by test/lua/runner.js, receiving the shared folder and
|
|
returning this table, which is in turn passed to each test chunk.
|
|
]]
|
|
|
|
local shared_root = ... --- @type string
|
|
local source = assert(debug.getinfo(1, "S")).source
|
|
local plugin_root = assert(source:match("^@(.*)/test/lua/env%.lua$"))
|
|
|
|
local Stubs = assert(loadfile(shared_root .. "/stubs.lua"))()
|
|
local Framework = assert(loadfile(shared_root .. "/framework.lua"))()
|
|
|
|
local Env = {
|
|
--- Test registry for the file being run, see framework.lua
|
|
Test = Framework.new(),
|
|
}
|
|
|
|
--- Standard fixture: permission names sent once and referenced by zero based index
|
|
Env.permission_names = {
|
|
"core.admin", -- 0
|
|
"exp_scenario.command.kill", -- 1
|
|
"exp_scenario.command.jail", -- 2
|
|
"exp_scenario.player.admin", -- 3
|
|
"exp_scenario.gui.readme", -- 4
|
|
"exp_scenario.command.assign_role", -- 5
|
|
}
|
|
|
|
local function meta(order, extra)
|
|
local m = { id = 0, order = order }
|
|
for k, v in pairs(extra or {}) do m[k] = v end
|
|
return m
|
|
end
|
|
|
|
--- Standard fixture: the roles as the controller would send them on initialise
|
|
function Env.role_records()
|
|
return {
|
|
{ id = 0, name = "Cluster Admin", permissions = { 0 }, meta = meta(1, { short_hand = "SYS" }) },
|
|
{ id = 5, name = "Moderator", permissions = { 1, 2, 3, 5 }, meta = meta(2, { color = { r = 0, g = 170, b = 0 } }) },
|
|
{ id = 6, name = "Regular", permissions = { 1 }, meta = meta(3) },
|
|
{ id = 7, name = "Jail", permissions = {}, meta = meta(4, { priority = 1, block_auto_assign = true }) },
|
|
{ id = 1, name = "Player", permissions = { 4 }, meta = meta(5), is_default = true },
|
|
{ id = 9, name = "Gone", permissions = {}, meta = meta(6), is_deleted = true },
|
|
}
|
|
end
|
|
|
|
function Env.assignment(name, role_ids)
|
|
return { name = name, role_ids = role_ids }
|
|
end
|
|
|
|
--- Create an independent environment with a fresh copy of the roles module
|
|
function Env.new()
|
|
local env = Stubs.new()
|
|
|
|
env.Roles = assert(loadfile(plugin_root .. "/module/control.lua"))()
|
|
env.Roles.on_server_startup()
|
|
|
|
--- Get a role by name, failing the test when it does not exist
|
|
function env.R(name)
|
|
return (assert(env.Roles.get_role_by_name(name), "No role named " .. name))
|
|
end
|
|
|
|
--- Load the standard fixture and the given assignments
|
|
function env.initialise(assignments)
|
|
env.Roles.initialise{
|
|
permission_names = Env.permission_names,
|
|
roles = Env.role_records(),
|
|
assignments = assignments or {},
|
|
}
|
|
end
|
|
|
|
return env
|
|
end
|
|
|
|
--- Run the declared tests, each against a fresh environment
|
|
function Env.finish()
|
|
Env.Test.run(Env.new)
|
|
return Env.Test.results_json()
|
|
end
|
|
|
|
return Env
|