Merge pull request #172 from christianlouis/copilot/fix-deprecated-pydantic-methods
fix: replace deprecated Pydantic .dict() with .model_dump() and fix db.add() AsyncMock warnings
This commit is contained in:
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
<!-- version list -->
|
<!-- version list -->
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Replace deprecated Pydantic V2 `.dict()` calls with `.model_dump()` in `admin.py` and `notifications.py` endpoints.
|
||||||
|
- Fix `RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited` in `test_tasks.py` and `test_config_service.py` by marking `db.add` as a synchronous `MagicMock` in test helpers.
|
||||||
|
|
||||||
## v0.6.3 (2026-04-07)
|
## v0.6.3 (2026-04-07)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -322,7 +322,7 @@ async def create_admin_notification_config(
|
|||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
):
|
):
|
||||||
"""Create a new admin notification configuration (admin only)"""
|
"""Create a new admin notification configuration (admin only)"""
|
||||||
config = AdminNotificationConfig(**config_in.dict())
|
config = AdminNotificationConfig(**config_in.model_dump())
|
||||||
db.add(config)
|
db.add(config)
|
||||||
await db.commit()
|
await db.commit()
|
||||||
await db.refresh(config)
|
await db.refresh(config)
|
||||||
@@ -370,7 +370,7 @@ async def update_admin_notification_config(
|
|||||||
detail="Admin notification config not found",
|
detail="Admin notification config not found",
|
||||||
)
|
)
|
||||||
|
|
||||||
update_data = config_in.dict(exclude_unset=True)
|
update_data = config_in.model_dump(exclude_unset=True)
|
||||||
for field, value in update_data.items():
|
for field, value in update_data.items():
|
||||||
setattr(config, field, value)
|
setattr(config, field, value)
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ async def create_notification_config(
|
|||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
):
|
):
|
||||||
"""Create a new notification configuration"""
|
"""Create a new notification configuration"""
|
||||||
config = NotificationConfig(user_id=current_user.id, **config_in.dict())
|
config = NotificationConfig(user_id=current_user.id, **config_in.model_dump())
|
||||||
db.add(config)
|
db.add(config)
|
||||||
await db.commit()
|
await db.commit()
|
||||||
await db.refresh(config)
|
await db.refresh(config)
|
||||||
@@ -91,7 +91,7 @@ async def update_notification_config(
|
|||||||
detail="Notification config not found",
|
detail="Notification config not found",
|
||||||
)
|
)
|
||||||
|
|
||||||
update_data = config_in.dict(exclude_unset=True)
|
update_data = config_in.model_dump(exclude_unset=True)
|
||||||
for field, value in update_data.items():
|
for field, value in update_data.items():
|
||||||
setattr(config, field, value)
|
setattr(config, field, value)
|
||||||
|
|
||||||
|
|||||||
@@ -172,9 +172,8 @@ class TestConfigServiceSet:
|
|||||||
mock_result.scalar_one_or_none.return_value = None
|
mock_result.scalar_one_or_none.return_value = None
|
||||||
|
|
||||||
mock_db = AsyncMock()
|
mock_db = AsyncMock()
|
||||||
|
mock_db.add = MagicMock()
|
||||||
mock_db.execute.return_value = mock_result
|
mock_db.execute.return_value = mock_result
|
||||||
|
|
||||||
# The method will call db.add() and db.commit()
|
|
||||||
await ConfigService.set(
|
await ConfigService.set(
|
||||||
"SMTP_HOST", "new.host.com", db=mock_db, category="smtp"
|
"SMTP_HOST", "new.host.com", db=mock_db, category="smtp"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -77,6 +77,8 @@ def _mock_session_maker():
|
|||||||
is usable as ``async with session_maker_mock() as db:``.
|
is usable as ``async with session_maker_mock() as db:``.
|
||||||
"""
|
"""
|
||||||
session = AsyncMock()
|
session = AsyncMock()
|
||||||
|
# db.add() is synchronous in SQLAlchemy; prevent "coroutine never awaited" warnings
|
||||||
|
session.add = MagicMock()
|
||||||
|
|
||||||
# Make the session usable as an async context manager
|
# Make the session usable as an async context manager
|
||||||
ctx = AsyncMock()
|
ctx = AsyncMock()
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ Comprehensive task breakdown for repository improvements and production readines
|
|||||||
|
|
||||||
## ✅ Recently Completed
|
## ✅ Recently Completed
|
||||||
|
|
||||||
|
- [x] **Fix Pydantic V2 deprecation warnings**: Replaced `.dict()` with `.model_dump()` in `admin.py` and `notifications.py`. Fixed `RuntimeWarning: coroutine never awaited` for `db.add()` in test mocks (`test_tasks.py`, `test_config_service.py`).
|
||||||
|
|
||||||
- [x] **Expanded backend test coverage**: Added 150 new unit tests across 10 new test files, increasing the backend test count from 361 to 511. New coverage includes `core/gdpr.py`, `utils/gmail_labels.py`, `services/notification_service.py`, `services/auth_service.py`, and API endpoints for auth, users, notifications, processing-runs/logs, app-settings, and version.
|
- [x] **Expanded backend test coverage**: Added 150 new unit tests across 10 new test files, increasing the backend test count from 361 to 511. New coverage includes `core/gdpr.py`, `utils/gmail_labels.py`, `services/notification_service.py`, `services/auth_service.py`, and API endpoints for auth, users, notifications, processing-runs/logs, app-settings, and version.
|
||||||
|
|
||||||
- [x] **Improved test coverage for `mail_processor.py`**: Added 46 new unit tests covering POP3 connection testing, POP3 email fetching, IMAP edge cases, email forwarding (STARTTLS/SSL), and `fetch_emails`/`test_connection` routing. Coverage increased from ~42% to 98%.
|
- [x] **Improved test coverage for `mail_processor.py`**: Added 46 new unit tests covering POP3 connection testing, POP3 email fetching, IMAP edge cases, email forwarding (STARTTLS/SSL), and `fetch_emails`/`test_connection` routing. Coverage increased from ~42% to 98%.
|
||||||
|
|||||||
Reference in New Issue
Block a user