This repository has been archived on 2026-02-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
breakpilot-pwa/backend/tests/test_email_service.py
BreakPilot Dev 19855efacc
Some checks failed
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
ci/woodpecker/manual/build-ci-image Pipeline was successful
ci/woodpecker/manual/main Pipeline failed
feat: BreakPilot PWA - Full codebase (clean push without large binaries)
All services: admin-v2, studio-v2, website, ai-compliance-sdk,
consent-service, klausur-service, voice-service, and infrastructure.
Large PDFs and compiled binaries excluded via .gitignore.
2026-02-11 13:25:58 +01:00

191 lines
6.5 KiB
Python

"""
Tests fuer den Email-Service.
Testet:
- EmailService Klasse
- SMTP Verbindung (mit Mock)
- Messenger-Benachrichtigungen
- Jitsi-Einladungen
"""
import pytest
from unittest.mock import patch, MagicMock
from email_service import EmailService, EmailResult
class TestEmailService:
"""Tests fuer die EmailService Klasse."""
def test_init_default_values(self):
"""Test: Service wird mit Default-Werten initialisiert."""
service = EmailService()
# Default ist 'mailpit' in Docker, 'localhost' lokal - beides akzeptieren
assert service.host in ("localhost", "mailpit")
assert service.port == 1025
# from_name kann "BreakPilot" oder "BreakPilot Dev" sein (dev environment)
assert service.from_name in ("BreakPilot", "BreakPilot Dev")
assert service.from_addr == "noreply@breakpilot.app"
def test_init_custom_values(self):
"""Test: Service wird mit benutzerdefinierten Werten initialisiert."""
service = EmailService(
host="smtp.example.com",
port=587,
username="user",
password="pass",
from_name="Custom",
from_addr="custom@example.com",
use_tls=True
)
assert service.host == "smtp.example.com"
assert service.port == 587
assert service.username == "user"
assert service.password == "pass"
assert service.from_name == "Custom"
assert service.from_addr == "custom@example.com"
assert service.use_tls is True
@patch('email_service.smtplib.SMTP')
def test_send_email_success(self, mock_smtp):
"""Test: Email wird erfolgreich gesendet."""
mock_instance = MagicMock()
mock_smtp.return_value.__enter__ = MagicMock(return_value=mock_instance)
mock_smtp.return_value.__exit__ = MagicMock(return_value=False)
service = EmailService()
result = service.send_email(
to_email="test@example.com",
subject="Test",
body_text="Test Body"
)
assert result.success is True
assert result.recipient == "test@example.com"
assert result.sent_at is not None
@patch('email_service.smtplib.SMTP')
def test_send_email_with_html(self, mock_smtp):
"""Test: Email mit HTML wird gesendet."""
mock_instance = MagicMock()
mock_smtp.return_value.__enter__ = MagicMock(return_value=mock_instance)
mock_smtp.return_value.__exit__ = MagicMock(return_value=False)
service = EmailService()
result = service.send_email(
to_email="test@example.com",
subject="Test",
body_text="Plain text",
body_html="<h1>HTML</h1>"
)
assert result.success is True
@patch('email_service.smtplib.SMTP')
def test_send_email_failure(self, mock_smtp):
"""Test: Fehler beim Email-Versand wird behandelt."""
import smtplib
mock_smtp.side_effect = smtplib.SMTPException("Connection failed")
service = EmailService()
result = service.send_email(
to_email="test@example.com",
subject="Test",
body_text="Test Body"
)
assert result.success is False
assert result.error is not None
assert "SMTP" in result.error
@patch('email_service.smtplib.SMTP')
def test_send_messenger_notification(self, mock_smtp):
"""Test: Messenger-Benachrichtigung wird gesendet."""
mock_instance = MagicMock()
mock_smtp.return_value.__enter__ = MagicMock(return_value=mock_instance)
mock_smtp.return_value.__exit__ = MagicMock(return_value=False)
service = EmailService()
result = service.send_messenger_notification(
to_email="parent@example.com",
to_name="Max Mustermann",
sender_name="Frau Lehrerin",
message_content="Bitte bringen Sie morgen das Buch mit."
)
assert result.success is True
assert result.recipient == "parent@example.com"
@patch('email_service.smtplib.SMTP')
def test_send_jitsi_invitation(self, mock_smtp):
"""Test: Jitsi-Einladung wird gesendet."""
mock_instance = MagicMock()
mock_smtp.return_value.__enter__ = MagicMock(return_value=mock_instance)
mock_smtp.return_value.__exit__ = MagicMock(return_value=False)
service = EmailService()
result = service.send_jitsi_invitation(
to_email="parent@example.com",
to_name="Max Mustermann",
organizer_name="Frau Lehrerin",
meeting_title="Elterngespraech",
meeting_date="20. Dezember 2024",
meeting_time="14:00 Uhr",
jitsi_url="https://meet.jit.si/BreakPilot-test123"
)
assert result.success is True
assert result.recipient == "parent@example.com"
@patch('email_service.smtplib.SMTP')
def test_send_jitsi_invitation_with_additional_info(self, mock_smtp):
"""Test: Jitsi-Einladung mit zusaetzlichen Infos wird gesendet."""
mock_instance = MagicMock()
mock_smtp.return_value.__enter__ = MagicMock(return_value=mock_instance)
mock_smtp.return_value.__exit__ = MagicMock(return_value=False)
service = EmailService()
result = service.send_jitsi_invitation(
to_email="parent@example.com",
to_name="Max Mustermann",
organizer_name="Frau Lehrerin",
meeting_title="Elterngespraech",
meeting_date="20. Dezember 2024",
meeting_time="14:00 Uhr",
jitsi_url="https://meet.jit.si/BreakPilot-test123",
additional_info="Bitte bereiten Sie die Zeugnismappe vor."
)
assert result.success is True
class TestEmailResult:
"""Tests fuer das EmailResult Dataclass."""
def test_success_result(self):
"""Test: Erfolgreiche Email-Antwort."""
result = EmailResult(
success=True,
message_id="msg-123",
recipient="test@example.com",
sent_at="2024-12-18T10:00:00"
)
assert result.success is True
assert result.message_id == "msg-123"
assert result.error is None
def test_failure_result(self):
"""Test: Fehlgeschlagene Email-Antwort."""
result = EmailResult(
success=False,
error="Connection refused",
recipient="test@example.com"
)
assert result.success is False
assert result.error == "Connection refused"
assert result.sent_at is None