mirror of
https://github.com/Benexl/FastAnime.git
synced 2025-12-30 14:40:39 -08:00
Interactive Menu Tests
This directory contains comprehensive test suites for all interactive menu functionality in FastAnime.
Test Structure
tests/interactive/menus/
├── conftest.py # Shared fixtures and utilities
├── __init__.py # Package marker
├── run_tests.py # Test runner script
├── README.md # This file
├── test_main.py # Tests for main menu
├── test_results.py # Tests for results menu
├── test_auth.py # Tests for authentication menu
├── test_media_actions.py # Tests for media actions menu
├── test_episodes.py # Tests for episodes menu
├── test_servers.py # Tests for servers menu
├── test_player_controls.py # Tests for player controls menu
├── test_provider_search.py # Tests for provider search menu
├── test_session_management.py # Tests for session management menu
└── test_watch_history.py # Tests for watch history menu
Test Categories
Unit Tests
Each menu has its own comprehensive test file that covers:
- Menu display and option rendering
- User interaction handling
- State transitions
- Error handling
- Configuration options (icons, preferences)
- Helper function testing
Integration Tests
Tests marked with @pytest.mark.integration require network connectivity and test:
- Real API interactions
- Authentication flows
- Data fetching and processing
Test Coverage
Each test file covers the following aspects:
Main Menu Tests (test_main.py)
- Option display with/without icons
- Navigation to different categories (trending, popular, etc.)
- Search functionality
- User list access (authenticated/unauthenticated)
- Authentication and session management
- Configuration editing
- Helper function testing
Results Menu Tests (test_results.py)
- Search result display
- Pagination handling
- Anime selection
- Preview functionality
- Authentication status display
- Helper function testing
Authentication Menu Tests (test_auth.py)
- Login/logout flows
- OAuth authentication
- Token input handling
- Profile display
- Authentication status management
- Helper function testing
Media Actions Menu Tests (test_media_actions.py)
- Action menu display
- Streaming initiation
- Trailer playback
- List management
- Scoring functionality
- Local history tracking
- Information display
- Helper function testing
Episodes Menu Tests (test_episodes.py)
- Episode list display
- Watch history continuation
- Episode selection
- Translation type handling
- Progress tracking
- Helper function testing
Servers Menu Tests (test_servers.py)
- Server fetching and display
- Server selection
- Quality filtering
- Auto-server selection
- Player integration
- Error handling
- Helper function testing
Player Controls Menu Tests (test_player_controls.py)
- Post-playback options
- Next episode handling
- Auto-next functionality
- Progress tracking
- Replay functionality
- Server switching
- Helper function testing
Provider Search Menu Tests (test_provider_search.py)
- Provider anime search
- Auto-selection based on similarity
- Manual selection handling
- Preview integration
- Error handling
- Helper function testing
Session Management Menu Tests (test_session_management.py)
- Session saving/loading
- Session listing and statistics
- Session deletion
- Auto-save configuration
- Backup creation
- Helper function testing
Watch History Menu Tests (test_watch_history.py)
- History display and navigation
- History management (clear, export, import)
- Statistics calculation
- Anime selection from history
- Helper function testing
Fixtures and Utilities
Shared Fixtures (conftest.py)
mock_config: Mock application configurationmock_provider: Mock anime providermock_selector: Mock UI selectormock_player: Mock media playermock_media_api: Mock API clientmock_context: Complete mock contextsample_media_item: Sample AniList anime datasample_provider_anime: Sample provider anime datasample_search_results: Sample search results- Various state fixtures for different scenarios
Test Utilities
assert_state_transition(): Assert proper state transitionsassert_control_flow(): Assert control flow returnssetup_selector_choices(): Configure mock selector choicessetup_selector_inputs(): Configure mock selector inputs
Running Tests
Run All Menu Tests
python tests/interactive/menus/run_tests.py
Run Specific Menu Tests
python tests/interactive/menus/run_tests.py --menu main
python tests/interactive/menus/run_tests.py --menu auth
python tests/interactive/menus/run_tests.py --menu episodes
Run with Coverage
python tests/interactive/menus/run_tests.py --coverage
Run Integration Tests Only
python tests/interactive/menus/run_tests.py --integration
Using pytest directly
# Run all menu tests
pytest tests/interactive/menus/ -v
# Run specific test file
pytest tests/interactive/menus/test_main.py -v
# Run with coverage
pytest tests/interactive/menus/ --cov=fastanime.cli.interactive.menus --cov-report=html
# Run integration tests only
pytest tests/interactive/menus/ -m integration
# Run specific test class
pytest tests/interactive/menus/test_main.py::TestMainMenu -v
# Run specific test method
pytest tests/interactive/menus/test_main.py::TestMainMenu::test_main_menu_displays_options -v
Test Patterns
Menu Function Testing
def test_menu_function(self, mock_context, test_state):
"""Test the menu function with specific setup."""
# Setup
mock_context.selector.choose.return_value = "Expected Choice"
# Execute
result = menu_function(mock_context, test_state)
# Assert
assert isinstance(result, State)
assert result.menu_name == "EXPECTED_STATE"
Error Handling Testing
def test_menu_error_handling(self, mock_context, test_state):
"""Test menu handles errors gracefully."""
# Setup error condition
mock_context.provider.some_method.side_effect = Exception("Test error")
# Execute
result = menu_function(mock_context, test_state)
# Assert error handling
assert result == ControlFlow.BACK # or appropriate error response
State Transition Testing
def test_state_transition(self, mock_context, initial_state):
"""Test proper state transitions."""
# Setup
mock_context.selector.choose.return_value = "Next State Option"
# Execute
result = menu_function(mock_context, initial_state)
# Assert state transition
assert_state_transition(result, "NEXT_STATE")
assert result.media_api.anime == initial_state.media_api.anime # State preservation
Mocking Strategies
API Mocking
# Mock successful API calls
mock_context.media_api.search_media.return_value = sample_search_results
# Mock API failures
mock_context.media_api.search_media.side_effect = Exception("API Error")
User Input Mocking
# Mock menu selection
mock_context.selector.choose.return_value = "Selected Option"
# Mock text input
mock_context.selector.ask.return_value = "User Input"
# Mock cancelled selections
mock_context.selector.choose.return_value = None
Configuration Mocking
# Mock configuration options
mock_context.config.general.icons = True
mock_context.config.stream.auto_next = False
mock_context.config.anilist.per_page = 15
Adding New Tests
When adding tests for new menus:
- Create a new test file:
test_[menu_name].py - Import the menu function and required fixtures
- Create test classes for the main menu and helper functions
- Follow the established patterns for testing:
- Menu display and options
- User interactions and selections
- State transitions
- Error handling
- Configuration variations
- Helper functions
- Add the menu name to the choices in
run_tests.py - Update this README with the new test coverage
Best Practices
- Test Isolation: Each test should be independent and not rely on other tests
- Clear Naming: Test names should clearly describe what is being tested
- Comprehensive Coverage: Test both happy paths and error conditions
- Realistic Mocks: Mock data should represent realistic scenarios
- State Verification: Always verify that state transitions are correct
- Error Testing: Test error handling and edge cases
- Configuration Testing: Test menu behavior with different configuration options
- Documentation: Document complex test scenarios and mock setups
Continuous Integration
These tests are designed to run in CI environments:
- Unit tests run without external dependencies
- Integration tests can be skipped in CI if needed
- Coverage reports help maintain code quality
- Fast execution for quick feedback loops