Duncan Tourolle fe140ba91f
Some checks failed
Python CI / test (push) Failing after 4m11s
refactor applications to delegate responsibilites
2025-11-08 19:46:49 +01:00

221 lines
7.7 KiB
Python

"""
Unit tests for SettingsManager.
Tests settings management in isolation using mocks.
"""
import unittest
from unittest.mock import Mock, MagicMock
from dreader.managers.settings import SettingsManager
class TestSettingsManager(unittest.TestCase):
"""Test SettingsManager in isolation"""
def setUp(self):
"""Set up test environment"""
self.manager = SettingsManager()
def test_initialization(self):
"""Test manager initializes correctly"""
manager = SettingsManager()
self.assertEqual(manager.font_scale, 1.0)
self.assertEqual(manager.font_scale_step, 0.1)
self.assertIsNone(manager.manager)
def test_get_font_size(self):
"""Test getting current font size"""
self.assertEqual(self.manager.get_font_size(), 1.0)
self.manager.font_scale = 1.5
self.assertEqual(self.manager.get_font_size(), 1.5)
def test_set_font_size_without_manager(self):
"""Test setting font size without layout manager returns None"""
result = self.manager.set_font_size(1.5)
self.assertIsNone(result)
def test_set_font_size_with_manager(self):
"""Test setting font size with layout manager"""
# Create mock manager
mock_layout_manager = Mock()
mock_page = Mock()
mock_page.render.return_value = "rendered_page"
mock_layout_manager.set_font_scale.return_value = mock_page
mock_layout_manager.font_scale = 1.0
self.manager.set_manager(mock_layout_manager)
# Set font size
result = self.manager.set_font_size(1.5)
self.assertIsNotNone(result)
self.assertEqual(result, "rendered_page")
self.assertEqual(self.manager.font_scale, 1.5)
mock_layout_manager.set_font_scale.assert_called_once_with(1.5)
def test_font_size_clamping(self):
"""Test font size is clamped between 0.5x and 3.0x"""
mock_layout_manager = Mock()
mock_page = Mock()
mock_page.render.return_value = "rendered_page"
mock_layout_manager.set_font_scale.return_value = mock_page
mock_layout_manager.font_scale = 1.0
self.manager.set_manager(mock_layout_manager)
# Test upper bound
self.manager.set_font_size(5.0)
self.assertEqual(self.manager.font_scale, 3.0)
# Test lower bound
self.manager.set_font_size(0.1)
self.assertEqual(self.manager.font_scale, 0.5)
def test_increase_font_size(self):
"""Test increasing font size by one step"""
mock_layout_manager = Mock()
mock_page = Mock()
mock_page.render.return_value = "rendered_page"
mock_layout_manager.set_font_scale.return_value = mock_page
mock_layout_manager.font_scale = 1.0
self.manager.set_manager(mock_layout_manager)
initial_size = self.manager.font_scale
self.manager.increase_font_size()
self.assertEqual(self.manager.font_scale, initial_size + 0.1)
def test_decrease_font_size(self):
"""Test decreasing font size by one step"""
mock_layout_manager = Mock()
mock_page = Mock()
mock_page.render.return_value = "rendered_page"
mock_layout_manager.set_font_scale.return_value = mock_page
mock_layout_manager.font_scale = 1.5
self.manager.set_manager(mock_layout_manager)
self.manager.font_scale = 1.5
self.manager.decrease_font_size()
self.assertAlmostEqual(self.manager.font_scale, 1.4, places=5)
def test_set_line_spacing(self):
"""Test setting line spacing"""
mock_layout_manager = Mock()
mock_page = Mock()
mock_page.render.return_value = "rendered_page"
mock_layout_manager.get_current_page.return_value = mock_page
mock_layout_manager.page_style = Mock()
mock_layout_manager.page_style.line_spacing = 5
self.manager.set_manager(mock_layout_manager)
result = self.manager.set_line_spacing(10)
self.assertIsNotNone(result)
mock_layout_manager.increase_line_spacing.assert_called_once_with(5)
def test_set_inter_block_spacing(self):
"""Test setting inter-block spacing"""
mock_layout_manager = Mock()
mock_page = Mock()
mock_page.render.return_value = "rendered_page"
mock_layout_manager.get_current_page.return_value = mock_page
mock_layout_manager.page_style = Mock()
mock_layout_manager.page_style.inter_block_spacing = 15
self.manager.set_manager(mock_layout_manager)
result = self.manager.set_inter_block_spacing(25)
self.assertIsNotNone(result)
mock_layout_manager.increase_inter_block_spacing.assert_called_once_with(10)
def test_set_word_spacing(self):
"""Test setting word spacing"""
mock_layout_manager = Mock()
mock_page = Mock()
mock_page.render.return_value = "rendered_page"
mock_layout_manager.get_current_page.return_value = mock_page
mock_layout_manager.page_style = Mock()
mock_layout_manager.page_style.word_spacing = 0
self.manager.set_manager(mock_layout_manager)
result = self.manager.set_word_spacing(3)
self.assertIsNotNone(result)
mock_layout_manager.increase_word_spacing.assert_called_once_with(3)
def test_get_current_settings_without_manager(self):
"""Test getting settings without layout manager"""
settings = self.manager.get_current_settings()
self.assertIsInstance(settings, dict)
self.assertEqual(settings['font_scale'], 1.0)
self.assertEqual(settings['line_spacing'], 5)
self.assertEqual(settings['inter_block_spacing'], 15)
self.assertEqual(settings['word_spacing'], 0)
def test_get_current_settings_with_manager(self):
"""Test getting settings with layout manager"""
mock_layout_manager = Mock()
mock_layout_manager.page_style = Mock()
mock_layout_manager.page_style.line_spacing = 10
mock_layout_manager.page_style.inter_block_spacing = 20
mock_layout_manager.page_style.word_spacing = 3
mock_layout_manager.font_scale = 1.5
self.manager.set_manager(mock_layout_manager)
self.manager.font_scale = 1.5
settings = self.manager.get_current_settings()
self.assertEqual(settings['font_scale'], 1.5)
self.assertEqual(settings['line_spacing'], 10)
self.assertEqual(settings['inter_block_spacing'], 20)
self.assertEqual(settings['word_spacing'], 3)
def test_apply_settings(self):
"""Test applying settings from dictionary"""
mock_layout_manager = Mock()
mock_page = Mock()
mock_page.render.return_value = "rendered_page"
mock_layout_manager.set_font_scale.return_value = mock_page
mock_layout_manager.get_current_page.return_value = mock_page
mock_layout_manager.page_style = Mock()
mock_layout_manager.page_style.line_spacing = 5
mock_layout_manager.page_style.inter_block_spacing = 15
mock_layout_manager.page_style.word_spacing = 0
mock_layout_manager.font_scale = 1.0
self.manager.set_manager(mock_layout_manager)
settings = {
'font_scale': 1.5,
'line_spacing': 10,
'inter_block_spacing': 20,
'word_spacing': 3
}
success = self.manager.apply_settings(settings)
self.assertTrue(success)
self.assertEqual(self.manager.font_scale, 1.5)
def test_apply_settings_without_manager(self):
"""Test applying settings without layout manager returns False"""
settings = {'font_scale': 1.5}
success = self.manager.apply_settings(settings)
self.assertFalse(success)
if __name__ == '__main__':
unittest.main()