64 lines
2.3 KiB
Python
64 lines
2.3 KiB
Python
# 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"
|