@@ -104,30 +104,22 @@ class TestServerService:
104
104
async def test_register_server (
105
105
self , server_service , test_db , mock_tool , mock_resource , mock_prompt
106
106
):
107
- """Successful registration returns populated ServerRead."""
107
+ """
108
+ Successful registration returns a populated ServerRead.
109
+ We DO NOT patch DbServer – we let SQLAlchemy keep the real mapped class
110
+ so that select(DbServer) works correctly.
111
+ """
112
+ # Pretend there is no existing server with the same name
108
113
mock_scalar = Mock ()
109
114
mock_scalar .scalar_one_or_none .return_value = None
110
115
test_db .execute = Mock (return_value = mock_scalar )
116
+
117
+ # Basic Session stubs
111
118
test_db .add = Mock ()
112
119
test_db .commit = Mock ()
113
120
test_db .refresh = Mock ()
114
121
115
- # Create a mock server instance that will be returned by db.add
116
- mock_db_server = MagicMock (spec = DbServer )
117
- mock_db_server .id = 1
118
- mock_db_server .name = "test_server"
119
- mock_db_server .description = "A test server"
120
- mock_db_server .icon = "server-icon"
121
- mock_db_server .created_at = "2023-01-01T00:00:00"
122
- mock_db_server .updated_at = "2023-01-01T00:00:00"
123
- mock_db_server .is_active = True
124
-
125
- # Mock the relationship lists as simple lists
126
- mock_db_server .tools = []
127
- mock_db_server .resources = []
128
- mock_db_server .prompts = []
129
-
130
- # Stub db.get to resolve associated items
122
+ # Resolve associated objects
131
123
test_db .get = Mock (
132
124
side_effect = lambda cls , _id : {
133
125
(DbTool , 101 ): mock_tool ,
@@ -136,7 +128,7 @@ async def test_register_server(
136
128
}.get ((cls , _id ))
137
129
)
138
130
139
- # Patch conversion helper
131
+ # Stub helper that converts to the public schema
140
132
server_service ._notify_server_added = AsyncMock ()
141
133
server_service ._convert_server_to_read = Mock (
142
134
return_value = ServerRead (
@@ -172,10 +164,10 @@ async def test_register_server(
172
164
associated_prompts = ["301" ],
173
165
)
174
166
175
- # Mock the DbServer constructor to return our mock instance
176
- with patch ('mcpgateway.services.server_service.DbServer' , return_value = mock_db_server ):
177
- result = await server_service .register_server (test_db , server_create )
167
+ # Run
168
+ result = await server_service .register_server (test_db , server_create )
178
169
170
+ # Assertions
179
171
test_db .add .assert_called_once ()
180
172
test_db .commit .assert_called_once ()
181
173
test_db .refresh .assert_called_once ()
@@ -186,6 +178,7 @@ async def test_register_server(
186
178
assert 201 in result .associated_resources
187
179
assert 301 in result .associated_prompts
188
180
181
+
189
182
@pytest .mark .asyncio
190
183
async def test_register_server_name_conflict (self , server_service , mock_server , test_db ):
191
184
"""Server name clash is surfaced as ServerError (wrapped by service)."""
@@ -206,11 +199,16 @@ async def test_register_server_name_conflict(self, server_service, mock_server,
206
199
207
200
@pytest .mark .asyncio
208
201
async def test_register_server_invalid_associated_tool (self , server_service , test_db ):
209
- """Non-existent associated tool raises ServerError."""
202
+ """
203
+ Non‑existent associated tool raises ServerError.
204
+ No patching of DbServer – keep the real mapped class intact.
205
+ """
206
+ # No existing server with the same name
210
207
mock_scalar = Mock ()
211
208
mock_scalar .scalar_one_or_none .return_value = None
212
209
test_db .execute = Mock (return_value = mock_scalar )
213
210
211
+ # Simulate lookup failure for tool id 999
214
212
test_db .get = Mock (return_value = None )
215
213
test_db .rollback = Mock ()
216
214
@@ -220,19 +218,13 @@ async def test_register_server_invalid_associated_tool(self, server_service, tes
220
218
associated_tools = ["999" ],
221
219
)
222
220
223
- # Mock the DbServer constructor
224
- mock_db_server = MagicMock (spec = DbServer )
225
- mock_db_server .tools = []
226
- mock_db_server .resources = []
227
- mock_db_server .prompts = []
228
-
229
- with patch ('mcpgateway.services.server_service.DbServer' , return_value = mock_db_server ):
230
- with pytest .raises (ServerError ) as exc :
231
- await server_service .register_server (test_db , server_create )
221
+ with pytest .raises (ServerError ) as exc :
222
+ await server_service .register_server (test_db , server_create )
232
223
233
224
assert "Tool with id 999 does not exist" in str (exc .value )
234
225
test_db .rollback .assert_called_once ()
235
226
227
+
236
228
# --------------------------- list & get ----------------------------- #
237
229
@pytest .mark .asyncio
238
230
async def test_list_servers (self , server_service , mock_server , test_db ):
0 commit comments