update: packages,lua,lobby (4 files)

This commit is contained in:
Richard Ward
2025-12-30 13:13:21 +00:00
parent b6e059f367
commit d41f1d4735
4 changed files with 90 additions and 277 deletions

View File

@@ -1,20 +1,20 @@
-- Matchmaking tests for arcade_lobby package
-- Tests assign_bucket function with various party sizes
local matchmaking = require("matchmaking")
describe("Matchmaking", function()
describe("assign_bucket", function()
it.each({
{ party = { size = 1 }, expected = "solo", desc = "solo player" },
{ party = { size = 2 }, expected = "duo", desc = "duo party" },
{ party = { size = 3 }, expected = "solo", desc = "trio falls to solo" },
{ party = { size = 4 }, expected = "squad", desc = "full squad" },
{ party = { size = 5 }, expected = "squad", desc = "oversized party" },
{ party = {}, expected = "solo", desc = "missing size defaults to solo" },
})("should return $expected for $desc", function(testCase)
local result = matchmaking.assign_bucket(testCase.party)
expect(result).toBe(testCase.expected)
end)
end)
end)
-- Matchmaking tests for arcade_lobby package
-- Tests assign_bucket function with various party sizes
local matchmaking = require("matchmaking")
describe("Matchmaking", function()
describe("assign_bucket", function()
it.each({
{ party = { size = 1 }, expected = "solo", desc = "solo player" },
{ party = { size = 2 }, expected = "duo", desc = "duo party" },
{ party = { size = 3 }, expected = "solo", desc = "trio falls to solo" },
{ party = { size = 4 }, expected = "squad", desc = "full squad" },
{ party = { size = 5 }, expected = "squad", desc = "oversized party" },
{ party = {}, expected = "solo", desc = "missing size defaults to solo" },
})("should return $expected for $desc", function(testCase)
local result = matchmaking.assign_bucket(testCase.party)
expect(result).toBe(testCase.expected)
end)
end)
end)

View File

@@ -1,19 +1,19 @@
-- Permissions tests for arcade_lobby package
-- Tests can_create_tournament function with various roles
local permissions = require("permissions")
describe("Permissions", function()
describe("can_create_tournament", function()
it.each({
{ user = { role = "public" }, expected = false, desc = "public user" },
{ user = { role = "admin" }, expected = true, desc = "admin" },
{ user = { role = "god" }, expected = true, desc = "god" },
{ user = { role = "supergod" }, expected = true, desc = "supergod" },
{ user = {}, expected = false, desc = "no role defaults to public" },
})("should return $expected for $desc", function(testCase)
local result = permissions.can_create_tournament(testCase.user)
expect(result).toBe(testCase.expected)
end)
end)
end)
-- Permissions tests for arcade_lobby package
-- Tests can_create_tournament function with various roles
local permissions = require("permissions")
describe("Permissions", function()
describe("can_create_tournament", function()
it.each({
{ user = { role = "public" }, expected = false, desc = "public user" },
{ user = { role = "admin" }, expected = true, desc = "admin" },
{ user = { role = "god" }, expected = true, desc = "god" },
{ user = { role = "supergod" }, expected = true, desc = "supergod" },
{ user = {}, expected = false, desc = "no role defaults to public" },
})("should return $expected for $desc", function(testCase)
local result = permissions.can_create_tournament(testCase.user)
expect(result).toBe(testCase.expected)
end)
end)
end)

View File

@@ -1,39 +1,39 @@
-- Queue metrics tests for arcade_lobby package
-- Tests summarize function with various queue states
local queue_metrics = require("queue_metrics")
describe("Queue Metrics", function()
describe("summarize", function()
it.each({
{
queues = {},
expected = { totalPlayers = 0, longestWaitSeconds = 0 },
desc = "empty queues"
},
{
queues = { { players = 10, waitSeconds = 30 } },
expected = { totalPlayers = 10, longestWaitSeconds = 30 },
desc = "single queue"
},
{
queues = {
{ players = 5, waitSeconds = 20 },
{ players = 15, waitSeconds = 60 },
{ players = 8, waitSeconds = 45 }
},
expected = { totalPlayers = 28, longestWaitSeconds = 60 },
desc = "multiple queues"
},
{
queues = { {}, { players = 10 }, { waitSeconds = 100 } },
expected = { totalPlayers = 10, longestWaitSeconds = 100 },
desc = "queues with missing fields"
},
})("should calculate $desc correctly", function(testCase)
local result = queue_metrics.summarize(testCase.queues)
expect(result.totalPlayers).toBe(testCase.expected.totalPlayers)
expect(result.longestWaitSeconds).toBe(testCase.expected.longestWaitSeconds)
end)
end)
end)
-- Queue metrics tests for arcade_lobby package
-- Tests summarize function with various queue states
local queue_metrics = require("queue_metrics")
describe("Queue Metrics", function()
describe("summarize", function()
it.each({
{
queues = {},
expected = { totalPlayers = 0, longestWaitSeconds = 0 },
desc = "empty queues"
},
{
queues = { { players = 10, waitSeconds = 30 } },
expected = { totalPlayers = 10, longestWaitSeconds = 30 },
desc = "single queue"
},
{
queues = {
{ players = 5, waitSeconds = 20 },
{ players = 15, waitSeconds = 60 },
{ players = 8, waitSeconds = 45 }
},
expected = { totalPlayers = 28, longestWaitSeconds = 60 },
desc = "multiple queues"
},
{
queues = { {}, { players = 10 }, { waitSeconds = 100 } },
expected = { totalPlayers = 10, longestWaitSeconds = 100 },
desc = "queues with missing fields"
},
})("should calculate $desc correctly", function(testCase)
local result = queue_metrics.summarize(testCase.queues)
expect(result.totalPlayers).toBe(testCase.expected.totalPlayers)
expect(result.longestWaitSeconds).toBe(testCase.expected.longestWaitSeconds)
end)
end)
end)

