From 25c98f2704023e94ea4e4491ea20c8360fad2303 Mon Sep 17 00:00:00 2001 From: JohnDoe6345789 Date: Tue, 30 Dec 2025 02:27:20 +0000 Subject: [PATCH] feat: Add lua_test as a devDependency and implement validation tests for audit_log and code_editor packages --- packages/audit_log/seed/metadata.json | 1 + .../seed/scripts/tests/components.test.lua | 64 +++++++ .../seed/scripts/tests/metadata.test.lua | 80 ++++++++ .../seed/scripts/tests/stats.test.lua | 89 +++++++++ packages/code_editor/seed/metadata.json | 3 + .../seed/scripts/tests/components.test.lua | 19 ++ .../seed/scripts/tests/metadata.test.lua | 54 ++++++ .../package_validator/PACKAGE_ANALYSIS.md | 124 ++++++++++++ packages/package_validator/seed/metadata.json | 3 + .../seed/scripts/tests/cases.json | 176 ++++++++++++++++++ .../seed/scripts/tests/parameterized.test.lua | 57 ++++++ 11 files changed, 670 insertions(+) create mode 100644 packages/audit_log/seed/scripts/tests/components.test.lua create mode 100644 packages/audit_log/seed/scripts/tests/metadata.test.lua create mode 100644 packages/audit_log/seed/scripts/tests/stats.test.lua create mode 100644 packages/code_editor/seed/scripts/tests/components.test.lua create mode 100644 packages/code_editor/seed/scripts/tests/metadata.test.lua create mode 100644 packages/package_validator/PACKAGE_ANALYSIS.md create mode 100644 packages/package_validator/seed/scripts/tests/cases.json create mode 100644 packages/package_validator/seed/scripts/tests/parameterized.test.lua diff --git a/packages/audit_log/seed/metadata.json b/packages/audit_log/seed/metadata.json index 8dcfe57ff..5b7b0e852 100644 --- a/packages/audit_log/seed/metadata.json +++ b/packages/audit_log/seed/metadata.json @@ -8,6 +8,7 @@ "category": "admin", "dependencies": [], "devDependencies": [ + "lua_test", "package_validator" ], "exports": { diff --git a/packages/audit_log/seed/scripts/tests/components.test.lua b/packages/audit_log/seed/scripts/tests/components.test.lua new file mode 100644 index 000000000..1174c9f87 --- /dev/null +++ b/packages/audit_log/seed/scripts/tests/components.test.lua @@ -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) diff --git a/packages/audit_log/seed/scripts/tests/metadata.test.lua b/packages/audit_log/seed/scripts/tests/metadata.test.lua new file mode 100644 index 000000000..129b02225 --- /dev/null +++ b/packages/audit_log/seed/scripts/tests/metadata.test.lua @@ -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) diff --git a/packages/audit_log/seed/scripts/tests/stats.test.lua b/packages/audit_log/seed/scripts/tests/stats.test.lua new file mode 100644 index 000000000..7a31a8444 --- /dev/null +++ b/packages/audit_log/seed/scripts/tests/stats.test.lua @@ -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) diff --git a/packages/code_editor/seed/metadata.json b/packages/code_editor/seed/metadata.json index 456dd6608..7e36bb081 100644 --- a/packages/code_editor/seed/metadata.json +++ b/packages/code_editor/seed/metadata.json @@ -7,6 +7,9 @@ "author": "MetaBuilder", "category": "editors", "dependencies": [], + "devDependencies": [ + "lua_test" + ], "exports": { "scripts": [ "json", diff --git a/packages/code_editor/seed/scripts/tests/components.test.lua b/packages/code_editor/seed/scripts/tests/components.test.lua new file mode 100644 index 000000000..b89e2e53a --- /dev/null +++ b/packages/code_editor/seed/scripts/tests/components.test.lua @@ -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) diff --git a/packages/code_editor/seed/scripts/tests/metadata.test.lua b/packages/code_editor/seed/scripts/tests/metadata.test.lua new file mode 100644 index 000000000..cfd8ca2bc --- /dev/null +++ b/packages/code_editor/seed/scripts/tests/metadata.test.lua @@ -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) diff --git a/packages/package_validator/PACKAGE_ANALYSIS.md b/packages/package_validator/PACKAGE_ANALYSIS.md new file mode 100644 index 000000000..53239e2d9 --- /dev/null +++ b/packages/package_validator/PACKAGE_ANALYSIS.md @@ -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`. diff --git a/packages/package_validator/seed/metadata.json b/packages/package_validator/seed/metadata.json index c31fc1ae1..0400b9c84 100644 --- a/packages/package_validator/seed/metadata.json +++ b/packages/package_validator/seed/metadata.json @@ -7,6 +7,9 @@ "author": "MetaBuilder", "category": "tools", "dependencies": [], + "devDependencies": [ + "lua_test" + ], "exports": { "components": [], "scripts": [ diff --git a/packages/package_validator/seed/scripts/tests/cases.json b/packages/package_validator/seed/scripts/tests/cases.json new file mode 100644 index 000000000..78af1e091 --- /dev/null +++ b/packages/package_validator/seed/scripts/tests/cases.json @@ -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 + } + ] +} diff --git a/packages/package_validator/seed/scripts/tests/parameterized.test.lua b/packages/package_validator/seed/scripts/tests/parameterized.test.lua new file mode 100644 index 000000000..0a3bc7ae1 --- /dev/null +++ b/packages/package_validator/seed/scripts/tests/parameterized.test.lua @@ -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)