@@ -3,7 +3,6 @@ package v0
33import (
44 "encoding/json"
55 "errors"
6- "fmt"
76 "net/http"
87 "net/http/httptest"
98 "testing"
@@ -263,179 +262,6 @@ func TestServersHandler(t *testing.T) {
263262 }
264263}
265264
266- func TestServersDetailHandler (t * testing.T ) {
267- validServerID := uuid .New ().String ()
268-
269- testCases := []struct {
270- name string
271- method string
272- serverID string
273- setupMocks func (* MockRegistryService )
274- expectedStatus int
275- expectedServerDetail * model.ServerDetail
276- expectedError string
277- }{
278- {
279- name : "successful get server detail" ,
280- method : http .MethodGet ,
281- serverID : validServerID ,
282- setupMocks : func (registry * MockRegistryService ) {
283- serverDetail := & model.ServerDetail {
284- Server : model.Server {
285- ID : validServerID ,
286- Name : "test-server" ,
287- Description : "A test server" ,
288- Repository : model.Repository {
289- URL : "https://github.com/example/test-server" ,
290- Source : "github" ,
291- ID : "example/test-server" ,
292- },
293- VersionDetail : model.VersionDetail {
294- Version : "1.0.0" ,
295- ReleaseDate : "2025-05-25T00:00:00Z" ,
296- IsLatest : true ,
297- },
298- },
299- Packages : []model.Package {
300- {
301- RegistryName : "test-package" ,
302- Name : "example-package" ,
303- Version : "1.0.0" ,
304- },
305- },
306- Remotes : []model.Remote {
307- {
308- TransportType : "http" ,
309- URL : "https://example.com/mcp" ,
310- },
311- },
312- }
313- registry .On ("GetByID" , validServerID ).Return (serverDetail , nil )
314- },
315- expectedStatus : http .StatusOK ,
316- expectedServerDetail : & model.ServerDetail {
317- Server : model.Server {
318- ID : validServerID ,
319- Name : "test-server" ,
320- Description : "A test server" ,
321- Repository : model.Repository {
322- URL : "https://github.com/example/test-server" ,
323- Source : "github" ,
324- ID : "example/test-server" ,
325- },
326- VersionDetail : model.VersionDetail {
327- Version : "1.0.0" ,
328- ReleaseDate : "2025-05-25T00:00:00Z" ,
329- IsLatest : true ,
330- },
331- },
332- Packages : []model.Package {
333- {
334- RegistryName : "test-package" ,
335- Name : "example-package" ,
336- Version : "1.0.0" ,
337- },
338- },
339- Remotes : []model.Remote {
340- {
341- TransportType : "http" ,
342- URL : "https://example.com/mcp" ,
343- },
344- },
345- },
346- },
347- {
348- name : "server not found" ,
349- method : http .MethodGet ,
350- serverID : uuid .New ().String (),
351- setupMocks : func (registry * MockRegistryService ) {
352- registry .On ("GetByID" , mock .AnythingOfType ("string" )).Return ((* model .ServerDetail )(nil ), errors .New ("record not found" ))
353- },
354- expectedStatus : http .StatusNotFound ,
355- expectedError : "Server not found" ,
356- },
357- {
358- name : "invalid server ID format" ,
359- method : http .MethodGet ,
360- serverID : "invalid-uuid" ,
361- setupMocks : func (registry * MockRegistryService ) {
362- // Mock won't be called due to early validation
363- },
364- expectedStatus : http .StatusBadRequest ,
365- expectedError : "Invalid server ID format" ,
366- },
367- {
368- name : "registry service error" ,
369- method : http .MethodGet ,
370- serverID : validServerID ,
371- setupMocks : func (registry * MockRegistryService ) {
372- registry .On ("GetByID" , validServerID ).Return ((* model .ServerDetail )(nil ), errors .New ("database connection error" ))
373- },
374- expectedStatus : http .StatusInternalServerError ,
375- expectedError : "Error retrieving server details" ,
376- },
377- {
378- name : "method not allowed" ,
379- method : http .MethodPost ,
380- serverID : validServerID ,
381- setupMocks : func (registry * MockRegistryService ) {},
382- expectedStatus : http .StatusMethodNotAllowed ,
383- expectedError : "Method not allowed" ,
384- },
385- }
386-
387- for _ , tc := range testCases {
388- t .Run (tc .name , func (t * testing.T ) {
389- // Create mock registry service
390- mockRegistry := new (MockRegistryService )
391- tc .setupMocks (mockRegistry )
392-
393- // Create handler
394- handler := ServersDetailHandler (mockRegistry )
395-
396- // Create request with path value
397- url := fmt .Sprintf ("/v0/servers/%s" , tc .serverID )
398- req , err := http .NewRequest (tc .method , url , nil )
399- if err != nil {
400- t .Fatal (err )
401- }
402-
403- // Set the path value for the server ID (simulating mux behavior)
404- req .SetPathValue ("id" , tc .serverID )
405-
406- // Create response recorder
407- rr := httptest .NewRecorder ()
408-
409- // Call the handler
410- handler .ServeHTTP (rr , req )
411-
412- // Check status code
413- assert .Equal (t , tc .expectedStatus , rr .Code )
414-
415- if tc .expectedStatus == http .StatusOK {
416- // Check content type
417- assert .Equal (t , "application/json" , rr .Header ().Get ("Content-Type" ))
418-
419- // Parse response body
420- var resp model.ServerDetail
421- err = json .NewDecoder (rr .Body ).Decode (& resp )
422- assert .NoError (t , err )
423-
424- // Check the response data
425- assert .Equal (t , * tc .expectedServerDetail , resp )
426- } else {
427- // Check error message for non-200 responses
428- if tc .expectedError != "" {
429- assert .Contains (t , rr .Body .String (), tc .expectedError )
430- }
431- }
432-
433- // Verify mock expectations
434- mockRegistry .AssertExpectations (t )
435- })
436- }
437- }
438-
439265// TestServersHandlerIntegration tests the servers list handler with actual HTTP requests
440266func TestServersHandlerIntegration (t * testing.T ) {
441267 // Create mock registry service
0 commit comments