mirror of
https://github.com/Benexl/FastAnime.git
synced 2025-12-31 07:00:41 -08:00
Interactive Menu Tests
This directory contains comprehensive tests for FastAnime's interactive CLI menus. The test suite follows DRY principles and provides extensive coverage of all menu functionality.
Test Structure
tests/
├── conftest.py # Shared fixtures and test configuration
├── cli/
│ └── interactive/
│ ├── test_session.py # Session management tests
│ └── menus/
│ ├── base_test.py # Base test classes and utilities
│ ├── test_main.py # Main menu tests
│ ├── test_auth.py # Authentication menu tests
│ ├── test_session_management.py # Session management menu tests
│ ├── test_results.py # Results display menu tests
│ ├── test_episodes.py # Episodes selection menu tests
│ ├── test_watch_history.py # Watch history menu tests
│ ├── test_media_actions.py # Media actions menu tests
│ └── test_additional_menus.py # Additional menus (servers, provider search, etc.)
Test Architecture
Base Classes
-
BaseMenuTest: Core test functionality for all menu tests- Console clearing verification
- Control flow assertions (BACK, EXIT, CONTINUE, RELOAD_CONFIG)
- Menu transition assertions
- Feedback message verification
- Common setup patterns
-
MenuTestMixin: Additional utilities for specialized testing- API result mocking
- Authentication state setup
- Provider search configuration
-
Specialized Mixins:
AuthMenuTestMixin: Authentication-specific test utilitiesSessionMenuTestMixin: Session management test utilitiesMediaMenuTestMixin: Media-related test utilities
Fixtures
Core Fixtures (in conftest.py):
mock_config: Application configurationmock_context: Complete context with all dependenciesmock_unauthenticated_context: Context without authenticationmock_user_profile: Authenticated user datamock_media_item: Sample anime/media datamock_media_search_result: API search resultsbasic_state: Basic menu statestate_with_media_data: State with media information
Utility Fixtures:
mock_feedback_manager: User feedback systemmock_console: Rich console outputmenu_helper: Helper methods for common test patterns
Test Categories
Unit Tests
Each menu has comprehensive unit tests covering:
- Navigation choices and transitions
- Error handling and edge cases
- Authentication requirements
- Configuration variations (icons enabled/disabled)
- Input validation
- API interaction patterns
Integration Tests
Tests covering menu flow and interaction:
- Complete navigation workflows
- Error recovery across menus
- Authentication flow integration
- Session state persistence
Test Patterns
Navigation Testing
def test_menu_navigation(self, mock_context, basic_state):
self.setup_selector_choice(mock_context, "Target Option")
result = menu_function(mock_context, basic_state)
self.assert_menu_transition(result, "TARGET_MENU")
Error Handling Testing
def test_menu_error_handling(self, mock_context, basic_state):
self.setup_api_failure(mock_context)
result = menu_function(mock_context, basic_state)
self.assert_continue_behavior(result)
self.assert_feedback_error_called("Expected error message")
Authentication Testing
def test_authenticated_vs_unauthenticated(self, mock_context, mock_unauthenticated_context, basic_state):
# Test authenticated behavior
result1 = menu_function(mock_context, basic_state)
# Test unauthenticated behavior
result2 = menu_function(mock_unauthenticated_context, basic_state)
# Assert different behaviors
Running Tests
Quick Start
# Run all interactive menu tests
python -m pytest tests/cli/interactive/ -v
# Run tests with coverage
python -m pytest tests/cli/interactive/ --cov=fastanime.cli.interactive --cov-report=html
# Run specific menu tests
python -m pytest tests/cli/interactive/menus/test_main.py -v
Using the Test Runner
# Quick unit tests
./run_tests.py --quick
# Full test suite with coverage and linting
./run_tests.py --full
# Test specific menu
./run_tests.py --menu main
# Test with pattern matching
./run_tests.py --pattern "test_auth" --verbose
# Generate coverage report only
./run_tests.py --coverage-only
Test Runner Options
--quick: Fast unit tests only--full: Complete suite with coverage and linting--menu <name>: Test specific menu--pattern <pattern>: Match test names--coverage: Generate coverage reports--verbose: Detailed output--fail-fast: Stop on first failure--parallel <n>: Run tests in parallel--lint: Run code linting
Test Coverage Goals
The test suite aims for comprehensive coverage of:
- ✅ Menu Navigation: All menu choices and transitions
- ✅ Error Handling: API failures, invalid input, edge cases
- ✅ Authentication Flow: Authenticated vs unauthenticated behavior
- ✅ Configuration Variations: Icons, providers, preferences
- ✅ User Input Validation: Empty input, invalid formats, special characters
- ✅ State Management: Session state persistence and recovery
- ✅ Control Flow: BACK, EXIT, CONTINUE, RELOAD_CONFIG behaviors
- ✅ Integration Points: Menu-to-menu transitions and data flow
Adding New Tests
For New Menus
- Create
test_<menu_name>.pyintests/cli/interactive/menus/ - Inherit from
BaseMenuTestand appropriate mixins - Follow the established patterns for navigation, error handling, and authentication testing
- Add fixtures specific to the menu's data requirements
For New Features
- Add tests to existing menu test files
- Create new fixtures in
conftest.pyif needed - Add new test patterns to
base_test.pyif reusable - Update this README with new patterns or conventions
Test Naming Conventions
test_<menu>_<scenario>: Basic functionality teststest_<menu>_<action>_success: Successful operation teststest_<menu>_<action>_failure: Error condition teststest_<menu>_<condition>_<behavior>: Conditional behavior tests
Debugging Tests
Common Issues
- Import Errors: Ensure all dependencies are properly mocked
- State Errors: Verify state fixtures have required data
- Mock Configuration: Check that mocks match actual interface contracts
- Async Issues: Ensure async operations are properly handled in tests
Debugging Tools
# Run specific test with debug output
python -m pytest tests/cli/interactive/menus/test_main.py::TestMainMenu::test_specific_case -v -s
# Run with Python debugger
python -m pytest --pdb tests/cli/interactive/menus/test_main.py
# Generate detailed coverage report
python -m pytest --cov=fastanime.cli.interactive --cov-report=html --cov-report=term-missing -v
Continuous Integration
The test suite is designed for CI/CD integration:
- Fast unit tests for quick feedback
- Comprehensive integration tests for release validation
- Coverage reporting for quality metrics
- Linting integration for code quality
CI Configuration Example
# Run quick tests on every commit
pytest tests/cli/interactive/ -m unit --fail-fast
# Run full suite on PR/release
pytest tests/cli/interactive/ --cov=fastanime.cli.interactive --cov-fail-under=90