Spaces:
Running
Running
| """ | |
| Tests for send_workspace_invite_email — issue #442. | |
| """ | |
| from unittest.mock import call, patch | |
| import pytest | |
| from app.email_service import send_workspace_invite_email | |
| WORKSPACE = "Research Team" | |
| INVITE_LINK = "http://localhost:3000/invite?token=abc123" | |
| EXPIRES = 72 | |
| RECIPIENT = "newuser@example.com" | |
| class TestSendWorkspaceInviteEmail: | |
| def test_delegates_to_send_email(self): | |
| """send_workspace_invite_email must call send_email exactly once.""" | |
| with patch("app.email_service.send_email") as mock_send: | |
| send_workspace_invite_email( | |
| to=RECIPIENT, | |
| workspace_name=WORKSPACE, | |
| invite_link=INVITE_LINK, | |
| expires_in_hours=EXPIRES, | |
| ) | |
| mock_send.assert_called_once() | |
| def test_subject_contains_workspace_name(self): | |
| with patch("app.email_service.send_email") as mock_send: | |
| send_workspace_invite_email( | |
| to=RECIPIENT, | |
| workspace_name=WORKSPACE, | |
| invite_link=INVITE_LINK, | |
| expires_in_hours=EXPIRES, | |
| ) | |
| _to, subject, _body = mock_send.call_args.args | |
| assert WORKSPACE in subject | |
| def test_html_body_contains_invite_link(self): | |
| with patch("app.email_service.send_email") as mock_send: | |
| send_workspace_invite_email( | |
| to=RECIPIENT, | |
| workspace_name=WORKSPACE, | |
| invite_link=INVITE_LINK, | |
| expires_in_hours=EXPIRES, | |
| ) | |
| html = mock_send.call_args.kwargs.get("html") or "" | |
| assert INVITE_LINK in html | |
| def test_html_body_contains_workspace_name(self): | |
| with patch("app.email_service.send_email") as mock_send: | |
| send_workspace_invite_email( | |
| to=RECIPIENT, | |
| workspace_name=WORKSPACE, | |
| invite_link=INVITE_LINK, | |
| expires_in_hours=EXPIRES, | |
| ) | |
| html = mock_send.call_args.kwargs.get("html") or "" | |
| assert WORKSPACE in html | |
| def test_html_body_contains_expiry(self): | |
| with patch("app.email_service.send_email") as mock_send: | |
| send_workspace_invite_email( | |
| to=RECIPIENT, | |
| workspace_name=WORKSPACE, | |
| invite_link=INVITE_LINK, | |
| expires_in_hours=EXPIRES, | |
| ) | |
| html = mock_send.call_args.kwargs.get("html") or "" | |
| assert str(EXPIRES) in html | |
| def test_personal_message_included_in_html(self): | |
| message = "Looking forward to working with you!" | |
| with patch("app.email_service.send_email") as mock_send: | |
| send_workspace_invite_email( | |
| to=RECIPIENT, | |
| workspace_name=WORKSPACE, | |
| invite_link=INVITE_LINK, | |
| expires_in_hours=EXPIRES, | |
| personal_message=message, | |
| ) | |
| html = mock_send.call_args.kwargs.get("html") or "" | |
| assert message in html | |
| def test_no_personal_message_omits_block(self): | |
| """Without a personal_message the optional block must not appear.""" | |
| with patch("app.email_service.send_email") as mock_send: | |
| send_workspace_invite_email( | |
| to=RECIPIENT, | |
| workspace_name=WORKSPACE, | |
| invite_link=INVITE_LINK, | |
| expires_in_hours=EXPIRES, | |
| personal_message=None, | |
| ) | |
| html = mock_send.call_args.kwargs.get("html") or "" | |
| # The placeholder block rendered for None should be empty / absent | |
| assert "border-left:4px solid #4f46e5" not in html | |
| def test_plain_text_body_contains_invite_link(self): | |
| with patch("app.email_service.send_email") as mock_send: | |
| send_workspace_invite_email( | |
| to=RECIPIENT, | |
| workspace_name=WORKSPACE, | |
| invite_link=INVITE_LINK, | |
| expires_in_hours=EXPIRES, | |
| ) | |
| _to, _subject, plain_body = mock_send.call_args.args | |
| assert INVITE_LINK in plain_body | |
| def test_recipient_passed_to_send_email(self): | |
| with patch("app.email_service.send_email") as mock_send: | |
| send_workspace_invite_email( | |
| to=RECIPIENT, | |
| workspace_name=WORKSPACE, | |
| invite_link=INVITE_LINK, | |
| expires_in_hours=EXPIRES, | |
| ) | |
| to_arg = mock_send.call_args.args[0] | |
| assert to_arg == RECIPIENT | |