mirror of
https://github.com/Benexl/FastAnime.git
synced 2026-01-13 13:27:26 -08:00
335 lines
8.9 KiB
Markdown
335 lines
8.9 KiB
Markdown
# 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 configuration
|
|
- `mock_provider`: Mock anime provider
|
|
- `mock_selector`: Mock UI selector
|
|
- `mock_player`: Mock media player
|
|
- `mock_media_api`: Mock API client
|
|
- `mock_context`: Complete mock context
|
|
- `sample_media_item`: Sample AniList anime data
|
|
- `sample_provider_anime`: Sample provider anime data
|
|
- `sample_search_results`: Sample search results
|
|
- Various state fixtures for different scenarios
|
|
|
|
### Test Utilities
|
|
|
|
- `assert_state_transition()`: Assert proper state transitions
|
|
- `assert_control_flow()`: Assert control flow returns
|
|
- `setup_selector_choices()`: Configure mock selector choices
|
|
- `setup_selector_inputs()`: Configure mock selector inputs
|
|
|
|
## Running Tests
|
|
|
|
### Run All Menu Tests
|
|
|
|
```bash
|
|
python tests/interactive/menus/run_tests.py
|
|
```
|
|
|
|
### Run Specific Menu Tests
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
python tests/interactive/menus/run_tests.py --coverage
|
|
```
|
|
|
|
### Run Integration Tests Only
|
|
|
|
```bash
|
|
python tests/interactive/menus/run_tests.py --integration
|
|
```
|
|
|
|
### Using pytest directly
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```python
|
|
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
|
|
|
|
```python
|
|
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
|
|
|
|
```python
|
|
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
|
|
|
|
```python
|
|
# 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
|
|
|
|
```python
|
|
# 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
|
|
|
|
```python
|
|
# 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:
|
|
|
|
1. Create a new test file: `test_[menu_name].py`
|
|
2. Import the menu function and required fixtures
|
|
3. Create test classes for the main menu and helper functions
|
|
4. Follow the established patterns for testing:
|
|
- Menu display and options
|
|
- User interactions and selections
|
|
- State transitions
|
|
- Error handling
|
|
- Configuration variations
|
|
- Helper functions
|
|
5. Add the menu name to the choices in `run_tests.py`
|
|
6. Update this README with the new test coverage
|
|
|
|
## Best Practices
|
|
|
|
1. **Test Isolation**: Each test should be independent and not rely on other tests
|
|
2. **Clear Naming**: Test names should clearly describe what is being tested
|
|
3. **Comprehensive Coverage**: Test both happy paths and error conditions
|
|
4. **Realistic Mocks**: Mock data should represent realistic scenarios
|
|
5. **State Verification**: Always verify that state transitions are correct
|
|
6. **Error Testing**: Test error handling and edge cases
|
|
7. **Configuration Testing**: Test menu behavior with different configuration options
|
|
8. **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
|