# tests/models/test_email_template.py import uuid import sqlalchemy from app.models.email_template import EmailTemplate, TemplateType def test_create_email_template(db_session, mock_user): # Arrange email_template = EmailTemplate( id=uuid.uuid4(), name="Reminder Template", description="A template for sending reminders.", template_type=TemplateType.REMINDER, subject="Reminder: {{event_name}} is happening soon!", html_content="
Don't miss it!
", text_content="Reminder: {{event_name}}. Don't miss it!", variables={"event_name": "Birthday Party"}, event_id=None, # Global template created_by=mock_user.id, is_active=True, is_system=False, ) db_session.add(email_template) # Act db_session.commit() created_template = db_session.query(EmailTemplate).filter_by(id=email_template.id).first() # Assert assert created_template is not None assert created_template.name == "Reminder Template" assert created_template.description == "A template for sending reminders." assert created_template.template_type == TemplateType.REMINDER assert created_template.subject == "Reminder: {{event_name}} is happening soon!" assert created_template.html_content == "Don't miss it!
" assert created_template.text_content == "Reminder: {{event_name}}. Don't miss it!" assert created_template.variables == {"event_name": "Birthday Party"} assert created_template.created_by == mock_user.id assert created_template.is_active is True assert created_template.is_system is False def test_render_email_template(email_template_fixture): # Arrange context = {"event_name": "Emma's 1st Birthday"} # Act rendered_subject, rendered_html, rendered_text = email_template_fixture.render(context) # Assert assert rendered_subject == "You're invited to Emma's 1st Birthday!" assert rendered_html == "We look forward to seeing you!
" assert rendered_text == "Welcome to Emma's 1st Birthday. We look forward to seeing you!" def test_unique_event_template_name_constraint(db_session, email_template_fixture, mock_user): # Arrange: Ensure both templates share the same event_id event_id = uuid.uuid4() email_template_fixture.event_id = event_id # Set the event_id for the existing fixture db_session.commit() # Attempt to create another template with the same name for the same event duplicate_template = EmailTemplate( id=uuid.uuid4(), name=email_template_fixture.name, description="Another template with the same name.", template_type=TemplateType.INVITATION, subject="Duplicate Subject", html_content="Duplicate Content
", text_content="Duplicate Content", variables={}, event_id=event_id, # Use the same event_id created_by=mock_user.id, is_active=True, is_system=False, ) db_session.add(duplicate_template) # Act & Assert try: db_session.commit() assert False, "Expected IntegrityError due to unique constraint on event-specific template names." except sqlalchemy.exc.IntegrityError as e: # Validate that the constraint error relates to `uq_event_template_name` assert "uq_event_template_name" in str(e.orig) or "email_templates.event_id, email_templates.name" in str( e.orig) def test_template_is_active_field(email_template_fixture): # Assert assert email_template_fixture.is_active is True # Deactivate the template email_template_fixture.is_active = False # Assert assert email_template_fixture.is_active is False def test_template_is_system_field(email_template_fixture): # Assert assert email_template_fixture.is_system is False # Promote to system template email_template_fixture.is_system = True # Assert assert email_template_fixture.is_system is True def test_repr_method(email_template_fixture): # Act repr_output = repr(email_template_fixture) # Assert assert repr_output == f"