refactor: standardize modular architecture patterns
- Rename module definition variables to follow naming convention: - catalog/definition.py: module → catalog_module - checkout/definition.py: module → checkout_module - cart/definition.py: module → cart_module - Add router attachment functions for lazy loading: - get_catalog_module_with_routers() - get_checkout_module_with_routers() - get_cart_module_with_routers() - Move billing exceptions to exceptions.py: - Add backwards-compatible aliases (BillingServiceError, etc.) - Update billing_service.py to import from exceptions.py - Standardize VendorEmailSettingsService DI pattern: - Change from db in __init__ to db as method parameter - Create singleton vendor_email_settings_service instance - Update routes and tests to use new pattern Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,7 @@ from app.exceptions import (
|
||||
ResourceNotFoundException,
|
||||
ValidationException,
|
||||
)
|
||||
from app.modules.cms.services.vendor_email_settings_service import VendorEmailSettingsService
|
||||
from app.modules.cms.services.vendor_email_settings_service import vendor_email_settings_service
|
||||
from app.modules.messaging.models import VendorEmailSettings
|
||||
from app.modules.billing.models import TierCode
|
||||
|
||||
@@ -78,8 +78,7 @@ class TestVendorEmailSettingsRead:
|
||||
|
||||
def test_get_settings_exists(self, db, test_email_settings):
|
||||
"""Test getting settings when they exist."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
settings = service.get_settings(test_email_settings.vendor_id)
|
||||
settings = vendor_email_settings_service.get_settings(db, test_email_settings.vendor_id)
|
||||
|
||||
assert settings is not None
|
||||
assert settings.from_email == "test@example.com"
|
||||
@@ -87,46 +86,39 @@ class TestVendorEmailSettingsRead:
|
||||
|
||||
def test_get_settings_not_exists(self, db, test_vendor):
|
||||
"""Test getting settings when they don't exist."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
settings = service.get_settings(test_vendor.id)
|
||||
settings = vendor_email_settings_service.get_settings(db, test_vendor.id)
|
||||
|
||||
assert settings is None
|
||||
|
||||
def test_get_settings_or_404_exists(self, db, test_email_settings):
|
||||
"""Test get_settings_or_404 when settings exist."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
settings = service.get_settings_or_404(test_email_settings.vendor_id)
|
||||
settings = vendor_email_settings_service.get_settings_or_404(db, test_email_settings.vendor_id)
|
||||
|
||||
assert settings is not None
|
||||
assert settings.id == test_email_settings.id
|
||||
|
||||
def test_get_settings_or_404_not_exists(self, db, test_vendor):
|
||||
"""Test get_settings_or_404 raises exception when not found."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
|
||||
with pytest.raises(ResourceNotFoundException) as exc:
|
||||
service.get_settings_or_404(test_vendor.id)
|
||||
vendor_email_settings_service.get_settings_or_404(db, test_vendor.id)
|
||||
|
||||
assert "vendor_email_settings" in str(exc.value)
|
||||
|
||||
def test_is_configured_true(self, db, test_email_settings):
|
||||
"""Test is_configured returns True for configured settings."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
result = service.is_configured(test_email_settings.vendor_id)
|
||||
result = vendor_email_settings_service.is_configured(db, test_email_settings.vendor_id)
|
||||
|
||||
assert result is True
|
||||
|
||||
def test_is_configured_false_not_exists(self, db, test_vendor):
|
||||
"""Test is_configured returns False when settings don't exist."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
result = service.is_configured(test_vendor.id)
|
||||
result = vendor_email_settings_service.is_configured(db, test_vendor.id)
|
||||
|
||||
assert result is False
|
||||
|
||||
def test_get_status_configured(self, db, test_email_settings):
|
||||
"""Test get_status for configured settings."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
status = service.get_status(test_email_settings.vendor_id)
|
||||
status = vendor_email_settings_service.get_status(db, test_email_settings.vendor_id)
|
||||
|
||||
assert status["is_configured"] is True
|
||||
assert status["is_verified"] is False
|
||||
@@ -135,8 +127,7 @@ class TestVendorEmailSettingsRead:
|
||||
|
||||
def test_get_status_not_configured(self, db, test_vendor):
|
||||
"""Test get_status when settings don't exist."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
status = service.get_status(test_vendor.id)
|
||||
status = vendor_email_settings_service.get_status(db, test_vendor.id)
|
||||
|
||||
assert status["is_configured"] is False
|
||||
assert status["is_verified"] is False
|
||||
@@ -155,8 +146,6 @@ class TestVendorEmailSettingsWrite:
|
||||
|
||||
def test_create_settings(self, db, test_vendor):
|
||||
"""Test creating new email settings."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
|
||||
data = {
|
||||
"from_email": "new@example.com",
|
||||
"from_name": "New Sender",
|
||||
@@ -167,7 +156,8 @@ class TestVendorEmailSettingsWrite:
|
||||
"smtp_password": "pass",
|
||||
}
|
||||
|
||||
settings = service.create_or_update(
|
||||
settings = vendor_email_settings_service.create_or_update(
|
||||
db=db,
|
||||
vendor_id=test_vendor.id,
|
||||
data=data,
|
||||
current_tier=TierCode.ESSENTIAL,
|
||||
@@ -179,14 +169,13 @@ class TestVendorEmailSettingsWrite:
|
||||
|
||||
def test_update_existing_settings(self, db, test_email_settings):
|
||||
"""Test updating existing settings."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
|
||||
data = {
|
||||
"from_email": "updated@example.com",
|
||||
"from_name": "Updated Sender",
|
||||
}
|
||||
|
||||
settings = service.create_or_update(
|
||||
settings = vendor_email_settings_service.create_or_update(
|
||||
db=db,
|
||||
vendor_id=test_email_settings.vendor_id,
|
||||
data=data,
|
||||
current_tier=TierCode.ESSENTIAL,
|
||||
@@ -199,8 +188,6 @@ class TestVendorEmailSettingsWrite:
|
||||
|
||||
def test_premium_provider_requires_business_tier(self, db, test_vendor):
|
||||
"""Test that premium providers require Business tier."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
|
||||
data = {
|
||||
"from_email": "test@example.com",
|
||||
"from_name": "Test",
|
||||
@@ -209,7 +196,8 @@ class TestVendorEmailSettingsWrite:
|
||||
}
|
||||
|
||||
with pytest.raises(AuthorizationException) as exc:
|
||||
service.create_or_update(
|
||||
vendor_email_settings_service.create_or_update(
|
||||
db=db,
|
||||
vendor_id=test_vendor.id,
|
||||
data=data,
|
||||
current_tier=TierCode.ESSENTIAL,
|
||||
@@ -219,8 +207,6 @@ class TestVendorEmailSettingsWrite:
|
||||
|
||||
def test_premium_provider_allowed_for_business(self, db, test_vendor):
|
||||
"""Test that premium providers work with Business tier."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
|
||||
data = {
|
||||
"from_email": "test@example.com",
|
||||
"from_name": "Test",
|
||||
@@ -228,7 +214,8 @@ class TestVendorEmailSettingsWrite:
|
||||
"sendgrid_api_key": "test-key",
|
||||
}
|
||||
|
||||
settings = service.create_or_update(
|
||||
settings = vendor_email_settings_service.create_or_update(
|
||||
db=db,
|
||||
vendor_id=test_vendor.id,
|
||||
data=data,
|
||||
current_tier=TierCode.BUSINESS,
|
||||
@@ -238,13 +225,12 @@ class TestVendorEmailSettingsWrite:
|
||||
|
||||
def test_provider_change_resets_verification(self, db, test_verified_email_settings):
|
||||
"""Test that changing provider resets verification status."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
|
||||
assert test_verified_email_settings.is_verified is True
|
||||
|
||||
data = {"smtp_host": "new-smtp.example.com"}
|
||||
|
||||
settings = service.create_or_update(
|
||||
settings = vendor_email_settings_service.create_or_update(
|
||||
db=db,
|
||||
vendor_id=test_verified_email_settings.vendor_id,
|
||||
data=data,
|
||||
current_tier=TierCode.ESSENTIAL,
|
||||
@@ -254,22 +240,19 @@ class TestVendorEmailSettingsWrite:
|
||||
|
||||
def test_delete_settings(self, db, test_email_settings):
|
||||
"""Test deleting email settings."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
vendor_id = test_email_settings.vendor_id
|
||||
|
||||
service.delete(vendor_id)
|
||||
vendor_email_settings_service.delete(db, vendor_id)
|
||||
db.commit()
|
||||
|
||||
# Verify deletion
|
||||
settings = service.get_settings(vendor_id)
|
||||
settings = vendor_email_settings_service.get_settings(db, vendor_id)
|
||||
assert settings is None
|
||||
|
||||
def test_delete_settings_not_found(self, db, test_vendor):
|
||||
"""Test deleting non-existent settings raises exception."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
|
||||
with pytest.raises(ResourceNotFoundException):
|
||||
service.delete(test_vendor.id)
|
||||
vendor_email_settings_service.delete(db, test_vendor.id)
|
||||
|
||||
|
||||
# =============================================================================
|
||||
@@ -284,10 +267,8 @@ class TestVendorEmailSettingsVerification:
|
||||
|
||||
def test_verify_settings_not_configured(self, db, test_vendor):
|
||||
"""Test verification fails for non-existent settings."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
|
||||
with pytest.raises(ResourceNotFoundException):
|
||||
service.verify_settings(test_vendor.id, "test@example.com")
|
||||
vendor_email_settings_service.verify_settings(db, test_vendor.id, "test@example.com")
|
||||
|
||||
def test_verify_settings_incomplete(self, db, test_vendor):
|
||||
"""Test verification fails for incomplete settings."""
|
||||
@@ -303,10 +284,8 @@ class TestVendorEmailSettingsVerification:
|
||||
db.add(settings)
|
||||
db.commit()
|
||||
|
||||
service = VendorEmailSettingsService(db)
|
||||
|
||||
with pytest.raises(ValidationException) as exc:
|
||||
service.verify_settings(test_vendor.id, "test@example.com")
|
||||
vendor_email_settings_service.verify_settings(db, test_vendor.id, "test@example.com")
|
||||
|
||||
assert "incomplete" in str(exc.value).lower()
|
||||
|
||||
@@ -317,8 +296,8 @@ class TestVendorEmailSettingsVerification:
|
||||
mock_server = MagicMock()
|
||||
mock_smtp.return_value = mock_server
|
||||
|
||||
service = VendorEmailSettingsService(db)
|
||||
result = service.verify_settings(
|
||||
result = vendor_email_settings_service.verify_settings(
|
||||
db,
|
||||
test_email_settings.vendor_id,
|
||||
"recipient@example.com",
|
||||
)
|
||||
@@ -332,8 +311,8 @@ class TestVendorEmailSettingsVerification:
|
||||
# Mock SMTP error
|
||||
mock_smtp.side_effect = Exception("Connection refused")
|
||||
|
||||
service = VendorEmailSettingsService(db)
|
||||
result = service.verify_settings(
|
||||
result = vendor_email_settings_service.verify_settings(
|
||||
db,
|
||||
test_email_settings.vendor_id,
|
||||
"recipient@example.com",
|
||||
)
|
||||
@@ -354,8 +333,7 @@ class TestVendorEmailProvidersAvailability:
|
||||
|
||||
def test_get_providers_essential_tier(self, db):
|
||||
"""Test available providers for Essential tier."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
providers = service.get_available_providers(TierCode.ESSENTIAL)
|
||||
providers = vendor_email_settings_service.get_available_providers(TierCode.ESSENTIAL)
|
||||
|
||||
# Find SMTP provider
|
||||
smtp = next((p for p in providers if p["code"] == "smtp"), None)
|
||||
@@ -369,8 +347,7 @@ class TestVendorEmailProvidersAvailability:
|
||||
|
||||
def test_get_providers_business_tier(self, db):
|
||||
"""Test available providers for Business tier."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
providers = service.get_available_providers(TierCode.BUSINESS)
|
||||
providers = vendor_email_settings_service.get_available_providers(TierCode.BUSINESS)
|
||||
|
||||
# All providers should be available
|
||||
for provider in providers:
|
||||
@@ -378,8 +355,7 @@ class TestVendorEmailProvidersAvailability:
|
||||
|
||||
def test_get_providers_no_tier(self, db):
|
||||
"""Test available providers with no subscription."""
|
||||
service = VendorEmailSettingsService(db)
|
||||
providers = service.get_available_providers(None)
|
||||
providers = vendor_email_settings_service.get_available_providers(None)
|
||||
|
||||
# Only SMTP should be available
|
||||
smtp = next((p for p in providers if p["code"] == "smtp"), None)
|
||||
|
||||
Reference in New Issue
Block a user