""" Tests for GET /api/services/active endpoint. """ import json import sys from pathlib import Path from unittest.mock import MagicMock, patch import pytest sys.path.insert(0, str(Path(__file__).parent.parent / 'api')) from app import app def _make_registry(active_services): reg = MagicMock() reg.list_active = MagicMock(return_value=active_services) return reg @pytest.fixture() def client(): app.config['TESTING'] = True with app.test_client() as c: yield c def test_active_returns_200(client): import app as app_module with patch.object(app_module, 'service_registry', _make_registry([])): resp = client.get('/api/services/active') assert resp.status_code == 200 def test_active_returns_empty_list_when_nothing_installed(client): import app as app_module with patch.object(app_module, 'service_registry', _make_registry([])): resp = client.get('/api/services/active') data = json.loads(resp.data) assert data == [] def test_active_returns_installed_services(client): email_svc = { 'id': 'email', 'name': 'Email', 'subdomain': 'mail', 'capabilities': {'has_accounts': True}, 'config': {}, } import app as app_module with patch.object(app_module, 'service_registry', _make_registry([email_svc])): resp = client.get('/api/services/active') data = json.loads(resp.data) assert isinstance(data, list) assert len(data) == 1 assert data[0]['id'] == 'email' assert data[0]['name'] == 'Email' def test_active_response_shape(client): """Each entry must have id, name, subdomain, and capabilities keys.""" email_svc = { 'id': 'email', 'name': 'Email', 'subdomain': 'mail', 'capabilities': {'has_accounts': True}, 'config': {}, } import app as app_module with patch.object(app_module, 'service_registry', _make_registry([email_svc])): resp = client.get('/api/services/active') data = json.loads(resp.data) entry = data[0] assert 'id' in entry assert 'name' in entry assert 'subdomain' in entry assert 'capabilities' in entry