From be3aed6e5e2ef5c80235dcb3f8efa1aeb2ec5abe Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Mon, 10 Nov 2025 18:23:19 +0100 Subject: [PATCH] mocking in tests --- tests/unit/test_hal.py | 109 ++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 46 deletions(-) diff --git a/tests/unit/test_hal.py b/tests/unit/test_hal.py index 9d23769..0936625 100644 --- a/tests/unit/test_hal.py +++ b/tests/unit/test_hal.py @@ -5,13 +5,23 @@ Tests the DisplayHAL interface and EReaderDisplayHAL implementation. """ import pytest -from unittest.mock import AsyncMock, MagicMock, patch +import sys +from unittest.mock import AsyncMock, MagicMock, patch, Mock from PIL import Image from dreader_hal.hal import DisplayHAL -from dreader_hal.ereader_hal import EReaderDisplayHAL from dreader_hal.types import GestureType, TouchEvent +# Mock the hardware driver modules before importing ereader_hal +# This prevents import errors when the hardware modules can't be loaded +sys.modules['dreader_hal.display.it8951'] = Mock() +sys.modules['dreader_hal.touch.ft5xx6'] = Mock() +sys.modules['dreader_hal.sensors.bma400'] = Mock() +sys.modules['dreader_hal.rtc.pcf8523'] = Mock() +sys.modules['dreader_hal.power.ina219'] = Mock() + +from dreader_hal.ereader_hal import EReaderDisplayHAL + class TestDisplayHALInterface: """Tests for DisplayHAL abstract interface.""" @@ -39,56 +49,63 @@ class TestEReaderDisplayHAL: @pytest.fixture def mock_components(self): """Create mock hardware components.""" - # Since imports are now lazy (inside __init__), we need to patch the actual modules - with patch('dreader_hal.display.it8951.IT8951DisplayDriver') as mock_display, \ - patch('dreader_hal.touch.ft5xx6.FT5xx6TouchDriver') as mock_touch, \ - patch('dreader_hal.sensors.bma400.BMA400OrientationSensor') as mock_orientation, \ - patch('dreader_hal.rtc.pcf8523.PCF8523RTC') as mock_rtc, \ - patch('dreader_hal.power.ina219.INA219PowerMonitor') as mock_power: + # Create mock driver classes + mock_display_class = MagicMock() + mock_touch_class = MagicMock() + mock_orientation_class = MagicMock() + mock_rtc_class = MagicMock() + mock_power_class = MagicMock() - # Set up the mocks to return mock instances with async methods - mock_display_instance = MagicMock() - mock_display_instance.initialize = AsyncMock() - mock_display_instance.cleanup = AsyncMock() - mock_display_instance.show_image = AsyncMock() - mock_display_instance.set_brightness = AsyncMock() - mock_display_instance.sleep = AsyncMock() - mock_display_instance.wake = AsyncMock() - mock_display_instance.refresh_count = 0 - mock_display.return_value = mock_display_instance + # Set up the mocks to return mock instances with async methods + mock_display_instance = MagicMock() + mock_display_instance.initialize = AsyncMock() + mock_display_instance.cleanup = AsyncMock() + mock_display_instance.show_image = AsyncMock() + mock_display_instance.set_brightness = AsyncMock() + mock_display_instance.sleep = AsyncMock() + mock_display_instance.wake = AsyncMock() + mock_display_instance.refresh_count = 0 + mock_display_class.return_value = mock_display_instance - mock_touch_instance = MagicMock() - mock_touch_instance.initialize = AsyncMock() - mock_touch_instance.cleanup = AsyncMock() - mock_touch_instance.get_touch_event = AsyncMock(return_value=None) - mock_touch_instance.set_polling_rate = AsyncMock() - mock_touch.return_value = mock_touch_instance + mock_touch_instance = MagicMock() + mock_touch_instance.initialize = AsyncMock() + mock_touch_instance.cleanup = AsyncMock() + mock_touch_instance.get_touch_event = AsyncMock(return_value=None) + mock_touch_instance.set_polling_rate = AsyncMock() + mock_touch_class.return_value = mock_touch_instance - mock_orientation_instance = MagicMock() - mock_orientation_instance.initialize = AsyncMock() - mock_orientation_instance.cleanup = AsyncMock() - mock_orientation_instance.current_angle = 0 - mock_orientation.return_value = mock_orientation_instance + mock_orientation_instance = MagicMock() + mock_orientation_instance.initialize = AsyncMock() + mock_orientation_instance.cleanup = AsyncMock() + mock_orientation_instance.current_angle = 0 + mock_orientation_class.return_value = mock_orientation_instance - mock_rtc_instance = MagicMock() - mock_rtc_instance.initialize = AsyncMock() - mock_rtc_instance.cleanup = AsyncMock() - mock_rtc.return_value = mock_rtc_instance + mock_rtc_instance = MagicMock() + mock_rtc_instance.initialize = AsyncMock() + mock_rtc_instance.cleanup = AsyncMock() + mock_rtc_class.return_value = mock_rtc_instance - mock_power_instance = MagicMock() - mock_power_instance.initialize = AsyncMock() - mock_power_instance.cleanup = AsyncMock() - mock_power_instance.get_battery_percent = AsyncMock(return_value=75.0) - mock_power_instance.is_low_battery = AsyncMock(return_value=False) - mock_power.return_value = mock_power_instance + mock_power_instance = MagicMock() + mock_power_instance.initialize = AsyncMock() + mock_power_instance.cleanup = AsyncMock() + mock_power_instance.get_battery_percent = AsyncMock(return_value=75.0) + mock_power_instance.is_low_battery = AsyncMock(return_value=False) + mock_power_class.return_value = mock_power_instance - yield { - 'display': mock_display_instance, - 'touch': mock_touch_instance, - 'orientation': mock_orientation_instance, - 'rtc': mock_rtc_instance, - 'power': mock_power_instance, - } + # Inject the mock classes into the sys.modules mocks + sys.modules['dreader_hal.display.it8951'].IT8951DisplayDriver = mock_display_class + sys.modules['dreader_hal.touch.ft5xx6'].FT5xx6TouchDriver = mock_touch_class + sys.modules['dreader_hal.sensors.bma400'].BMA400OrientationSensor = mock_orientation_class + sys.modules['dreader_hal.rtc.pcf8523'].PCF8523RTC = mock_rtc_class + sys.modules['dreader_hal.power.ina219'].INA219PowerMonitor = mock_power_class + + yield { + 'display': mock_display_instance, + 'touch': mock_touch_instance, + 'orientation': mock_orientation_instance, + 'rtc': mock_rtc_instance, + 'power': mock_power_instance, + } def test_hal_initialization(self, mock_components): """Test HAL initialization with default parameters."""