test_file_settings_store.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import json
  2. from unittest.mock import MagicMock, patch
  3. import pytest
  4. from openhands.core.config.app_config import AppConfig
  5. from openhands.server.settings import Settings
  6. from openhands.storage.file_settings_store import FileSettingsStore
  7. from openhands.storage.files import FileStore
  8. @pytest.fixture
  9. def mock_file_store():
  10. return MagicMock(spec=FileStore)
  11. @pytest.fixture
  12. def session_init_store(mock_file_store):
  13. return FileSettingsStore(mock_file_store)
  14. @pytest.mark.asyncio
  15. async def test_load_nonexistent_data(session_init_store):
  16. session_init_store.file_store.read.side_effect = FileNotFoundError()
  17. assert await session_init_store.load() is None
  18. @pytest.mark.asyncio
  19. async def test_store_and_load_data(session_init_store):
  20. # Test data
  21. init_data = Settings(
  22. language='python',
  23. agent='test-agent',
  24. max_iterations=100,
  25. security_analyzer='default',
  26. confirmation_mode=True,
  27. llm_model='test-model',
  28. llm_api_key='test-key',
  29. llm_base_url='https://test.com',
  30. )
  31. # Store data
  32. await session_init_store.store(init_data)
  33. # Verify store called with correct JSON
  34. expected_json = json.dumps(init_data.__dict__)
  35. session_init_store.file_store.write.assert_called_once_with(
  36. 'settings.json', expected_json
  37. )
  38. # Setup mock for load
  39. session_init_store.file_store.read.return_value = expected_json
  40. # Load and verify data
  41. loaded_data = await session_init_store.load()
  42. assert loaded_data is not None
  43. assert loaded_data.language == init_data.language
  44. assert loaded_data.agent == init_data.agent
  45. assert loaded_data.max_iterations == init_data.max_iterations
  46. assert loaded_data.security_analyzer == init_data.security_analyzer
  47. assert loaded_data.confirmation_mode == init_data.confirmation_mode
  48. assert loaded_data.llm_model == init_data.llm_model
  49. assert loaded_data.llm_api_key == init_data.llm_api_key
  50. assert loaded_data.llm_base_url == init_data.llm_base_url
  51. @pytest.mark.asyncio
  52. async def test_get_instance():
  53. config = AppConfig(file_store='local', file_store_path='/test/path')
  54. with patch(
  55. 'openhands.storage.file_settings_store.get_file_store'
  56. ) as mock_get_store:
  57. mock_store = MagicMock(spec=FileStore)
  58. mock_get_store.return_value = mock_store
  59. store = await FileSettingsStore.get_instance(config, None)
  60. assert isinstance(store, FileSettingsStore)
  61. assert store.file_store == mock_store
  62. mock_get_store.assert_called_once_with('local', '/test/path')