Skip to content

Commit 26c5c01

Browse files
committed
fix: use recipient_type in campaign filter payload
Prevent campaign recipient processing from crashing by mapping filter payload type from Recipient.recipient_type, and add a regression test to lock the behavior.
1 parent 0b60b88 commit 26c5c01

2 files changed

Lines changed: 36 additions & 1 deletion

File tree

app/services/campaign_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ def _apply_message_filters(self, message_text: str, recipient: Recipient) -> Opt
789789
"last_name": recipient.last_name,
790790
"username": recipient.username,
791791
"phone_number": recipient.phone_number,
792-
"type": recipient.type.value if recipient.type else None,
792+
"type": recipient.recipient_type.value if recipient.recipient_type else None,
793793
}
794794

795795
filtered_message = message_text

tests/unit/test_campaign_manager.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import pytest
88

9+
from app.core.plugin import MessageFilterPlugin, PluginMetadata, PluginType
910
from app.models import (
1011
Campaign,
1112
CampaignStatus,
@@ -139,3 +140,37 @@ def test_start_campaign_returns_false_when_cannot_start(self, campaign_manager):
139140
campaign = _create_campaign(total_recipients=0, status=CampaignStatus.DRAFT)
140141

141142
assert campaign_manager.start_campaign(campaign.id) is False
143+
144+
def test_apply_message_filters_uses_recipient_type(self, campaign_manager):
145+
recipient = _create_recipient(username="self_account")
146+
captured_recipient_data = {}
147+
148+
class CapturingFilterPlugin(MessageFilterPlugin):
149+
@property
150+
def metadata(self) -> PluginMetadata:
151+
return PluginMetadata(
152+
name="Capturing Filter",
153+
version="1.0.0",
154+
description="Captures recipient payload in tests",
155+
author="tests",
156+
plugin_type=PluginType.FILTER,
157+
)
158+
159+
def filter_message(self, message, recipient_data):
160+
captured_recipient_data.update(recipient_data)
161+
return message
162+
163+
plugin = CapturingFilterPlugin(api=MagicMock())
164+
plugin_info = MagicMock()
165+
plugin_info.metadata.name = "Capturing Filter"
166+
plugin_info.metadata.version = "1.0.0"
167+
168+
campaign_manager.plugin_manager.list_enabled_plugins = MagicMock(
169+
return_value=[plugin_info]
170+
)
171+
campaign_manager.plugin_manager.get_plugin = MagicMock(return_value=plugin)
172+
173+
filtered_message = campaign_manager._apply_message_filters("Hello", recipient)
174+
175+
assert filtered_message == "Hello"
176+
assert captured_recipient_data["type"] == RecipientType.USER.value

0 commit comments

Comments
 (0)