forked from OpenHands/OpenHands
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathtest_file_settings_store.py
More file actions
136 lines (111 loc) · 4.57 KB
/
Copy pathtest_file_settings_store.py
File metadata and controls
136 lines (111 loc) · 4.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
from unittest.mock import MagicMock, patch
import pytest
from openhands.core.config.app_config import AppConfig
from openhands.server.settings import Settings
from openhands.storage.files import FileStore
from openhands.storage.settings.file_settings_store import FileSettingsStore
@pytest.fixture
def mock_file_store():
return MagicMock(spec=FileStore)
@pytest.fixture
def file_settings_store(mock_file_store):
return FileSettingsStore(mock_file_store)
@pytest.mark.asyncio
async def test_load_nonexistent_data(file_settings_store):
with patch(
'openhands.server.settings.load_app_config',
MagicMock(return_value=AppConfig()),
):
file_settings_store.file_store.read.side_effect = FileNotFoundError()
assert await file_settings_store.load() is None
@pytest.mark.asyncio
async def test_store_and_load_data_via_user_id_constructor(mock_file_store):
# Test data
user_id = '0xd8b8e45f7b49f7e894c967f05b51d5acd4b81cc1'
file_settings_store = FileSettingsStore(mock_file_store, user_id=user_id)
init_data = Settings(
language='python',
agent='test-agent',
max_iterations=100,
security_analyzer='default',
confirmation_mode=True,
llm_model='test-model',
llm_api_key='test-key',
llm_base_url='https://test.com',
)
# Store data
await file_settings_store.store(init_data)
# Verify store called with correct JSON
expected_json = init_data.model_dump_json(context={'expose_secrets': True})
file_settings_store.file_store.write.assert_called_once_with(
f'users/{user_id}/settings.json', expected_json
)
# Setup mock for load
file_settings_store.file_store.read.return_value = expected_json
# Load and verify data
loaded_data = await file_settings_store.load(user_id)
assert loaded_data is not None
assert loaded_data.language == init_data.language
assert loaded_data.agent == init_data.agent
assert loaded_data.max_iterations == init_data.max_iterations
assert loaded_data.security_analyzer == init_data.security_analyzer
assert loaded_data.confirmation_mode == init_data.confirmation_mode
assert loaded_data.llm_model == init_data.llm_model
assert loaded_data.llm_api_key
assert init_data.llm_api_key
assert (
loaded_data.llm_api_key.get_secret_value()
== init_data.llm_api_key.get_secret_value()
)
assert loaded_data.llm_base_url == init_data.llm_base_url
@pytest.mark.asyncio
async def test_store_and_load_data(file_settings_store):
# Test data
user_id = '0xd8b8e45f7b49f7e894c967f05b51d5acd4b81cc1'
init_data = Settings(
language='python',
agent='test-agent',
max_iterations=100,
security_analyzer='default',
confirmation_mode=True,
llm_model='test-model',
llm_api_key='test-key',
llm_base_url='https://test.com',
)
# Store data
await file_settings_store.store(init_data, user_id)
# Verify store called with correct JSON
expected_json = init_data.model_dump_json(context={'expose_secrets': True})
file_settings_store.file_store.write.assert_called_once_with(
f'users/{user_id}/settings.json', expected_json
)
# Setup mock for load
file_settings_store.file_store.read.return_value = expected_json
# Load and verify data
loaded_data = await file_settings_store.load(user_id)
assert loaded_data is not None
assert loaded_data.language == init_data.language
assert loaded_data.agent == init_data.agent
assert loaded_data.max_iterations == init_data.max_iterations
assert loaded_data.security_analyzer == init_data.security_analyzer
assert loaded_data.confirmation_mode == init_data.confirmation_mode
assert loaded_data.llm_model == init_data.llm_model
assert loaded_data.llm_api_key
assert init_data.llm_api_key
assert (
loaded_data.llm_api_key.get_secret_value()
== init_data.llm_api_key.get_secret_value()
)
assert loaded_data.llm_base_url == init_data.llm_base_url
@pytest.mark.asyncio
async def test_get_instance():
config = AppConfig(file_store='local', file_store_path='/test/path')
with patch(
'openhands.storage.settings.file_settings_store.get_file_store'
) as mock_get_store:
mock_store = MagicMock(spec=FileStore)
mock_get_store.return_value = mock_store
store = await FileSettingsStore.get_instance(config, None)
assert isinstance(store, FileSettingsStore)
assert store.file_store == mock_store
mock_get_store.assert_called_once_with('local', '/test/path')