View File

@@ -1,200 +1,13 @@
-- Audit log filtering logic
local M = {}
-- Audit log filtering module
-- DEPRECATED: This file redirects to filters/init.lua
-- Individual functions are now in separate files under filters/
--
-- Migration guide:
-- Old: local filters = require("filters")
-- New: local filters = require("filters.init")
-- Or import individual functions:
-- local filterByOperation = require("filters.filter_by_operation")
--
-- Types are defined in filters/types.lua
---@class AuditLog
---@field id string
---@field operation string
---@field resource string
---@field resourceId string
---@field username string
---@field timestamp number
---@field ipAddress string
---@field success boolean
---@field errorMessage string?
---@class FilterOptions
---@field operations string[]
---@field resources string[]
---@field usernames string[]
---@class ApplyFiltersInput
---@field operation string?
---@field resource string?
---@field success boolean?
---@field username string?
---@field startTime number?
---@field endTime number?
--- Filter logs by operation type
---@param logs AuditLog[] | nil
---@param operation string?
---@return AuditLog[]
function M.filterByOperation(logs, operation)
if not operation or operation == "" then
return logs
end
local result = {}
for _, log in ipairs(logs or {}) do
if log.operation == operation then
result[#result + 1] = log
end
end
return result
end
--- Filter logs by resource type
---@param logs AuditLog[] | nil
---@param resource string?
---@return AuditLog[]
function M.filterByResource(logs, resource)
if not resource or resource == "" then
return logs
end
local result = {}
for _, log in ipairs(logs or {}) do
if log.resource == resource then
result[#result + 1] = log
end
end
return result
end
--- Filter logs by success status
---@param logs AuditLog[] | nil
---@param success boolean?
---@return AuditLog[]
function M.filterBySuccess(logs, success)
if success == nil then
return logs
end
local result = {}
for _, log in ipairs(logs or {}) do
if log.success == success then
result[#result + 1] = log
end
end
return result
end
--- Filter logs by username
---@param logs AuditLog[] | nil
---@param username string?
---@return AuditLog[]
function M.filterByUsername(logs, username)
if not username or username == "" then
return logs
end
local result = {}
local lowerUsername = string.lower(username)
for _, log in ipairs(logs or {}) do
if log.username and string.match(string.lower(log.username), lowerUsername) then
result[#result + 1] = log
end
end
return result
end
--- Filter logs by date range (timestamps in milliseconds)
---@param logs AuditLog[] | nil
---@param startTime number?
---@param endTime number?
---@return AuditLog[]
function M.filterByDateRange(logs, startTime, endTime)
local result = {}
for _, log in ipairs(logs or {}) do
local ts = log.timestamp
local include = true
if startTime and ts < startTime then
include = false
end
if endTime and ts > endTime then
include = false
end
if include then
result[#result + 1] = log
end
end
return result
end
--- Apply multiple filters to logs
---@param logs AuditLog[] | nil
---@param filters ApplyFiltersInput
---@return AuditLog[]
function M.applyFilters(logs, filters)
filters = filters or {}
local result = logs
if filters.operation then
result = M.filterByOperation(result, filters.operation)
end
if filters.resource then
result = M.filterByResource(result, filters.resource)
end
if filters.success ~= nil then
result = M.filterBySuccess(result, filters.success)
end
if filters.username then
result = M.filterByUsername(result, filters.username)
end
if filters.startTime or filters.endTime then
result = M.filterByDateRange(result, filters.startTime, filters.endTime)
end
return result
end
--- Get unique values for filter dropdowns
---@param logs AuditLog[] | nil
---@return FilterOptions
function M.getFilterOptions(logs)
local operations = {}
local resources = {}
local usernames = {}
for _, log in ipairs(logs or {}) do
if log.operation then
operations[log.operation] = true
end
if log.resource then
resources[log.resource] = true
end
if log.username then
usernames[log.username] = true
end
end
local opList = {}
for op in pairs(operations) do
opList[#opList + 1] = op
end
table.sort(opList)
local resList = {}
for res in pairs(resources) do
resList[#resList + 1] = res
end
table.sort(resList)
local userList = {}
for user in pairs(usernames) do
userList[#userList + 1] = user
end
table.sort(userList)
return {
operations = opList,
resources = resList,
usernames = userList
}
end
return M
return require("filters.init")