#!/usr/bin/env python3
"""
Test authentication logic for different tool types
"""
def test_tool_detection():
"""Test tool type detection logic"""
SYSTEM_TOOLS = [
"list_projects",
"get_project_info",
"check_all_projects_health",
"get_project_health",
"get_system_metrics",
"get_system_uptime",
"get_rate_limit_stats",
"export_health_metrics",
"manage_api_keys_list",
"manage_api_keys_get_info",
]
test_cases = [
# (tool_name, expected_is_unified, expected_is_system, expected_skip_check, expected_project_id)
("wordpress_list_posts", True, False, True, "*"),
("woocommerce_list_products", True, False, True, "*"),
("mcp__coolify-projects__wordpress_get_post", True, False, True, "*"),
("mcp__coolify-projects__woocommerce_create_order", True, False, True, "*"),
("mcp__coolify-projects__list_projects", False, True, False, "*"),
("mcp__coolify-projects__get_system_metrics", False, True, False, "*"),
("mcp__coolify-projects__check_all_projects_health", False, True, False, "*"),
("list_projects", False, True, False, "*"),
("get_system_uptime", False, True, False, "*"),
(
"some_unknown_tool",
False,
False,
True,
"*",
), # Unknown - allow for backward compatibility
]
print("Testing tool detection logic:\n")
print(
f"{'Tool Name':<50} {'Unified':<10} {'System':<10} {'Skip Check':<12} {'Project ID':<12} {'Result'}"
)
print("-" * 110)
all_passed = True
for tool_name, exp_unified, exp_system, exp_skip, exp_project in test_cases:
# Apply the logic
is_unified_tool = (
tool_name.startswith("wordpress_")
or tool_name.startswith("woocommerce_")
or tool_name.startswith("mcp__coolify-projects__wordpress_")
or tool_name.startswith("mcp__coolify-projects__woocommerce_")
)
is_system_tool = any(tool_name.endswith(st) for st in SYSTEM_TOOLS)
if is_unified_tool:
skip_project_check = True
project_id = "*"
elif is_system_tool:
skip_project_check = False
project_id = "*"
else:
skip_project_check = True
project_id = "*"
# Check results
passed = (
is_unified_tool == exp_unified
and is_system_tool == exp_system
and skip_project_check == exp_skip
and project_id == exp_project
)
status = "✅ PASS" if passed else "❌ FAIL"
if not passed:
all_passed = False
print(
f"{tool_name:<50} {str(is_unified_tool):<10} {str(is_system_tool):<10} "
f"{str(skip_project_check):<12} {project_id:<12} {status}"
)
print("\n" + "=" * 110)
if all_passed:
print("✅ All tests passed!")
else:
print("❌ Some tests failed!")
return all_passed
def test_auth_scenarios():
"""Test authentication scenarios"""
print("\n\nTesting authentication scenarios:\n")
print(f"{'Scenario':<60} {'Expected Result':<30} {'Status'}")
print("-" * 110)
scenarios = [
# (description, key_project_id, tool_is_unified, tool_is_system, expected_result)
(
"Per-project key + Unified WP tool",
"wordpress_site1",
True,
False,
"✅ Allow (skip_project_check=True)",
),
(
"Per-project key + System tool",
"wordpress_site1",
False,
True,
"❌ Reject (key.project_id != '*')",
),
(
"Global key (*) + Unified WP tool",
"*",
True,
False,
"✅ Allow (skip_project_check=True)",
),
("Global key (*) + System tool", "*", False, True, "✅ Allow (key.project_id == '*')"),
(
"Per-project key + Unknown tool",
"wordpress_site1",
False,
False,
"✅ Allow (backward compatibility)",
),
("Global key (*) + Unknown tool", "*", False, False, "✅ Allow"),
]
for desc, key_project_id, is_unified, is_system, expected in scenarios:
# Determine skip_project_check based on tool type
if is_unified:
skip_project_check = True
elif is_system:
skip_project_check = False
else:
skip_project_check = True
# Simulate validate_key check
project_id = "*" # Always "*" in our new logic
# Check if key would be validated
if skip_project_check:
# Skip project check - key is valid regardless
would_pass_validate = True
reason = "skip_project_check=True"
else:
# Check project access
if key_project_id == "*" or key_project_id == project_id:
would_pass_validate = True
reason = f"key.project_id={key_project_id} matches project_id={project_id}"
else:
would_pass_validate = False
reason = f"key.project_id={key_project_id} != project_id={project_id}"
# Additional check for system tools
if is_system and key_project_id != "*":
would_pass_validate = False
reason = "System tools require global key (additional check)"
result = "✅ Allow" if would_pass_validate else "❌ Reject"
status = "✅ PASS" if (result in expected) else "❌ FAIL"
print(f"{desc:<60} {result:<30} {status}")
if status == "❌ FAIL":
print(f" └─ Expected: {expected}")
print(f" └─ Reason: {reason}")
print("\n" + "=" * 110)
if __name__ == "__main__":
test_tool_detection()
test_auth_scenarios()