Files
thechart/LEGEND_TEST_UPDATES.md
William Valentin b76191d66d
Some checks failed
Build and Push Docker Image / build-and-push (push) Has been cancelled
feat: Implement dose calculation fix and enhance legend feature
- Fixed dose calculation logic in `_calculate_daily_dose` to correctly parse timestamps with multiple colons.
- Added comprehensive test cases for various dose formats and edge cases in `test_dose_calculation.py`.
- Enhanced graph legend to display individual medicines with average dosages and track medicines without dose data.
- Updated legend styling and positioning for better readability and organization.
- Created new tests for enhanced legend functionality, including handling of medicines with and without data.
- Improved mocking for matplotlib components in tests to prevent TypeErrors.
2025-07-30 14:22:07 -07:00

6.2 KiB

Test Updates for Enhanced Legend Feature

Overview

Updated test suite to cover the new enhanced legend functionality that displays individual medicines with average dosages and tracks medicines without dose data.

New Test Methods Added

1. test_enhanced_legend_functionality

Purpose: Tests that the enhanced legend displays correctly with medicine dose data.

What it tests:

  • Legend is called with enhanced formatting parameters (ncol=2, fontsize='small', etc.)
  • Medicine toggles are properly handled
  • Legend configuration parameters are correctly applied

Key assertions:

  • mock_ax.legend.assert_called()
  • Verifies ncol=2, fontsize='small', frameon=True parameters

2. test_legend_with_medicines_without_data

Purpose: Tests that medicines without dose data are properly tracked and displayed in legend info.

What it tests:

  • Medicines with dose data vs. medicines without dose data
  • Additional legend entries for "Tracked (no doses)" information
  • Proper handling of mixed data scenarios

Key assertions:

  • Legend has more labels than original when medicines without data are present
  • mock_ax.legend.assert_called()

3. test_average_dose_calculation_in_legend

Purpose: Tests that average doses are correctly calculated and used in legend labels.

What it tests:

  • Dose calculation accuracy for varying dose amounts
  • Average calculation logic for medicines with multiple daily entries
  • Proper dose processing and bar plotting

Key assertions:

  • Direct dose calculation verification: assert bup_avg == 100.0
  • Bar plotting verification: mock_ax.bar.assert_called()

4. test_legend_positioning_and_styling

Purpose: Tests that all legend styling parameters are correctly applied.

What it tests:

  • Complete set of legend parameters (loc, bbox_to_anchor, ncol, fontsize, frameon, fancybox, shadow, framealpha)
  • Parameter value accuracy
  • Consistent application of styling

Key assertions:

expected_params = {
    'loc': 'upper left',
    'bbox_to_anchor': (0, 1),
    'ncol': 2,
    'fontsize': 'small',
    'frameon': True,
    'fancybox': True,
    'shadow': True,
    'framealpha': 0.9
}

5. test_medicine_tracking_lists

Purpose: Tests that medicines are correctly categorized into medicines_with_data and medicines_without_data lists.

What it tests:

  • Proper categorization of medicines based on dose data availability
  • Toggle state handling for different medicine states
  • Mixed scenarios with some medicines having data and others not

Key assertions:

  • mock_ax.bar.assert_called() for medicines with data
  • mock_ax.legend.assert_called() for legend creation

6. test_legend_dummy_handle_creation

Purpose: Tests that dummy handles are created for medicines without dose data in legend.

What it tests:

  • Rectangle dummy handle creation for text-only legend entries
  • Proper import and usage of matplotlib.patches.Rectangle
  • Integration of dummy handles with existing legend system

Key assertions:

  • mock_rectangle.assert_called() when medicines without data are present

7. test_empty_dataframe_legend_handling

Purpose: Tests that legend is handled correctly with empty DataFrame scenarios.

What it tests:

  • No legend creation when no data is present
  • Proper graph clearing and canvas redrawing
  • Edge case handling

Key assertions:

  • mock_ax.legend.assert_not_called() for empty data
  • mock_ax.clear.assert_called() and mock_canvas.draw.assert_called()

Test Data Enhancements

Enhanced Sample DataFrames

Tests now use more comprehensive DataFrames that include:

  • Realistic dose data: Multiple dose entries with varying amounts
  • Mixed scenarios: Some medicines with data, others without
  • Average calculation data: Varying doses across multiple days for accurate average testing
  • Edge cases: Empty dose strings, missing data scenarios

Example Test Data Structure:

df_with_varying_doses = pd.DataFrame({
    'bupropion_doses': ['100mg', '200mg', '150mg'],  # Avg: 150mg
    'propranolol_doses': ['10mg', '20mg', ''],       # Avg: 15mg
    'hydroxyzine_doses': ['', '', ''],               # No data
})

Mock Enhancements

Legend-Specific Mocks:

  • mock_ax.get_legend_handles_labels: Returns mock handles and labels
  • matplotlib.patches.Rectangle: Mocked for dummy handle creation
  • Enhanced legend parameter verification: Detailed parameter checking

Integration Testing:

  • Tests work with existing matplotlib mocking structure
  • Compatible with existing GraphManager test patterns
  • Maintains isolation between test methods

Coverage Areas

Legend Functionality:

Enhanced formatting: Multi-column, styling, positioning Medicine tracking: With/without data categorization Average calculations: Accurate dose averaging in labels Dummy handles: Text-only legend entries Parameter validation: All styling parameters verified

Edge Cases:

Empty DataFrames: No legend creation Mixed data scenarios: Some medicines with/without data Toggle combinations: Various medicine toggle states Import handling: Matplotlib patches import testing

Integration:

Existing functionality: Compatible with previous tests Mock consistency: Uses established mocking patterns Error handling: Graceful handling of edge cases

Running the Tests

# Run all graph manager tests
.venv/bin/python -m pytest tests/test_graph_manager.py -v

# Run only legend-related tests
.venv/bin/python -m pytest tests/test_graph_manager.py -k "legend" -v

# Run with coverage
.venv/bin/python -m pytest tests/test_graph_manager.py --cov=src.graph_manager --cov-report=html

Benefits

Test Quality:

  • Comprehensive coverage of new legend functionality
  • Edge case testing for robust error handling
  • Integration testing with existing graph functionality

Maintenance:

  • Clear test names indicating specific functionality
  • Isolated test methods for easy debugging
  • Consistent patterns following existing test structure

The updated tests ensure that the enhanced legend functionality is thoroughly validated while maintaining compatibility with existing GraphManager features.