|
|
|
|
|
import pytest |
|
|
from unittest.mock import Mock, AsyncMock |
|
|
from pathlib import Path |
|
|
from agents.compliance import Compliance |
|
|
from app.schema import Prospect, Company, Contact |
|
|
|
|
|
@pytest.mark.asyncio |
|
|
async def test_footer_insertion(): |
|
|
"""Test that compliance agent inserts footer""" |
|
|
|
|
|
mock_mcp = Mock() |
|
|
mock_store = AsyncMock() |
|
|
mock_mcp.get_store_client.return_value = mock_store |
|
|
mock_store.check_suppression.return_value = False |
|
|
mock_store.save_prospect.return_value = None |
|
|
|
|
|
company = Company( |
|
|
id="test", |
|
|
name="Test Co", |
|
|
domain="test.com", |
|
|
industry="SaaS", |
|
|
size=100, |
|
|
pains=[] |
|
|
) |
|
|
|
|
|
prospect = Prospect( |
|
|
id="test-prospect", |
|
|
company=company, |
|
|
status="drafted", |
|
|
email_draft={ |
|
|
"subject": "Test Subject", |
|
|
"body": "This is a test email body." |
|
|
}, |
|
|
contacts=[ |
|
|
Contact( |
|
|
id="c1", |
|
|
name="Test Contact", |
|
|
email="test@test.com", |
|
|
title="CEO", |
|
|
prospect_id="test-prospect" |
|
|
) |
|
|
] |
|
|
) |
|
|
|
|
|
compliance = Compliance(mock_mcp) |
|
|
result = await compliance.run(prospect) |
|
|
|
|
|
|
|
|
assert "Lucidya Inc." in result.email_draft["body"] |
|
|
assert "unsubscribe" in result.email_draft["body"].lower() |
|
|
assert result.status == "compliant" |
|
|
|
|
|
@pytest.mark.asyncio |
|
|
async def test_suppression_enforcement(): |
|
|
"""Test that suppressed emails are blocked""" |
|
|
|
|
|
mock_mcp = Mock() |
|
|
mock_store = AsyncMock() |
|
|
mock_mcp.get_store_client.return_value = mock_store |
|
|
|
|
|
|
|
|
mock_store.check_suppression.side_effect = lambda type, value: ( |
|
|
True if type == "email" and value == "blocked@test.com" else False |
|
|
) |
|
|
mock_store.save_prospect.return_value = None |
|
|
|
|
|
company = Company( |
|
|
id="test", |
|
|
name="Test Co", |
|
|
domain="test.com", |
|
|
industry="SaaS", |
|
|
size=100, |
|
|
pains=[] |
|
|
) |
|
|
|
|
|
prospect = Prospect( |
|
|
id="test-prospect", |
|
|
company=company, |
|
|
status="drafted", |
|
|
email_draft={ |
|
|
"subject": "Test", |
|
|
"body": "Test body" |
|
|
}, |
|
|
contacts=[ |
|
|
Contact( |
|
|
id="c1", |
|
|
name="Blocked Contact", |
|
|
email="blocked@test.com", |
|
|
title="CEO", |
|
|
prospect_id="test-prospect" |
|
|
) |
|
|
] |
|
|
) |
|
|
|
|
|
compliance = Compliance(mock_mcp) |
|
|
result = await compliance.run(prospect) |
|
|
|
|
|
|
|
|
assert result.status == "blocked" |
|
|
assert "suppressed" in result.dropped_reason.lower() |
|
|
|
|
|
@pytest.mark.asyncio |
|
|
async def test_unverifiable_claims_blocking(): |
|
|
"""Test that unverifiable claims are caught""" |
|
|
|
|
|
mock_mcp = Mock() |
|
|
mock_store = AsyncMock() |
|
|
mock_mcp.get_store_client.return_value = mock_store |
|
|
mock_store.check_suppression.return_value = False |
|
|
mock_store.save_prospect.return_value = None |
|
|
|
|
|
company = Company( |
|
|
id="test", |
|
|
name="Test Co", |
|
|
domain="test.com", |
|
|
industry="SaaS", |
|
|
size=100, |
|
|
pains=[] |
|
|
) |
|
|
|
|
|
prospect = Prospect( |
|
|
id="test-prospect", |
|
|
company=company, |
|
|
status="drafted", |
|
|
email_draft={ |
|
|
"subject": "Guaranteed Results", |
|
|
"body": "We guarantee 100% improvement with no risk!" |
|
|
}, |
|
|
contacts=[ |
|
|
Contact( |
|
|
id="c1", |
|
|
name="Test", |
|
|
email="test@test.com", |
|
|
title="CEO", |
|
|
prospect_id="test-prospect" |
|
|
) |
|
|
] |
|
|
) |
|
|
|
|
|
compliance = Compliance(mock_mcp) |
|
|
result = await compliance.run(prospect) |
|
|
|
|
|
|
|
|
assert result.status == "blocked" |
|
|
assert "guaranteed" in result.dropped_reason.lower() or "100%" in result.dropped_reason.lower() |