Files
mcphub/tests/test_plugin_visibility.py
airano-ir 43fd2201a0 feat(v3.13.0): settings live DB reads, remove Directus/Appwrite, admin stats
Settings fixes:
- MAX_SITES_PER_USER, USER_RATE_LIMIT_PER_MIN/HR now read from DB settings
  table (DB > ENV > default), so dashboard/settings changes apply without
  restart. Sync cache refreshed on every save or delete.
- /api/me reports the live DB value for max_sites_per_user.

Admin improvements:
- Admin users bypass per-user rate limiting entirely (role=admin or ADMIN_EMAILS).
- Admin Overview now shows platform stats: registered users, new users (7d),
  total user sites, available tools.

Plugin cleanup:
- Appwrite and Directus plugins removed from the active registry (8 plugins
  now: WordPress, WooCommerce, WordPress Specialist, Gitea, n8n, Supabase,
  OpenPanel, Coolify). Plugin code is retained for future re-enabling.
- Settings page plugin visibility list updated to match.

Mobile onboarding:
- Stepper steps on narrow viewports stack vertically with correct full border
  and rounded corners on each step.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 23:33:20 +02:00

177 lines
6.8 KiB
Python

"""Tests for plugin visibility control (Track F.1)."""
import os
from unittest.mock import patch
from core.plugin_visibility import (
DEFAULT_PUBLIC_PLUGINS,
get_public_plugin_types,
is_plugin_public,
)
class TestGetPublicPluginTypes:
"""Tests for get_public_plugin_types()."""
def test_default_when_env_not_set(self):
"""Returns default set when ENABLED_PLUGINS is not set."""
with patch.dict(os.environ, {}, clear=False):
os.environ.pop("ENABLED_PLUGINS", None)
result = get_public_plugin_types()
assert result == DEFAULT_PUBLIC_PLUGINS
def test_default_when_env_empty(self):
"""Returns default set when ENABLED_PLUGINS is empty string."""
with patch.dict(os.environ, {"ENABLED_PLUGINS": ""}):
result = get_public_plugin_types()
assert result == DEFAULT_PUBLIC_PLUGINS
def test_custom_plugins_from_env(self):
"""Reads custom plugin list from ENABLED_PLUGINS."""
with patch.dict(os.environ, {"ENABLED_PLUGINS": "wordpress,gitea"}):
result = get_public_plugin_types()
assert result == {"wordpress", "gitea"}
def test_whitespace_handling(self):
"""Strips whitespace from plugin names."""
with patch.dict(os.environ, {"ENABLED_PLUGINS": " wordpress , supabase "}):
result = get_public_plugin_types()
assert result == {"wordpress", "supabase"}
def test_case_insensitive(self):
"""Plugin names are lowercased."""
with patch.dict(os.environ, {"ENABLED_PLUGINS": "WordPress,SUPABASE"}):
result = get_public_plugin_types()
assert result == {"wordpress", "supabase"}
def test_single_plugin(self):
"""Works with a single plugin."""
with patch.dict(os.environ, {"ENABLED_PLUGINS": "wordpress"}):
result = get_public_plugin_types()
assert result == {"wordpress"}
def test_ignores_empty_entries(self):
"""Trailing commas or double commas are ignored."""
with patch.dict(os.environ, {"ENABLED_PLUGINS": "wordpress,,supabase,"}):
result = get_public_plugin_types()
assert result == {"wordpress", "supabase"}
class TestIsPluginPublic:
"""Tests for is_plugin_public()."""
def test_default_wordpress_public(self):
"""WordPress is public by default."""
with patch.dict(os.environ, {}, clear=False):
os.environ.pop("ENABLED_PLUGINS", None)
assert is_plugin_public("wordpress") is True
def test_default_woocommerce_public(self):
"""WooCommerce is public by default."""
with patch.dict(os.environ, {}, clear=False):
os.environ.pop("ENABLED_PLUGINS", None)
assert is_plugin_public("woocommerce") is True
def test_default_supabase_public(self):
"""Supabase is public by default."""
with patch.dict(os.environ, {}, clear=False):
os.environ.pop("ENABLED_PLUGINS", None)
assert is_plugin_public("supabase") is True
def test_default_gitea_public(self):
"""Gitea is public by default (since F.16)."""
with patch.dict(os.environ, {}, clear=False):
os.environ.pop("ENABLED_PLUGINS", None)
assert is_plugin_public("gitea") is True
def test_default_wordpress_specialist_public(self):
"""WordPress Specialist is public by default."""
with patch.dict(os.environ, {}, clear=False):
os.environ.pop("ENABLED_PLUGINS", None)
assert is_plugin_public("wordpress_specialist") is True
def test_default_n8n_public(self):
"""n8n is public by default."""
with patch.dict(os.environ, {}, clear=False):
os.environ.pop("ENABLED_PLUGINS", None)
assert is_plugin_public("n8n") is True
def test_default_coolify_public(self):
"""Coolify is public by default."""
with patch.dict(os.environ, {}, clear=False):
os.environ.pop("ENABLED_PLUGINS", None)
assert is_plugin_public("coolify") is True
def test_default_directus_and_appwrite_not_public(self):
"""Directus and Appwrite stay disabled by default."""
with patch.dict(os.environ, {}, clear=False):
os.environ.pop("ENABLED_PLUGINS", None)
assert is_plugin_public("directus") is False
assert is_plugin_public("appwrite") is False
def test_case_insensitive_check(self):
"""Plugin type check is case insensitive."""
with patch.dict(os.environ, {"ENABLED_PLUGINS": "wordpress"}):
assert is_plugin_public("WordPress") is True
assert is_plugin_public("WORDPRESS") is True
def test_custom_env_overrides_defaults(self):
"""Custom ENABLED_PLUGINS overrides the default set."""
with patch.dict(os.environ, {"ENABLED_PLUGINS": "gitea,n8n"}):
assert is_plugin_public("gitea") is True
assert is_plugin_public("n8n") is True
assert is_plugin_public("wordpress") is False
class TestSiteApiIntegration:
"""Tests that site_api uses plugin_visibility correctly."""
def test_get_user_credential_fields_filtered(self):
"""get_user_credential_fields only returns enabled plugins."""
from core.site_api import get_user_credential_fields
with patch.dict(os.environ, {}, clear=False):
os.environ.pop("ENABLED_PLUGINS", None)
fields = get_user_credential_fields()
assert "wordpress" in fields
assert "woocommerce" in fields
assert "supabase" in fields
assert "gitea" in fields
assert "openpanel" in fields
assert "wordpress_specialist" in fields
assert "n8n" in fields
assert "coolify" in fields
assert "directus" not in fields
assert "appwrite" not in fields
def test_get_user_plugin_names_filtered(self):
"""get_user_plugin_names only returns enabled plugins."""
from core.site_api import get_user_plugin_names
with patch.dict(os.environ, {}, clear=False):
os.environ.pop("ENABLED_PLUGINS", None)
names = get_user_plugin_names()
assert "wordpress" in names
assert "woocommerce" in names
assert "supabase" in names
assert "gitea" in names
assert "openpanel" in names
assert "wordpress_specialist" in names
assert "n8n" in names
assert "coolify" in names
assert "directus" not in names
assert "appwrite" not in names
def test_custom_env_changes_fields(self):
"""Custom ENABLED_PLUGINS changes which credential fields are returned."""
from core.site_api import get_user_credential_fields
with patch.dict(os.environ, {"ENABLED_PLUGINS": "wordpress"}):
fields = get_user_credential_fields()
assert "wordpress" in fields
assert "woocommerce" not in fields
assert "supabase" not in fields