mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-24 13:54:57 +00:00
update: packages,lua,lobby (4 files)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user