Major structural reorganization and feature additions: ## Folder Reorganization - Move 17 luci-app-* packages to package/secubox/ (except luci-app-secubox core hub) - Update all tooling to support new structure: - secubox-tools/quick-deploy.sh: search both locations - secubox-tools/validate-modules.sh: validate both directories - secubox-tools/fix-permissions.sh: fix permissions in both locations - .github/workflows/test-validate.yml: build from both paths - Update README.md links to new package/secubox/ paths ## AppStore Migration (Complete) - Add catalog entries for all remaining luci-app packages: - network-tweaks.json: Network optimization tools - secubox-bonus.json: Documentation & demos hub - Total: 24 apps in AppStore catalog (22 existing + 2 new) - New category: 'documentation' for docs/demos/tutorials ## VHost Manager v2.0 Enhancements - Add profile activation system for Internal Services and Redirects - Implement createVHost() API wrapper for template-based deployment - Fix Virtual Hosts view rendering with proper LuCI patterns - Fix RPCD backend shell script errors (remove invalid local declarations) - Extend backend validation for nginx return directives (redirect support) - Add section_id parameter for named VHost profiles - Add Remove button to Redirects page for feature parity - Update README to v2.0 with comprehensive feature documentation ## Network Tweaks Dashboard - Close button added to component details modal Files changed: 340+ (336 renames with preserved git history) Packages affected: 19 luci-app, 2 secubox-app, 1 theme, 4 tools 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
274 lines
8.4 KiB
Bash
Executable File
274 lines
8.4 KiB
Bash
Executable File
#!/bin/sh
|
|
# System Hub Diagnostic Profiles - Unit Tests
|
|
# Tests RPCD backend functions in isolation
|
|
|
|
. /lib/functions.sh
|
|
. /usr/share/libubox/jshn.sh
|
|
|
|
# Test counters
|
|
TESTS_PASSED=0
|
|
TESTS_FAILED=0
|
|
TEST_NAME=""
|
|
|
|
# Color codes for output
|
|
GREEN='\033[0;32m'
|
|
RED='\033[0;31m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Assert functions
|
|
assert_equals() {
|
|
local expected="$1"
|
|
local actual="$2"
|
|
local test_name="$3"
|
|
|
|
if [ "$expected" = "$actual" ]; then
|
|
echo -e "${GREEN}✅ PASS${NC}: $test_name"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
return 0
|
|
else
|
|
echo -e "${RED}❌ FAIL${NC}: $test_name"
|
|
echo " Expected: $expected"
|
|
echo " Actual: $actual"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
assert_contains() {
|
|
local haystack="$1"
|
|
local needle="$2"
|
|
local test_name="$3"
|
|
|
|
if echo "$haystack" | grep -q "$needle"; then
|
|
echo -e "${GREEN}✅ PASS${NC}: $test_name"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
return 0
|
|
else
|
|
echo -e "${RED}❌ FAIL${NC}: $test_name"
|
|
echo " Expected to find: $needle"
|
|
echo " In: $haystack"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
assert_json_valid() {
|
|
local json="$1"
|
|
local test_name="$2"
|
|
|
|
if echo "$json" | jsonfilter -e '@' >/dev/null 2>&1; then
|
|
echo -e "${GREEN}✅ PASS${NC}: $test_name"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
return 0
|
|
else
|
|
echo -e "${RED}❌ FAIL${NC}: $test_name"
|
|
echo " Invalid JSON: $json"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Test 1: Profile listing returns valid JSON
|
|
test_list_profiles_json() {
|
|
echo ""
|
|
echo "TEST 1: list_diagnostic_profiles returns valid JSON"
|
|
echo "=================================================="
|
|
|
|
local result=$(ubus call luci.system-hub list_diagnostic_profiles 2>&1)
|
|
|
|
assert_json_valid "$result" "list_diagnostic_profiles returns valid JSON"
|
|
}
|
|
|
|
# Test 2: At least 5 profiles returned
|
|
test_list_profiles_count() {
|
|
echo ""
|
|
echo "TEST 2: At least 5 profiles available"
|
|
echo "======================================"
|
|
|
|
local result=$(ubus call luci.system-hub list_diagnostic_profiles 2>&1)
|
|
local count=$(echo "$result" | jsonfilter -e '@.profiles[*]' 2>/dev/null | wc -l)
|
|
|
|
if [ "$count" -ge 5 ]; then
|
|
assert_equals "5" "$count" "At least 5 profiles returned (found $count)"
|
|
else
|
|
assert_equals "5" "$count" "At least 5 profiles returned"
|
|
fi
|
|
}
|
|
|
|
# Test 3: Profile names are correct
|
|
test_profile_names() {
|
|
echo ""
|
|
echo "TEST 3: Profile names are correct"
|
|
echo "=================================="
|
|
|
|
local result=$(ubus call luci.system-hub list_diagnostic_profiles 2>&1)
|
|
|
|
assert_contains "$result" "network-issues" "Contains network-issues profile"
|
|
assert_contains "$result" "performance-problems" "Contains performance-problems profile"
|
|
assert_contains "$result" "security-audit" "Contains security-audit profile"
|
|
assert_contains "$result" "wifi-problems" "Contains wifi-problems profile"
|
|
assert_contains "$result" "full-diagnostic" "Contains full-diagnostic profile"
|
|
}
|
|
|
|
# Test 4: Get specific profile - network-issues
|
|
test_get_profile_network() {
|
|
echo ""
|
|
echo "TEST 4: Get network-issues profile"
|
|
echo "==================================="
|
|
|
|
local result=$(ubus call luci.system-hub get_diagnostic_profile '{"name":"network-issues"}' 2>&1)
|
|
|
|
assert_json_valid "$result" "get_diagnostic_profile returns valid JSON"
|
|
|
|
local name=$(echo "$result" | jsonfilter -e '@.name' 2>/dev/null)
|
|
assert_equals "network-issues" "$name" "Profile name is network-issues"
|
|
|
|
local tests=$(echo "$result" | jsonfilter -e '@.tests' 2>/dev/null)
|
|
assert_contains "$tests" "connectivity" "Profile contains connectivity test"
|
|
assert_contains "$tests" "dns" "Profile contains dns test"
|
|
|
|
local include_logs=$(echo "$result" | jsonfilter -e '@.include_logs' 2>/dev/null)
|
|
assert_equals "1" "$include_logs" "Profile includes logs"
|
|
}
|
|
|
|
# Test 5: Get specific profile - performance-problems
|
|
test_get_profile_performance() {
|
|
echo ""
|
|
echo "TEST 5: Get performance-problems profile"
|
|
echo "========================================="
|
|
|
|
local result=$(ubus call luci.system-hub get_diagnostic_profile '{"name":"performance-problems"}' 2>&1)
|
|
|
|
local name=$(echo "$result" | jsonfilter -e '@.name' 2>/dev/null)
|
|
assert_equals "performance-problems" "$name" "Profile name is performance-problems"
|
|
|
|
local include_config=$(echo "$result" | jsonfilter -e '@.include_config' 2>/dev/null)
|
|
assert_equals "0" "$include_config" "Performance profile does not include config"
|
|
}
|
|
|
|
# Test 6: Get invalid profile
|
|
test_get_profile_invalid() {
|
|
echo ""
|
|
echo "TEST 6: Get invalid profile returns error"
|
|
echo "=========================================="
|
|
|
|
local result=$(ubus call luci.system-hub get_diagnostic_profile '{"name":"invalid-profile"}' 2>&1)
|
|
|
|
assert_json_valid "$result" "Invalid profile returns valid JSON error"
|
|
assert_contains "$result" "error" "Response contains error field"
|
|
}
|
|
|
|
# Test 7: Collect diagnostics with profile
|
|
test_collect_with_profile() {
|
|
echo ""
|
|
echo "TEST 7: Collect diagnostics with profile"
|
|
echo "========================================="
|
|
|
|
local result=$(ubus call luci.system-hub collect_diagnostics '{"profile":"network-issues"}' 2>&1)
|
|
|
|
assert_json_valid "$result" "collect_diagnostics with profile returns valid JSON"
|
|
|
|
local success=$(echo "$result" | jsonfilter -e '@.success' 2>/dev/null)
|
|
assert_equals "true" "$success" "Diagnostic collection succeeds"
|
|
|
|
local filename=$(echo "$result" | jsonfilter -e '@.file' 2>/dev/null)
|
|
assert_contains "$filename" "network-issues" "Archive filename contains profile name"
|
|
|
|
# Cleanup
|
|
if [ -n "$filename" ]; then
|
|
rm -f "/tmp/system-hub/diagnostics/$filename"
|
|
fi
|
|
}
|
|
|
|
# Test 8: Profile filename format
|
|
test_profile_filename_format() {
|
|
echo ""
|
|
echo "TEST 8: Profile filename format is correct"
|
|
echo "==========================================="
|
|
|
|
local result=$(ubus call luci.system-hub collect_diagnostics '{"profile":"security-audit"}' 2>&1)
|
|
local filename=$(echo "$result" | jsonfilter -e '@.file' 2>/dev/null)
|
|
|
|
# Format should be: diagnostics-{hostname}-{profile}-{timestamp}.tar.gz
|
|
assert_contains "$filename" "security-audit" "Filename contains profile name"
|
|
assert_contains "$filename" ".tar.gz" "Filename has .tar.gz extension"
|
|
assert_contains "$filename" "diagnostics-" "Filename starts with diagnostics-"
|
|
|
|
# Cleanup
|
|
if [ -n "$filename" ]; then
|
|
rm -f "/tmp/system-hub/diagnostics/$filename"
|
|
fi
|
|
}
|
|
|
|
# Test 9: Profile overrides flags
|
|
test_profile_overrides_flags() {
|
|
echo ""
|
|
echo "TEST 9: Profile overrides individual flags"
|
|
echo "==========================================="
|
|
|
|
# Performance profile has include_config=0
|
|
local result=$(ubus call luci.system-hub collect_diagnostics '{"profile":"performance-problems","include_config":1}' 2>&1)
|
|
|
|
local success=$(echo "$result" | jsonfilter -e '@.success' 2>/dev/null)
|
|
assert_equals "true" "$success" "Collection with profile override succeeds"
|
|
|
|
local filename=$(echo "$result" | jsonfilter -e '@.file' 2>/dev/null)
|
|
assert_contains "$filename" "performance-problems" "Filename contains profile name"
|
|
|
|
# Cleanup
|
|
if [ -n "$filename" ]; then
|
|
rm -f "/tmp/system-hub/diagnostics/$filename"
|
|
fi
|
|
}
|
|
|
|
# Test 10: All profiles can be retrieved
|
|
test_all_profiles_retrievable() {
|
|
echo ""
|
|
echo "TEST 10: All 5 profiles can be retrieved individually"
|
|
echo "======================================================"
|
|
|
|
local profiles="network-issues performance-problems security-audit wifi-problems full-diagnostic"
|
|
|
|
for profile in $profiles; do
|
|
local result=$(ubus call luci.system-hub get_diagnostic_profile "{\"name\":\"$profile\"}" 2>&1)
|
|
local name=$(echo "$result" | jsonfilter -e '@.name' 2>/dev/null)
|
|
assert_equals "$profile" "$name" "Profile $profile can be retrieved"
|
|
done
|
|
}
|
|
|
|
# Run all tests
|
|
echo "========================================"
|
|
echo "System Hub Diagnostic Profiles Unit Tests"
|
|
echo "========================================"
|
|
echo "Starting test run at $(date)"
|
|
echo ""
|
|
|
|
test_list_profiles_json
|
|
test_list_profiles_count
|
|
test_profile_names
|
|
test_get_profile_network
|
|
test_get_profile_performance
|
|
test_get_profile_invalid
|
|
test_collect_with_profile
|
|
test_profile_filename_format
|
|
test_profile_overrides_flags
|
|
test_all_profiles_retrievable
|
|
|
|
# Summary
|
|
echo ""
|
|
echo "========================================"
|
|
echo "Test Results Summary"
|
|
echo "========================================"
|
|
echo -e "${GREEN}Passed: $TESTS_PASSED${NC}"
|
|
echo -e "${RED}Failed: $TESTS_FAILED${NC}"
|
|
echo "Total: $((TESTS_PASSED + TESTS_FAILED))"
|
|
echo ""
|
|
|
|
if [ $TESTS_FAILED -eq 0 ]; then
|
|
echo -e "${GREEN}✅ All tests passed!${NC}"
|
|
exit 0
|
|
else
|
|
echo -e "${RED}❌ Some tests failed${NC}"
|
|
exit 1
|
|
fi
|