mirror of
https://github.com/maziggy/bambuddy.git
synced 2026-09-30 19:21:33 +02:00
Add tests, docs, and ruff fixes for per-user email notifications - Fix missing timezone import in email_service.py (F821) - Fix unused lambda arg in main.py asyncio done_callback (ARG005) - Fix E302 blank line spacing for mark_printer_stopped_by_user - Fix F821/UP037 forward reference in user_email_pref model - Fix SettingsPage test for duplicate "Notifications" text - Add backend unit tests for permissions, schemas, and templates - Add backend integration tests for user-notifications API - Add frontend tests for NotificationsPage - Add user_email_pref model import to test conftest - Update CHANGELOG and README
124 lines
5.2 KiB
Python
124 lines
5.2 KiB
Python
"""Tests for user email notification preferences and permissions."""
|
|
|
|
from backend.app.core.permissions import (
|
|
ALL_PERMISSIONS,
|
|
DEFAULT_GROUPS,
|
|
PERMISSION_CATEGORIES,
|
|
Permission,
|
|
)
|
|
from backend.app.schemas.user_notifications import (
|
|
UserEmailPreferenceResponse,
|
|
UserEmailPreferenceUpdate,
|
|
)
|
|
|
|
|
|
class TestNotificationsUserEmailPermission:
|
|
"""Test the NOTIFICATIONS_USER_EMAIL permission integration."""
|
|
|
|
def test_permission_exists(self):
|
|
"""notifications:user_email permission should exist in the enum."""
|
|
assert hasattr(Permission, "NOTIFICATIONS_USER_EMAIL")
|
|
assert Permission.NOTIFICATIONS_USER_EMAIL == "notifications:user_email"
|
|
|
|
def test_permission_in_all_permissions(self):
|
|
"""notifications:user_email should be in ALL_PERMISSIONS list."""
|
|
assert "notifications:user_email" in ALL_PERMISSIONS
|
|
|
|
def test_permission_in_notifications_category(self):
|
|
"""notifications:user_email should be in the Notifications permission category."""
|
|
notifications_perms = PERMISSION_CATEGORIES["Notifications"]
|
|
assert Permission.NOTIFICATIONS_USER_EMAIL in notifications_perms
|
|
|
|
def test_administrators_have_permission(self):
|
|
"""Administrators should have notifications:user_email via ALL_PERMISSIONS."""
|
|
admins = DEFAULT_GROUPS["Administrators"]
|
|
assert "notifications:user_email" in admins["permissions"]
|
|
|
|
def test_operators_have_permission(self):
|
|
"""Operators should have notifications:user_email for managing their own preferences."""
|
|
operators = DEFAULT_GROUPS["Operators"]
|
|
assert "notifications:user_email" in operators["permissions"]
|
|
|
|
def test_viewers_do_not_have_permission(self):
|
|
"""Viewers (read-only) should not have notifications:user_email."""
|
|
viewers = DEFAULT_GROUPS["Viewers"]
|
|
assert "notifications:user_email" not in viewers["permissions"]
|
|
|
|
def test_permission_separate_from_notifications_read(self):
|
|
"""user_email and read should be distinct permissions."""
|
|
assert Permission.NOTIFICATIONS_USER_EMAIL != Permission.NOTIFICATIONS_READ
|
|
assert Permission.NOTIFICATIONS_USER_EMAIL.value != Permission.NOTIFICATIONS_READ.value
|
|
|
|
|
|
class TestUserEmailPreferenceSchemas:
|
|
"""Test the user email preference Pydantic schemas."""
|
|
|
|
def test_response_schema_defaults(self):
|
|
"""Response schema should accept all four boolean fields."""
|
|
resp = UserEmailPreferenceResponse(
|
|
notify_print_start=True,
|
|
notify_print_complete=True,
|
|
notify_print_failed=True,
|
|
notify_print_stopped=True,
|
|
)
|
|
assert resp.notify_print_start is True
|
|
assert resp.notify_print_complete is True
|
|
assert resp.notify_print_failed is True
|
|
assert resp.notify_print_stopped is True
|
|
|
|
def test_response_schema_all_disabled(self):
|
|
"""Response schema should handle all-disabled preferences."""
|
|
resp = UserEmailPreferenceResponse(
|
|
notify_print_start=False,
|
|
notify_print_complete=False,
|
|
notify_print_failed=False,
|
|
notify_print_stopped=False,
|
|
)
|
|
assert resp.notify_print_start is False
|
|
assert resp.notify_print_complete is False
|
|
assert resp.notify_print_failed is False
|
|
assert resp.notify_print_stopped is False
|
|
|
|
def test_update_schema_accepts_mixed(self):
|
|
"""Update schema should accept a mix of enabled/disabled."""
|
|
update = UserEmailPreferenceUpdate(
|
|
notify_print_start=True,
|
|
notify_print_complete=False,
|
|
notify_print_failed=True,
|
|
notify_print_stopped=False,
|
|
)
|
|
assert update.notify_print_start is True
|
|
assert update.notify_print_complete is False
|
|
assert update.notify_print_failed is True
|
|
assert update.notify_print_stopped is False
|
|
|
|
def test_response_schema_from_attributes(self):
|
|
"""Response schema should support from_attributes (ORM mode)."""
|
|
assert UserEmailPreferenceResponse.model_config.get("from_attributes") is True
|
|
|
|
|
|
class TestNotificationTemplateTypes:
|
|
"""Test that user print notification template types are registered."""
|
|
|
|
def test_user_print_template_types_exist(self):
|
|
"""All four user print email template types should be in EVENT_NAMES."""
|
|
from backend.app.api.routes.notification_templates import EVENT_NAMES
|
|
|
|
expected_types = [
|
|
"user_print_start",
|
|
"user_print_complete",
|
|
"user_print_failed",
|
|
"user_print_stopped",
|
|
]
|
|
for event_type in expected_types:
|
|
assert event_type in EVENT_NAMES, f"{event_type} not in EVENT_NAMES"
|
|
|
|
def test_user_print_template_display_names(self):
|
|
"""User print template display names should be descriptive."""
|
|
from backend.app.api.routes.notification_templates import EVENT_NAMES
|
|
|
|
assert EVENT_NAMES["user_print_start"] == "User Print Started Email"
|
|
assert EVENT_NAMES["user_print_complete"] == "User Print Completed Email"
|
|
assert EVENT_NAMES["user_print_failed"] == "User Print Failed Email"
|
|
assert EVENT_NAMES["user_print_stopped"] == "User Print Stopped Email"
|