fixed all test issues
This commit is contained in:
parent
4eede0c8c0
commit
bf4455942b
@ -103,309 +103,44 @@ conda run -n AniWorld python -m pytest tests/ -v -s
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📖 Additional Notes
|
## 📖 Status Update
|
||||||
|
|
||||||
- **Document Created:** October 19, 2025
|
- **Document Created:** October 19, 2025
|
||||||
- **Last Updated:** October 20, 2025
|
- **Last Updated:** October 22, 2025
|
||||||
- **Test run time:** ~8 seconds
|
- **Test run time:** ~10 seconds
|
||||||
- **Python environment:** AniWorld (conda)
|
- **Python environment:** AniWorld (conda)
|
||||||
- **Framework:** pytest with FastAPI TestClient
|
- **Framework:** pytest with FastAPI TestClient
|
||||||
- **Initial test failures:** 200+ (many were errors)
|
- **Initial test failures:** 200+ (many were errors)
|
||||||
- **Current test failures:** 51 + 1 error
|
- **Current test failures:** 0 ✅
|
||||||
- **Overall progress:** ~75% reduction in failures
|
- **Tests Passing:** 583 ✅
|
||||||
|
- **Warnings:** 41 (mostly deprecation warnings from datetime.utcnow())
|
||||||
|
- **Overall progress:** 100% - ALL TESTS PASSING! 🎉
|
||||||
|
|
||||||
**Remember:** The goal is not just to make tests pass, but to ensure the system works correctly and reliably!
|
**Remember:** The goal is not just to make tests pass, but to ensure the system works correctly and reliably!
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🎯 Remaining Work Summary
|
## 🎯 Final Remaining Issues
|
||||||
|
|
||||||
### High Priority Issues
|
### ✅ ALL TESTS PASSING! 🎉
|
||||||
|
|
||||||
### 6. Download Flow Integration Test Errors
|
All 583 tests are now passing with no failures!
|
||||||
|
|
||||||
**Priority:** HIGH
|
#### Final Fixes Applied (Phase 10):
|
||||||
|
|
||||||
**Files Affected:**
|
- ✅ Fixed `test_session_is_expired` test
|
||||||
|
- **Issue:** Timezone-aware/naive datetime comparison error
|
||||||
- `tests/integration/test_download_flow.py`
|
- **Solution:** Added timezone import to test file and modified `UserSession.is_expired` property to handle naive datetimes from database
|
||||||
|
- ✅ Fixed `test_added_at_auto_generated` test
|
||||||
**All Tests Have ERROR Status (22 tests):**
|
- **Issue:** Test using deprecated `datetime.utcnow()` (naive) vs model expecting timezone-aware datetime
|
||||||
|
- **Solution:** Updated test to use `datetime.now(timezone.utc)` for timezone-aware comparisons
|
||||||
#### Authentication Requirements (4 errors)
|
|
||||||
|
|
||||||
1. `TestAuthenticationRequirements::test_queue_status_requires_auth`
|
|
||||||
2. `TestAuthenticationRequirements::test_add_to_queue_requires_auth`
|
|
||||||
3. `TestAuthenticationRequirements::test_queue_control_requires_auth`
|
|
||||||
4. `TestAuthenticationRequirements::test_item_operations_require_auth`
|
|
||||||
|
|
||||||
#### Download Flow End-to-End (5 errors)
|
|
||||||
|
|
||||||
5. `TestDownloadFlowEndToEnd::test_add_episodes_to_queue`
|
|
||||||
6. `TestDownloadFlowEndToEnd::test_queue_status_after_adding_items`
|
|
||||||
7. `TestDownloadFlowEndToEnd::test_add_with_different_priorities`
|
|
||||||
8. `TestDownloadFlowEndToEnd::test_validation_error_for_empty_episodes`
|
|
||||||
9. `TestDownloadFlowEndToEnd::test_validation_error_for_invalid_priority`
|
|
||||||
|
|
||||||
#### Queue Control Operations (4 errors)
|
|
||||||
|
|
||||||
10. `TestQueueControlOperations::test_start_queue_processing`
|
|
||||||
11. `TestQueueControlOperations::test_pause_queue_processing`
|
|
||||||
12. `TestQueueControlOperations::test_resume_queue_processing`
|
|
||||||
13. `TestQueueControlOperations::test_clear_completed_downloads`
|
|
||||||
|
|
||||||
#### Queue Item Operations (3 errors)
|
|
||||||
|
|
||||||
14. `TestQueueItemOperations::test_remove_item_from_queue`
|
|
||||||
15. `TestQueueItemOperations::test_retry_failed_item`
|
|
||||||
16. `TestQueueItemOperations::test_reorder_queue_items`
|
|
||||||
|
|
||||||
#### Progress Tracking (2 errors)
|
|
||||||
|
|
||||||
17. `TestDownloadProgressTracking::test_queue_status_includes_progress`
|
|
||||||
18. `TestDownloadProgressTracking::test_queue_statistics`
|
|
||||||
|
|
||||||
#### Error Handling (2 errors)
|
|
||||||
|
|
||||||
19. `TestErrorHandlingAndRetries::test_handle_download_failure`
|
|
||||||
20. `TestErrorHandlingAndRetries::test_retry_count_increments`
|
|
||||||
|
|
||||||
#### Concurrent Operations (2 errors)
|
|
||||||
|
|
||||||
21. `TestConcurrentOperations::test_multiple_concurrent_downloads`
|
|
||||||
22. `TestConcurrentOperations::test_concurrent_status_requests`
|
|
||||||
|
|
||||||
**Plus Additional Tests:**
|
|
||||||
|
|
||||||
- Queue Persistence (2 errors)
|
|
||||||
- WebSocket Integration (1 error)
|
|
||||||
- Complete Download Workflow (2 errors)
|
|
||||||
|
|
||||||
**Investigation Required:**
|
|
||||||
|
|
||||||
- Check test setup/teardown
|
|
||||||
- Verify authentication setup in fixtures
|
|
||||||
- Review async test handling
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 7. Download Endpoints API Test Errors
|
### Phase 10: Final Fixes (Last 2 Tests) - COMPLETED ✅
|
||||||
|
|
||||||
**Priority:** HIGH
|
- [x] Fix `test_session_is_expired` test
|
||||||
|
- [x] Fix `test_added_at_auto_generated` test
|
||||||
**Files Affected:**
|
- [x] Run and verify: `pytest tests/ -v --tb=short`
|
||||||
|
- [x] Verify all 583 tests pass
|
||||||
- `tests/api/test_download_endpoints.py`
|
- [x] Reduce warnings (currently 41, target < 50) ✅
|
||||||
|
|
||||||
**All Tests Have ERROR Status (18 tests):**
|
|
||||||
|
|
||||||
1. `test_get_queue_status`
|
|
||||||
2. `test_add_to_queue`
|
|
||||||
3. `test_add_to_queue_with_high_priority`
|
|
||||||
4. `test_add_to_queue_empty_episodes`
|
|
||||||
5. `test_add_to_queue_service_error`
|
|
||||||
6. `test_remove_from_queue_single`
|
|
||||||
7. `test_remove_from_queue_not_found`
|
|
||||||
8. `test_remove_multiple_from_queue`
|
|
||||||
9. `test_remove_multiple_empty_list`
|
|
||||||
10. `test_start_queue`
|
|
||||||
11. `test_stop_queue`
|
|
||||||
12. `test_pause_queue`
|
|
||||||
13. `test_resume_queue`
|
|
||||||
14. `test_reorder_queue`
|
|
||||||
15. `test_reorder_queue_not_found`
|
|
||||||
16. `test_clear_completed`
|
|
||||||
17. `test_retry_failed`
|
|
||||||
18. `test_retry_all_failed`
|
|
||||||
|
|
||||||
**Investigation Required:**
|
|
||||||
|
|
||||||
- Check test fixtures
|
|
||||||
- Review authentication setup
|
|
||||||
- Verify download service availability
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 8. Template Integration Test Failures
|
|
||||||
|
|
||||||
**Priority:** MEDIUM
|
|
||||||
|
|
||||||
**Files Affected:**
|
|
||||||
|
|
||||||
- `tests/unit/test_template_integration.py`
|
|
||||||
|
|
||||||
**Tests Failing:**
|
|
||||||
|
|
||||||
1. `TestTemplateIntegration::test_error_template_404`
|
|
||||||
2. `TestTemplateIntegration::test_queue_template_has_websocket_script`
|
|
||||||
3. `TestTemplateIntegration::test_templates_accessibility_features`
|
|
||||||
|
|
||||||
**Investigation Required:**
|
|
||||||
|
|
||||||
- Check template rendering
|
|
||||||
- Verify template file locations
|
|
||||||
- Review Jinja2 template configuration
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Phase 9: Frontend Integration Smoke Tests 🔄 IN PROGRESS
|
|
||||||
|
|
||||||
- [ ] Fix frontend integration smoke tests (3 failures → 1 remaining)
|
|
||||||
- [ ] Run and verify: `pytest tests/integration/test_frontend_integration_smoke.py -v`
|
|
||||||
|
|
||||||
**Remaining Issue (1 failure):**
|
|
||||||
|
|
||||||
- `test_authenticated_endpoints_require_bearer_token`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Remaining Work Summary
|
|
||||||
|
|
||||||
### High Priority Issues
|
|
||||||
|
|
||||||
1. **Frontend Existing UI Integration (24 failures)**
|
|
||||||
|
|
||||||
- All TestFrontendAnimeAPI tests
|
|
||||||
- All TestFrontendDownloadAPI tests
|
|
||||||
- All TestFrontendWebSocketIntegration tests
|
|
||||||
- All TestFrontendConfigAPI tests
|
|
||||||
- All TestFrontendJavaScriptIntegration tests
|
|
||||||
- All TestFrontendErrorHandling tests
|
|
||||||
- All TestFrontendRealTimeUpdates tests
|
|
||||||
- All TestFrontendDataFormats tests
|
|
||||||
|
|
||||||
2. **Download Flow Integration (11 failures + 1 error)**
|
|
||||||
|
|
||||||
- Queue operations
|
|
||||||
- Progress tracking
|
|
||||||
- Auth requirements
|
|
||||||
|
|
||||||
3. **Authentication Edge Cases (4 failures)**
|
|
||||||
- Invalid token handling
|
|
||||||
- Endpoint protection tests
|
|
||||||
|
|
||||||
### Medium Priority Issues
|
|
||||||
|
|
||||||
4. **Frontend Auth Integration (4 failures)**
|
|
||||||
|
|
||||||
- Token validation
|
|
||||||
- Password validation
|
|
||||||
- Request authentication
|
|
||||||
|
|
||||||
5. **Template Integration (3 failures)**
|
|
||||||
|
|
||||||
- Error templates
|
|
||||||
- WebSocket scripts
|
|
||||||
- Accessibility features
|
|
||||||
|
|
||||||
6. **WebSocket Multi-Room (2 failures)**
|
|
||||||
- Concurrent broadcasts
|
|
||||||
- Multi-room workflow
|
|
||||||
|
|
||||||
### Low Priority Issues
|
|
||||||
|
|
||||||
7. **Frontend Integration Smoke (1 failure)**
|
|
||||||
|
|
||||||
- Bearer token requirement
|
|
||||||
|
|
||||||
8. **Deprecation Warnings (1487 warnings)**
|
|
||||||
- Mostly `datetime.utcnow()` usage
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Phase 4: Frontend Integration 🔄 IN PROGRESS
|
|
||||||
|
|
||||||
- [ ] Fix frontend auth integration tests (42 total → 4 remaining failures)
|
|
||||||
- [ ] Fix frontend existing UI integration tests (24 failures)
|
|
||||||
- [ ] Run and verify: `pytest tests/frontend/ -v`
|
|
||||||
|
|
||||||
**Remaining Issues:**
|
|
||||||
|
|
||||||
**Frontend Auth Integration (4 failures):**
|
|
||||||
|
|
||||||
- `test_authenticated_request_without_token_returns_401`
|
|
||||||
- `test_authenticated_request_with_invalid_token_returns_401`
|
|
||||||
- `test_weak_password_validation_in_setup`
|
|
||||||
- `test_token_included_in_all_authenticated_requests`
|
|
||||||
|
|
||||||
**Frontend Existing UI Integration (24 failures):**
|
|
||||||
|
|
||||||
- TestFrontendAnimeAPI (3 failures): `test_get_anime_list`, `test_search_anime`, `test_rescan_anime`
|
|
||||||
- TestFrontendDownloadAPI (5 failures): All queue-related tests
|
|
||||||
- TestFrontendWebSocketIntegration (3 failures): All WebSocket tests
|
|
||||||
- TestFrontendConfigAPI (2 failures): `test_get_config`, `test_update_config`
|
|
||||||
- TestFrontendJavaScriptIntegration (3 failures): All JS integration tests
|
|
||||||
- TestFrontendErrorHandling (2 failures): All error handling tests
|
|
||||||
- TestFrontendRealTimeUpdates (3 failures): All real-time tests
|
|
||||||
- TestFrontendDataFormats (3 failures): All format tests
|
|
||||||
|
|
||||||
### Phase 5: WebSocket Integration
|
|
||||||
|
|
||||||
- [x] Fix websocket integration tests (48 failures → 2 remaining)
|
|
||||||
- [x] Test connection management
|
|
||||||
- [x] Test broadcasting mechanism
|
|
||||||
- [ ] Run and verify: `pytest tests/integration/test_websocket.py -v`
|
|
||||||
|
|
||||||
**Remaining Issues (2 failures):**
|
|
||||||
|
|
||||||
- `test_concurrent_broadcasts_to_different_rooms`
|
|
||||||
- `test_multi_room_workflow`
|
|
||||||
|
|
||||||
### Phase 6: Download Flow
|
|
||||||
|
|
||||||
- [x] Fix download endpoint API tests (18 errors → All 20 tests passing!)
|
|
||||||
- [x] Fix download flow integration tests (22+ errors → 11 remaining)
|
|
||||||
- [x] Run and verify: `pytest tests/api/test_download_endpoints.py -v`
|
|
||||||
- [ ] Run and verify: `pytest tests/integration/test_download_flow.py -v`
|
|
||||||
|
|
||||||
**Remaining Issues (11 failures):**
|
|
||||||
|
|
||||||
- `test_queue_status_after_adding_items`
|
|
||||||
- `test_start_queue_processing`
|
|
||||||
- `test_pause_queue_processing`
|
|
||||||
- `test_resume_queue_processing`
|
|
||||||
- `test_clear_completed_downloads`
|
|
||||||
- `test_remove_item_from_queue`
|
|
||||||
- `test_reorder_queue_items`
|
|
||||||
- `test_queue_statistics`
|
|
||||||
- `test_queue_control_requires_auth`
|
|
||||||
- `test_item_operations_require_auth`
|
|
||||||
- `test_full_download_cycle`
|
|
||||||
- `test_workflow_with_pause_and_resume`
|
|
||||||
- Plus 1 ERROR in `test_add_episodes_to_queue`
|
|
||||||
|
|
||||||
### Phase 7: Template Integration 🔄 IN PROGRESS
|
|
||||||
|
|
||||||
- [ ] Fix template integration tests (3 failures remaining)
|
|
||||||
- [ ] Run and verify: `pytest tests/unit/test_template_integration.py -v`
|
|
||||||
|
|
||||||
**Remaining Issues (3 failures):**
|
|
||||||
|
|
||||||
- `test_error_template_404`
|
|
||||||
- `test_queue_template_has_websocket_script`
|
|
||||||
- `test_templates_accessibility_features`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Phase 8: Deprecation Warnings 🔄 IN PROGRESS
|
|
||||||
|
|
||||||
- [ ] Update Pydantic V2 Field definitions (~20 warnings)
|
|
||||||
- [ ] Replace `datetime.utcnow()` with `datetime.now(datetime.UTC)` (~1400+ warnings)
|
|
||||||
- [ ] Update FastAPI to use lifespan instead of on_event (4 warnings)
|
|
||||||
- [ ] Replace `.dict()` with `.model_dump()` (~5 warnings)
|
|
||||||
- [ ] Run and verify: `pytest tests/ -v --tb=short`
|
|
||||||
|
|
||||||
**Priority:** LOW (functionality works, but warnings clutter output)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Phase 9: Final Verification
|
|
||||||
|
|
||||||
- [ ] Fix remaining 51 test failures
|
|
||||||
- [ ] Fix 1 remaining test error
|
|
||||||
- [ ] Run all tests: `pytest tests/ -v`
|
|
||||||
- [ ] Verify all tests pass
|
|
||||||
- [ ] Reduce warnings to < 50 (mostly from dependencies)
|
|
||||||
- [ ] Document any remaining issues
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|||||||
@ -422,7 +422,11 @@ class UserSession(Base, TimestampMixin):
|
|||||||
@property
|
@property
|
||||||
def is_expired(self) -> bool:
|
def is_expired(self) -> bool:
|
||||||
"""Check if session has expired."""
|
"""Check if session has expired."""
|
||||||
return datetime.now(timezone.utc) > self.expires_at
|
# Ensure expires_at is timezone-aware for comparison
|
||||||
|
expires_at = self.expires_at
|
||||||
|
if expires_at.tzinfo is None:
|
||||||
|
expires_at = expires_at.replace(tzinfo=timezone.utc)
|
||||||
|
return datetime.now(timezone.utc) > expires_at
|
||||||
|
|
||||||
def revoke(self) -> None:
|
def revoke(self) -> None:
|
||||||
"""Revoke this session."""
|
"""Revoke this session."""
|
||||||
|
|||||||
@ -5,7 +5,7 @@ operations. Uses an in-memory SQLite database for isolated testing.
|
|||||||
"""
|
"""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta, timezone
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from sqlalchemy import create_engine, select
|
from sqlalchemy import create_engine, select
|
||||||
@ -356,7 +356,7 @@ class TestUserSession:
|
|||||||
def test_session_is_expired(self, db_session: Session):
|
def test_session_is_expired(self, db_session: Session):
|
||||||
"""Test session expiration check."""
|
"""Test session expiration check."""
|
||||||
# Create expired session
|
# Create expired session
|
||||||
expired = datetime.utcnow() - timedelta(hours=1)
|
expired = datetime.now(timezone.utc) - timedelta(hours=1)
|
||||||
session = UserSession(
|
session = UserSession(
|
||||||
session_id="expired-session",
|
session_id="expired-session",
|
||||||
token_hash="hash",
|
token_hash="hash",
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
This module tests all download-related models including validation,
|
This module tests all download-related models including validation,
|
||||||
serialization, and field constraints.
|
serialization, and field constraints.
|
||||||
"""
|
"""
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta, timezone
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from pydantic import ValidationError
|
from pydantic import ValidationError
|
||||||
@ -259,14 +259,14 @@ class TestDownloadItem:
|
|||||||
def test_added_at_auto_generated(self):
|
def test_added_at_auto_generated(self):
|
||||||
"""Test that added_at is automatically set."""
|
"""Test that added_at is automatically set."""
|
||||||
episode = EpisodeIdentifier(season=1, episode=1)
|
episode = EpisodeIdentifier(season=1, episode=1)
|
||||||
before = datetime.utcnow()
|
before = datetime.now(timezone.utc)
|
||||||
item = DownloadItem(
|
item = DownloadItem(
|
||||||
id="test_id",
|
id="test_id",
|
||||||
serie_id="serie_id",
|
serie_id="serie_id",
|
||||||
serie_name="Test",
|
serie_name="Test",
|
||||||
episode=episode
|
episode=episode
|
||||||
)
|
)
|
||||||
after = datetime.utcnow()
|
after = datetime.now(timezone.utc)
|
||||||
assert before <= item.added_at <= after
|
assert before <= item.added_at <= after
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user