docs: Add comprehensive coverage report
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
# Test Coverage Report
|
||||
|
||||
## Summary
|
||||
|
||||
This PR increases test coverage for two files to meet the 90%+ target:
|
||||
|
||||
- **`app/api/url_upload.py`**: Increased from **80.22%** to **91.21%** ✅
|
||||
- **`app/views/files.py`**: Increased from **18.45%** to **90.61%** ✅
|
||||
|
||||
## Coverage Details
|
||||
|
||||
### app/api/url_upload.py (91.21% coverage)
|
||||
|
||||
**Previous Coverage**: 80.22% (138 statements, 20 missing, 44 branches, 12 partial)
|
||||
**New Coverage**: 91.21% (138 statements, 6 missing, 44 branches, 10 partial)
|
||||
|
||||
#### New Tests Added (10 tests):
|
||||
1. `test_process_url_request_exception` - Tests handling of generic RequestException
|
||||
2. `test_process_url_oserror_during_save` - Tests OSError when saving file to disk
|
||||
3. `test_process_url_unexpected_exception` - Tests handling of unexpected exceptions
|
||||
4. `test_process_url_filename_without_extension` - Tests files without extensions
|
||||
5. `test_process_url_empty_path_uses_download` - Tests default filename for URLs without path
|
||||
6. `test_validate_url_no_hostname` - Tests URL validation without hostname
|
||||
7. `test_validate_file_type_by_extension_fallback` - Tests file type validation by extension
|
||||
8. `test_is_private_ip_ipv6_loopback` - Tests IPv6 loopback detection
|
||||
9. `test_is_private_ip_link_local` - Tests link-local address detection
|
||||
10. `test_process_url_sanitizes_dangerous_filename` - Tests filename sanitization security
|
||||
|
||||
#### Coverage Improvements:
|
||||
- **Error handling**: Now covers all exception handlers (RequestException, OSError, unexpected exceptions)
|
||||
- **Edge cases**: Covers missing hostnames, empty paths, files without extensions
|
||||
- **Security**: IPv6 loopback, link-local addresses, dangerous filename sanitization
|
||||
- **File validation**: Extension-based fallback validation
|
||||
|
||||
### app/views/files.py (90.61% coverage)
|
||||
|
||||
**Previous Coverage**: 18.45% (225 statements, 173 missing, 84 branches, 3 partial)
|
||||
**New Coverage**: 90.61% (225 statements, 14 missing, 84 branches, 13 partial)
|
||||
|
||||
#### New Tests Added (27 tests in new file `test_files_view_extended.py`):
|
||||
|
||||
**Files Page Tests (5 tests):**
|
||||
1. `test_files_page_with_search_filter` - Tests search filtering
|
||||
2. `test_files_page_with_mime_type_filter` - Tests MIME type filtering
|
||||
3. `test_files_page_with_sorting` - Tests sorting (asc/desc)
|
||||
4. `test_files_page_pagination` - Tests pagination with different page sizes
|
||||
5. `test_files_page_error_handling` - Tests error handling
|
||||
|
||||
**File Detail Page Tests (4 tests):**
|
||||
6. `test_file_detail_page_with_existing_file` - Tests detail page for existing file
|
||||
7. `test_file_detail_page_with_missing_file` - Tests 404 handling
|
||||
8. `test_file_detail_page_with_processing_logs` - Tests log display
|
||||
9. `test_file_detail_page_with_metadata` - Tests metadata JSON display
|
||||
|
||||
**File Preview Tests (6 tests):**
|
||||
10. `test_preview_original_file_success` - Tests successful preview of original file
|
||||
11. `test_preview_original_file_not_found` - Tests 404 for non-existent file
|
||||
12. `test_preview_original_file_missing_on_disk` - Tests missing file on disk
|
||||
13. `test_preview_processed_file_success` - Tests successful preview of processed file
|
||||
14. `test_preview_processed_file_not_found` - Tests 404 for non-existent file
|
||||
15. `test_preview_processed_file_missing_on_disk` - Tests missing file on disk
|
||||
|
||||
**Text Extraction Tests (8 tests):**
|
||||
16. `test_get_original_text_success` - Tests successful text extraction from original
|
||||
17. `test_get_original_text_file_not_found` - Tests 404 handling
|
||||
18. `test_get_original_text_file_missing_on_disk` - Tests missing file handling
|
||||
19. `test_get_original_text_extraction_error` - Tests invalid PDF handling
|
||||
20. `test_get_processed_text_success` - Tests successful text extraction from processed
|
||||
21. `test_get_processed_text_file_not_found` - Tests 404 handling
|
||||
22. `test_get_processed_text_file_missing_on_disk` - Tests missing file handling
|
||||
23. `test_get_processed_text_extraction_error` - Tests invalid PDF handling
|
||||
|
||||
**Unit Tests for Helper Functions (4 tests):**
|
||||
24. `test_compute_processing_flow_basic` - Tests processing flow computation
|
||||
25. `test_compute_processing_flow_with_uploads` - Tests flow with upload branches
|
||||
26. `test_compute_step_summary_basic` - Tests step summary computation
|
||||
27. `test_compute_step_summary_order_independent` - Tests order independence
|
||||
|
||||
#### Coverage Improvements:
|
||||
- **Main flow**: Files list page with pagination, sorting, filtering
|
||||
- **Detail pages**: File detail with logs, metadata, file existence checks
|
||||
- **File serving**: Preview original/processed files with error handling
|
||||
- **Text extraction**: On-demand text extraction with error handling
|
||||
- **Helper functions**: Processing flow and step summary computation
|
||||
- **Edge cases**: Missing files, invalid PDFs, error conditions
|
||||
|
||||
## Test Execution Results
|
||||
|
||||
All tests passing:
|
||||
- **url_upload tests**: 39 tests passed
|
||||
- **files view tests**: 30 tests passed
|
||||
- **Total**: 69 tests passed, 0 failures
|
||||
|
||||
## Test Quality
|
||||
|
||||
### Test Structure
|
||||
- Tests organized by feature using pytest classes
|
||||
- Proper use of pytest markers (`@pytest.mark.unit`, `@pytest.mark.integration`, `@pytest.mark.requires_db`)
|
||||
- Clear, descriptive test names following pattern: `test_<what>_<condition>_<expected>`
|
||||
- Comprehensive docstrings for each test
|
||||
|
||||
### Coverage Focus
|
||||
- **Main usage flows**: File upload, listing, detail viewing, preview, text extraction
|
||||
- **Edge conditions**: Missing files, invalid inputs, network errors, file system errors
|
||||
- **Error handling**: All exception paths covered
|
||||
- **Security**: SSRF protection, filename sanitization, input validation
|
||||
|
||||
### Mocking Strategy
|
||||
- External dependencies properly mocked (requests, Celery tasks)
|
||||
- Database operations use test fixtures with in-memory SQLite
|
||||
- File system operations use pytest's `tmp_path` fixture
|
||||
- No actual HTTP requests or file operations outside test environment
|
||||
|
||||
## Files Changed
|
||||
|
||||
1. **tests/test_url_upload.py** - Added 10 new tests
|
||||
2. **tests/test_files_view_extended.py** - Created new file with 27 tests
|
||||
3. Existing tests in **tests/test_files_view.py** - Maintained (3 tests)
|
||||
|
||||
## Validation
|
||||
|
||||
Coverage validated with:
|
||||
```bash
|
||||
pytest tests/test_url_upload.py --cov=app/api/url_upload --cov-report=term-missing
|
||||
# Result: 91.21% coverage
|
||||
|
||||
pytest tests/test_files_view.py tests/test_files_view_extended.py --cov=app/views/files --cov-report=term-missing
|
||||
# Result: 90.61% coverage
|
||||
```
|
||||
|
||||
All tests pass without failures or errors.
|
||||
Reference in New Issue
Block a user