mirror of
https://github.com/khoaliber/LetterFeed.git
synced 2026-03-08 05:39:14 +00:00
feat: define search folder per newsletter #3
This commit is contained in:
@@ -152,6 +152,33 @@ def test_create_newsletter_with_move_to_folder(db_session: Session):
|
||||
assert retrieved_newsletter.extract_content is True
|
||||
|
||||
|
||||
def test_create_newsletter_with_search_folder(db_session: Session):
|
||||
"""Test creating and updating a newsletter with the search_folder attribute."""
|
||||
unique_email = f"sender_{uuid.uuid4()}@test.com"
|
||||
newsletter_data = NewsletterCreate(
|
||||
name="Test Newsletter with Search Folder",
|
||||
sender_emails=[unique_email],
|
||||
search_folder="CustomInbox",
|
||||
)
|
||||
newsletter = create_newsletter(db_session, newsletter_data)
|
||||
retrieved_newsletter = get_newsletter_by_identifier(db_session, newsletter.id)
|
||||
|
||||
assert retrieved_newsletter.name == "Test Newsletter with Search Folder"
|
||||
assert retrieved_newsletter.search_folder == "CustomInbox"
|
||||
|
||||
# Test updating the search_folder
|
||||
from app.crud.newsletters import update_newsletter
|
||||
from app.schemas.newsletters import NewsletterUpdate
|
||||
|
||||
update_data = NewsletterUpdate(
|
||||
name=newsletter.name,
|
||||
sender_emails=[unique_email],
|
||||
search_folder="UpdatedCustomInbox",
|
||||
)
|
||||
updated_newsletter = update_newsletter(db_session, newsletter.id, update_data)
|
||||
assert updated_newsletter.search_folder == "UpdatedCustomInbox"
|
||||
|
||||
|
||||
def test_get_newsletter_by_identifier(db_session: Session):
|
||||
"""Test getting a single newsletter."""
|
||||
unique_email = f"sender_{uuid.uuid4()}@test.com"
|
||||
|
||||
@@ -8,15 +8,15 @@ from app.crud.newsletters import create_newsletter
|
||||
from app.crud.settings import create_or_update_settings
|
||||
from app.models.newsletters import Newsletter
|
||||
from app.schemas.newsletters import NewsletterCreate
|
||||
from app.schemas.settings import SettingsCreate
|
||||
from app.services.email_processor import _process_single_email
|
||||
from app.schemas.settings import Settings, SettingsCreate
|
||||
from app.services.email_processor import _process_single_email, process_emails
|
||||
|
||||
|
||||
def _setup_test_email_processing(
|
||||
db_session: Session,
|
||||
newsletter_create_data: NewsletterCreate,
|
||||
settings_create_data: SettingsCreate,
|
||||
) -> tuple[MagicMock, Newsletter, SettingsCreate]:
|
||||
) -> tuple[MagicMock, Newsletter, Settings]:
|
||||
"""Help to set up mocks and data for email processing tests."""
|
||||
settings = create_or_update_settings(db_session, settings_create_data)
|
||||
newsletter = create_newsletter(db_session, newsletter_create_data)
|
||||
@@ -84,6 +84,74 @@ def test_process_single_email_with_global_move_folder(db_session: Session):
|
||||
mock_mail.store.assert_any_call("1", "+FLAGS", "\\Deleted")
|
||||
|
||||
|
||||
@patch("app.services.email_processor._connect_to_imap")
|
||||
def test_process_emails_uses_newsletter_search_folder(
|
||||
mock_connect_to_imap,
|
||||
db_session: Session,
|
||||
):
|
||||
"""Test that the per-newsletter search_folder is used, overriding the global setting."""
|
||||
# 1. ARRANGE
|
||||
settings_data = SettingsCreate(
|
||||
imap_server="test.com",
|
||||
imap_username="test",
|
||||
imap_password="password",
|
||||
search_folder="GlobalInbox",
|
||||
)
|
||||
create_or_update_settings(db_session, settings_data)
|
||||
|
||||
newsletter_data = NewsletterCreate(
|
||||
name="Test Newsletter",
|
||||
sender_emails=["test@example.com"],
|
||||
search_folder="NewsletterInbox",
|
||||
)
|
||||
create_newsletter(db_session, newsletter_data)
|
||||
|
||||
# Mock the return of _connect_to_imap to avoid a real IMAP connection
|
||||
mock_connect_to_imap.return_value = None
|
||||
|
||||
# 2. ACT
|
||||
process_emails(db_session)
|
||||
|
||||
# 3. ASSERT
|
||||
# Check that _connect_to_imap was called with the newsletter's specific folder
|
||||
mock_connect_to_imap.assert_called_once()
|
||||
call_args = mock_connect_to_imap.call_args[0]
|
||||
assert call_args[1] == "NewsletterInbox"
|
||||
|
||||
|
||||
@patch("app.services.email_processor._connect_to_imap")
|
||||
def test_process_emails_uses_global_search_folder(
|
||||
mock_connect_to_imap,
|
||||
db_session: Session,
|
||||
):
|
||||
"""Test that the global search_folder is used when the per-newsletter one is not set."""
|
||||
# 1. ARRANGE
|
||||
settings_data = SettingsCreate(
|
||||
imap_server="test.com",
|
||||
imap_username="test",
|
||||
imap_password="password",
|
||||
search_folder="GlobalInbox",
|
||||
)
|
||||
create_or_update_settings(db_session, settings_data)
|
||||
|
||||
newsletter_data = NewsletterCreate(
|
||||
name="Test Newsletter",
|
||||
sender_emails=["test@example.com"],
|
||||
search_folder=None, # Explicitly not set
|
||||
)
|
||||
create_newsletter(db_session, newsletter_data)
|
||||
|
||||
mock_connect_to_imap.return_value = None
|
||||
|
||||
# 2. ACT
|
||||
process_emails(db_session)
|
||||
|
||||
# 3. ASSERT
|
||||
mock_connect_to_imap.assert_called_once()
|
||||
call_args = mock_connect_to_imap.call_args[0]
|
||||
assert call_args[1] == "GlobalInbox"
|
||||
|
||||
|
||||
@patch("app.services.email_processor._extract_and_clean_html")
|
||||
def test_process_single_email_with_content_extraction(
|
||||
mock_extract_clean,
|
||||
|
||||
Reference in New Issue
Block a user