- Implemented a Python script for integrating Plex Media Server with Sonarr to manage TV show seasons based on viewing habits. - Added features for automated season management, exclusion list support, and detailed logging. - Created a requirements.txt file to include necessary packages: plexapi, requests, pytest, pytest-mock, and requests-mock. - Developed unit tests for the API verification function using pytest and requests_mock. - Included a standalone script to unmonitor excluded shows in Sonarr. - Added a test script for manual API verification with mock and real API tests.
5.1 KiB
Testing Guide for verify_sonarr_api Function
This guide explains how to test the verify_sonarr_api function from the plexsonarr.py script.
Test Files Overview
1. test_verify_api.py - Simple Interactive Test
A user-friendly test script that provides:
- ✅ Mocked success tests
- ❌ Mocked failure tests
- 🧪 HTTP error simulation
- 🌐 Real API testing (optional)
Usage:
python test_verify_api.py
2. test_plexsonarr.py - Comprehensive pytest Suite
Full test suite using pytest framework that covers:
- Successful API verification
- HTTP errors (401, 404, 500)
- Connection errors
- Timeout scenarios
- Invalid JSON responses
Usage:
pytest test_plexsonarr.py -v
Quick Start
Install Dependencies
pip install -r requirements.txt
Run Simple Tests
python test_verify_api.py
Run Comprehensive Tests
pytest test_plexsonarr.py -v
Run All Tests
pytest -v
Test Scenarios Covered
✅ Success Cases
- Valid API response (200 OK)
- Correct API key and URL
- Successful connection to Sonarr
❌ Error Cases
- 401 Unauthorized: Invalid API key
- 404 Not Found: Incorrect endpoint or server
- 500 Server Error: Sonarr internal error
- Connection Error: Network issues
- Timeout: Slow response from server
🔧 Edge Cases
- Invalid JSON response
- Malformed responses
- Network connectivity issues
Configuration
The tests use the same configuration as your main script:
SONARR_API_KEY = "2537de37fded4874ae83da9cf3c14f34"
SONARR_SERVER_URL = "http://192.168.50.111:8989"
Understanding Test Output
Successful Test Run
🚀 Starting verify_sonarr_api tests...
✅ Mock success test passed!
✅ Mock failure test passed!
✅ Mock HTTP error test passed!
✅ Real API test passed! Your Sonarr API is working.
Failed Real API Test
❌ Failed to verify Sonarr API: HTTPSConnectionPool(host='192.168.50.111', port=8989)
💡 Tip: Check your SONARR_SERVER_URL and SONARR_API_KEY configuration
Pytest Output Explanation
pytest test_plexsonarr.py -v
Each test case shows:
- PASSED: Test completed successfully
- FAILED: Test found an issue
- Coverage: Which scenarios were tested
Troubleshooting
Common Issues
-
Import Errors
ModuleNotFoundError: No module named 'pytest'Solution: Install dependencies with
pip install -r requirements.txt -
Connection Refused
ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))Solution: Check if Sonarr is running and accessible
-
API Key Invalid
401 UnauthorizedSolution: Verify your SONARR_API_KEY in the configuration
Debugging Tips
-
Check Sonarr Status
curl http://192.168.50.111:8989/api/v3/system/status?apikey=YOUR_API_KEY -
Test Network Connectivity
ping 192.168.50.111 telnet 192.168.50.111 8989 -
Verify API Key
- Open Sonarr web interface
- Go to Settings → General
- Check the API Key in Security section
Test Development
Adding New Tests
To add a new test case to test_plexsonarr.py:
def test_verify_sonarr_api_new_scenario(self):
"""Test description"""
with requests_mock.Mocker() as m:
expected_url = f"{plexsonarr.SONARR_SERVER_URL}/api/v3/system/status?apikey={plexsonarr.SONARR_API_KEY}"
m.get(expected_url, status_code=YOUR_STATUS_CODE)
# Your test logic here
with pytest.raises(ExpectedException):
plexsonarr.verify_sonarr_api()
Test Best Practices
- Mock External Calls: Always mock HTTP requests in unit tests
- Test Edge Cases: Include error scenarios and unusual responses
- Clear Test Names: Use descriptive test function names
- Isolated Tests: Each test should be independent
- Verify Behavior: Check both success and failure paths
Continuous Integration
Add to your CI pipeline:
# .github/workflows/test.yml
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: 3.11
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run tests
run: pytest test_plexsonarr.py -v
Performance Testing
For load testing the API:
# Install httpie for testing
pip install httpie
# Test API endpoint directly
http GET "http://192.168.50.111:8989/api/v3/system/status?apikey=YOUR_API_KEY"
Summary
The testing setup provides:
- 🔍 Comprehensive Coverage: All success/failure scenarios
- 🚀 Easy Execution: Simple commands to run tests
- 📊 Clear Reporting: Detailed output and error messages
- 🛠️ Development Ready: Easy to extend with new test cases
- 🌐 Real-world Testing: Option to test against actual Sonarr API
This ensures your verify_sonarr_api function works correctly in all scenarios!