feat: Add lua_test as a devDependency and implement validation tests for audit_log and code_editor packages

This commit is contained in:
2025-12-30 02:27:20 +00:00
parent 85fecd58ce
commit 25c98f2704
11 changed files with 670 additions and 0 deletions

View File

@@ -8,6 +8,7 @@
"category": "admin",
"dependencies": [],
"devDependencies": [
"lua_test",
"package_validator"
],
"exports": {

View File

@@ -0,0 +1,64 @@
-- Component validation tests for audit_log package
local components = load_cases("components.json")
describe("Audit Log Components", function()
it("should be a valid array", function()
expect(components).toBeType("table")
expect(#components).toBeGreaterThan(0)
end)
it("should have valid component structure", function()
for _, component in ipairs(components) do
expect(component.id).toBeTruthy()
expect(component.type).toBeTruthy()
expect(component.id).toBeType("string")
expect(component.type).toBeType("string")
end
end)
it("should have audit_stats_cards component", function()
local found = false
for _, component in ipairs(components) do
if component.id == "audit_stats_cards" then
found = true
expect(component.name).toBe("Audit Stats Cards")
expect(component.props).toBeTruthy()
expect(component.props.stats).toBeTruthy()
expect(component.layout).toBeTruthy()
expect(component.layout.type).toBe("Grid")
end
end
expect(found).toBe(true)
end)
it("should have audit_log_viewer component", function()
local found = false
for _, component in ipairs(components) do
if component.id == "audit_log_viewer" then
found = true
expect(component.name).toBe("Audit Log Viewer")
expect(component.props).toBeTruthy()
expect(component.bindings).toBeTruthy()
expect(component.bindings.dbal).toBe(true)
end
end
expect(found).toBe(true)
end)
it("should have required scripts in components", function()
for _, component in ipairs(components) do
if component.scripts then
expect(component.scripts).toBeType("table")
end
end
end)
it("should have valid layout structures", function()
for _, component in ipairs(components) do
if component.layout then
expect(component.layout.type).toBeTruthy()
expect(component.layout.type).toBeType("string")
end
end
end)
end)

View File

@@ -0,0 +1,80 @@
-- Metadata validation tests for audit_log package
local metadata = load_cases("metadata.json")
describe("Audit Log Package Metadata", function()
it("should have valid package structure", function()
expect(metadata.packageId).toBe("audit_log")
expect(metadata.name).toBe("Audit Log")
expect(metadata.version).toBeTruthy()
expect(metadata.description).toBeTruthy()
end)
it("should have correct package ID format", function()
expect(metadata.packageId).toMatch("^[a-z_]+$")
end)
it("should have semantic version", function()
expect(metadata.version).toMatch("^%d+%.%d+%.%d+$")
end)
it("should have exports defined", function()
expect(metadata.exports).toBeTruthy()
expect(metadata.exports.components).toBeType("table")
expect(metadata.exports.scripts).toBeType("table")
end)
it("should export required components", function()
local expected_components = {
"AuditLogViewer",
"AuditStatsCard",
"LogTable",
"LogFilters"
}
for _, comp in ipairs(expected_components) do
local found = false
for _, exported in ipairs(metadata.exports.components) do
if exported == comp then
found = true
break
end
end
expect(found).toBe(true)
end
end)
it("should export required scripts", function()
local expected_scripts = {
"init",
"stats",
"filters",
"formatting"
}
for _, script in ipairs(expected_scripts) do
local found = false
for _, exported in ipairs(metadata.exports.scripts) do
if exported == script then
found = true
break
end
end
expect(found).toBe(true)
end
end)
it("should have correct bindings", function()
expect(metadata.bindings).toBeTruthy()
expect(metadata.bindings.dbal).toBe(true)
expect(metadata.bindings.browser).toBe(false)
end)
it("should be admin category", function()
expect(metadata.category).toBe("admin")
end)
it("should have devDependencies", function()
expect(metadata.devDependencies).toBeType("table")
expect(#metadata.devDependencies).toBeGreaterThan(0)
end)
end)

View File

@@ -0,0 +1,89 @@
-- Stats calculation tests for audit_log package
local stats = require("stats")
describe("Audit Log Stats Module", function()
describe("calculateStats", function()
it("should calculate stats from empty logs", function()
local logs = {}
local result = stats.calculateStats(logs)
expect(result.total).toBe(0)
expect(result.successful).toBe(0)
expect(result.failed).toBe(0)
expect(result.rateLimit).toBe(0)
end)
it("should calculate stats from successful logs", function()
local logs = {
{ success = true },
{ success = true },
{ success = true }
}
local result = stats.calculateStats(logs)
expect(result.total).toBe(3)
expect(result.successful).toBe(3)
expect(result.failed).toBe(0)
expect(result.rateLimit).toBe(0)
end)
it("should calculate stats from failed logs", function()
local logs = {
{ success = false, error = "Permission denied" },
{ success = false, error = "Not found" }
}
local result = stats.calculateStats(logs)
expect(result.total).toBe(2)
expect(result.successful).toBe(0)
expect(result.failed).toBe(2)
expect(result.rateLimit).toBe(0)
end)
it("should calculate stats from rate limited logs", function()
local logs = {
{ success = false, error = "Rate limit exceeded" },
{ success = false, error = "Rate limit exceeded" }
}
local result = stats.calculateStats(logs)
expect(result.total).toBe(2)
expect(result.successful).toBe(0)
expect(result.failed).toBe(0)
expect(result.rateLimit).toBe(2)
end)
it("should calculate mixed stats", function()
local logs = {
{ success = true },
{ success = false, error = "Permission denied" },
{ success = false, error = "Rate limit exceeded" },
{ success = true }
}
local result = stats.calculateStats(logs)
expect(result.total).toBe(4)
expect(result.successful).toBe(2)
expect(result.failed).toBe(1)
expect(result.rateLimit).toBe(1)
end)
end)
describe("prepareStatsDisplay", function()
it("should format stats for display", function()
local stats_data = {
total = 100,
successful = 75,
failed = 20,
rateLimit = 5
}
local result = stats.prepareStatsDisplay(stats_data)
expect(result).toBeTruthy()
expect(result.total).toBe(100)
expect(result.successful).toBe(75)
expect(result.failed).toBe(20)
expect(result.rateLimit).toBe(5)
end)
end)
end)

View File

@@ -7,6 +7,9 @@
"author": "MetaBuilder",
"category": "editors",
"dependencies": [],
"devDependencies": [
"lua_test"
],
"exports": {
"scripts": [
"json",

View File

@@ -0,0 +1,19 @@
-- Component validation tests for code_editor package
local components = load_cases("components.json")
describe("Code Editor Components", function()
it("should be a valid array", function()
expect(components).toBeType("table")
end)
it("should have valid component structure if components exist", function()
if #components > 0 then
for _, component in ipairs(components) do
expect(component.id).toBeTruthy()
expect(component.type).toBeTruthy()
expect(component.id).toBeType("string")
expect(component.type).toBeType("string")
end
end
end)
end)

View File

@@ -0,0 +1,54 @@
-- Metadata validation tests for code_editor package
local metadata = load_cases("metadata.json")
describe("Code Editor Package Metadata", function()
it("should have valid package structure", function()
expect(metadata.packageId).toBe("code_editor")
expect(metadata.name).toBe("Code Editor")
expect(metadata.version).toBeTruthy()
expect(metadata.description).toBeTruthy()
end)
it("should be in editors category", function()
expect(metadata.category).toBe("editors")
end)
it("should export required scripts", function()
local expected_scripts = { "json", "lua", "theme" }
for _, script in ipairs(expected_scripts) do
local found = false
for _, exported in ipairs(metadata.exports.scripts) do
if exported == script then
found = true
break
end
end
expect(found).toBe(true)
end
end)
it("should export required components", function()
local expected_components = {
"CodeEditor",
"JsonEditor",
"LuaEditor",
"ThemeEditor"
}
for _, comp in ipairs(expected_components) do
local found = false
for _, exported in ipairs(metadata.exports.components) do
if exported == comp then
found = true
break
end
end
expect(found).toBe(true)
end
end)
it("should have correct minLevel", function()
expect(metadata.minLevel).toBe(5)
end)
end)

View File

@@ -0,0 +1,124 @@
# Package Analysis - Testing Patterns
## Overview
This document provides an analysis of testing patterns across MetaBuilder packages.
## Package Distribution
- **Total Packages**: 36
- **Packages with `lua_test`**: 30 (83%)
- **Packages without `lua_test`**: 6 (17%)
## Packages WITHOUT lua_test
The following packages do not use `lua_test` as a devDependency:
1. **audit_log** - Security audit log viewer
- Now includes `package_validator` as devDependency
- Could benefit from tests for stats and filtering logic
2. **code_editor** - Code editor components
- JSON, Lua, and theme editing functionality
- Could benefit from editor validation tests
3. **dbal_demo** - DBAL Integration Demo
- Demonstrates database operations
- May not need tests as it's a demo package
4. **package_validator** - This package
- Has its own test files using lua_test patterns
- Should add `lua_test` as devDependency for consistency
5. **quick_guide** - Quick guide builder
- Has initialization and media handling
- Could benefit from component tests
6. **ui_level6** - Supergod Panel
- Tenant management and system administration
- Could benefit from permission/layout tests
## Packages WITH lua_test (30 packages)
These packages follow the standard testing pattern with test files in `seed/scripts/tests/`:
- admin_dialog
- arcade_lobby
- codegen_studio
- dashboard
- data_table
- form_builder
- forum_forge
- irc_webchat
- lua_test (the testing framework itself)
- nav_menu
- notification_center
- schema_editor
- screenshot_analyzer
- social_hub
- stream_cast
- ui_auth
- ui_dialogs
- ui_footer
- ui_header
- ui_home
- ui_intro
- ui_level2
- ui_level3
- ui_level4
- ui_level5
- ui_login
- ui_pages
- ui_permissions
- user_manager
- workflow_editor
## Common Test File Patterns
Packages with lua_test typically have:
- `metadata.test.lua` - Validates package metadata structure
- `components.test.lua` - Validates component definitions
- Additional `*.test.lua` files for package-specific logic
## Recommendations
### For Packages Without lua_test
1. **package_validator** - Should add lua_test for consistency
2. **audit_log** - Add tests for stats calculations and filtering
3. **code_editor** - Add tests for editor validation logic
4. **quick_guide** - Add tests for step management and media handling
5. **ui_level6** - Add tests for tenant management logic
### For All Packages
- Use `package_validator` as a devDependency
- Follow consistent test file naming conventions
- Include both metadata and component tests
- Add package-specific logic tests
## Validator Behavior
The `package_validator` intelligently handles both patterns:
**With lua_test:**
```json
{
"devDependencies": ["lua_test"]
}
```
- ✅ Expects test files
- ⚠️ Warns if missing `metadata.test.lua` or `components.test.lua`
**Without lua_test:**
```json
{
"devDependencies": []
}
```
- ✅ No test expectations
- 📦 Tests are optional
## Conclusion
83% of packages use lua_test, showing a strong testing culture. The 6 packages without tests are opportunities for improving test coverage, particularly for utility packages like `audit_log`, `code_editor`, and `quick_guide`.

View File

@@ -7,6 +7,9 @@
"author": "MetaBuilder",
"category": "tools",
"dependencies": [],
"devDependencies": [
"lua_test"
],
"exports": {
"components": [],
"scripts": [

View File

@@ -0,0 +1,176 @@
{
"valid_metadata_cases": [
{
"name": "minimal valid metadata",
"data": {
"packageId": "test_package",
"name": "Test Package",
"version": "1.0.0",
"description": "A test package",
"author": "MetaBuilder",
"category": "test"
},
"expected": true
},
{
"name": "with dependencies",
"data": {
"packageId": "test_package",
"name": "Test Package",
"version": "1.0.0",
"description": "A test package",
"author": "MetaBuilder",
"category": "test",
"dependencies": ["other_package"]
},
"expected": true
},
{
"name": "with devDependencies",
"data": {
"packageId": "test_package",
"name": "Test Package",
"version": "1.0.0",
"description": "A test package",
"author": "MetaBuilder",
"category": "test",
"devDependencies": ["lua_test", "package_validator"]
},
"expected": true
},
{
"name": "with minLevel",
"data": {
"packageId": "test_package",
"name": "Test Package",
"version": "1.0.0",
"description": "A test package",
"author": "MetaBuilder",
"category": "test",
"minLevel": 3
},
"expected": true
}
],
"invalid_metadata_cases": [
{
"name": "missing packageId",
"data": {
"name": "Test Package",
"version": "1.0.0",
"description": "A test package",
"author": "MetaBuilder",
"category": "test"
},
"expected": false
},
{
"name": "invalid packageId format",
"data": {
"packageId": "TestPackage",
"name": "Test Package",
"version": "1.0.0",
"description": "A test package",
"author": "MetaBuilder",
"category": "test"
},
"expected": false
},
{
"name": "invalid version format",
"data": {
"packageId": "test_package",
"name": "Test Package",
"version": "1.0",
"description": "A test package",
"author": "MetaBuilder",
"category": "test"
},
"expected": false
},
{
"name": "minLevel out of range",
"data": {
"packageId": "test_package",
"name": "Test Package",
"version": "1.0.0",
"description": "A test package",
"author": "MetaBuilder",
"category": "test",
"minLevel": 10
},
"expected": false
}
],
"valid_component_cases": [
{
"name": "minimal component",
"data": {
"id": "test_component",
"type": "TestComponent"
},
"expected": true
},
{
"name": "component with layout",
"data": {
"id": "test_component",
"type": "TestComponent",
"layout": {
"type": "Box",
"children": []
}
},
"expected": true
},
{
"name": "component with nested layout",
"data": {
"id": "test_component",
"type": "TestComponent",
"layout": {
"type": "Box",
"children": [
{
"type": "Card",
"children": [
{
"type": "CardHeader",
"props": { "text": "Title" }
}
]
}
]
}
},
"expected": true
}
],
"invalid_component_cases": [
{
"name": "missing id",
"data": {
"type": "TestComponent"
},
"expected": false
},
{
"name": "missing type",
"data": {
"id": "test_component"
},
"expected": false
},
{
"name": "layout missing type",
"data": {
"id": "test_component",
"type": "TestComponent",
"layout": {
"props": {}
}
},
"expected": false
}
]
}

View File

@@ -0,0 +1,57 @@
-- Parameterized tests using cases.json
local metadata_schema = require("metadata_schema")
local component_schema = require("component_schema")
describe("Parameterized Metadata Validation", function()
local cases = load_cases("cases.json")
-- Test valid metadata cases
describe("Valid Metadata Cases", function()
for _, case in ipairs(cases.valid_metadata_cases) do
it("should pass: " .. case.name, function()
local valid, errors = metadata_schema.validate_metadata(case.data)
expect(valid).toBe(case.expected)
if case.expected then
expect(#errors).toBe(0)
end
end)
end
end)
-- Test invalid metadata cases
describe("Invalid Metadata Cases", function()
for _, case in ipairs(cases.invalid_metadata_cases) do
it("should fail: " .. case.name, function()
local valid, errors = metadata_schema.validate_metadata(case.data)
expect(valid).toBe(case.expected)
if not case.expected then
expect(#errors).toBeGreaterThan(0)
end
end)
end
end)
end)
describe("Parameterized Component Validation", function()
local cases = load_cases("cases.json")
-- Test valid component cases
describe("Valid Component Cases", function()
for _, case in ipairs(cases.valid_component_cases) do
it("should pass: " .. case.name, function()
local errors = component_schema.validate_component(case.data)
expect(#errors).toBe(0)
end)
end
end)
-- Test invalid component cases
describe("Invalid Component Cases", function()
for _, case in ipairs(cases.invalid_component_cases) do
it("should fail: " .. case.name, function()
local errors = component_schema.validate_component(case.data)
expect(#errors).toBeGreaterThan(0)
end)
end
end)
end)