Files
ularsawa/TESTING.md
Phoenix 487b28e682 Add Plex Sonarr integration script and testing framework
- 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.
2025-08-20 23:59:05 +08:00

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

  1. Import Errors

    ModuleNotFoundError: No module named 'pytest'
    

    Solution: Install dependencies with pip install -r requirements.txt

  2. Connection Refused

    ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
    

    Solution: Check if Sonarr is running and accessible

  3. API Key Invalid

    401 Unauthorized
    

    Solution: Verify your SONARR_API_KEY in the configuration

Debugging Tips

  1. Check Sonarr Status

    curl http://192.168.50.111:8989/api/v3/system/status?apikey=YOUR_API_KEY
    
  2. Test Network Connectivity

    ping 192.168.50.111
    telnet 192.168.50.111 8989
    
  3. 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

  1. Mock External Calls: Always mock HTTP requests in unit tests
  2. Test Edge Cases: Include error scenarios and unusual responses
  3. Clear Test Names: Use descriptive test function names
  4. Isolated Tests: Each test should be independent
  5. 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!