# tests/services/community/test_community_store.py import pytest from unittest.mock import MagicMock, patch from app.services.community.community_store import KiwiCommunityStore, get_or_create_pseudonym def test_get_or_create_pseudonym_new_user(): """First-time publish: creates a new pseudonym in per-user SQLite.""" mock_store = MagicMock() mock_store.get_current_pseudonym.return_value = None result = get_or_create_pseudonym( store=mock_store, directus_user_id="user-123", requested_name="PastaWitch", ) mock_store.set_pseudonym.assert_called_once_with("user-123", "PastaWitch") assert result == "PastaWitch" def test_get_or_create_pseudonym_existing(): """If user already has a pseudonym, return it without creating a new one.""" mock_store = MagicMock() mock_store.get_current_pseudonym.return_value = "PastaWitch" result = get_or_create_pseudonym( store=mock_store, directus_user_id="user-123", requested_name=None, ) mock_store.set_pseudonym.assert_not_called() assert result == "PastaWitch" def test_get_or_create_pseudonym_email_rejected(): """Pseudonyms with @ are rejected to prevent PII leakage.""" mock_store = MagicMock() mock_store.get_current_pseudonym.return_value = None with pytest.raises(ValueError, match="@"): get_or_create_pseudonym( store=mock_store, directus_user_id="user-123", requested_name="user@example.com", ) def test_get_or_create_pseudonym_blank_name_raises(): """Empty requested_name raises when no existing pseudonym.""" mock_store = MagicMock() mock_store.get_current_pseudonym.return_value = None with pytest.raises(ValueError): get_or_create_pseudonym( store=mock_store, directus_user_id="user-123", requested_name="", ) def test_kiwi_community_store_list_meal_plans_filters_by_plan_type(): """KiwiCommunityStore.list_meal_plans calls list_posts with post_type='plan'.""" store = KiwiCommunityStore.__new__(KiwiCommunityStore) with patch.object(store, "list_posts", return_value=[]) as mock_list: result = store.list_meal_plans(limit=10) mock_list.assert_called_once() call_kwargs = mock_list.call_args.kwargs assert call_kwargs.get("post_type") == "plan"