@@ -219,7 +219,8 @@ describe('MCP Servers - Search Servers', () => {
219219 [ ] ,
220220 expect . objectContaining ( {
221221 search : 'test'
222- } )
222+ } ) ,
223+ 'name'
223224 ) ;
224225
225226 expect ( mockReply . status ) . toHaveBeenCalledWith ( 200 ) ;
@@ -276,7 +277,8 @@ describe('MCP Servers - Search Servers', () => {
276277 runtime : 'node' ,
277278 status : 'active' ,
278279 featured : true
279- }
280+ } ,
281+ 'name'
280282 ) ;
281283
282284 expect ( mockReply . status ) . toHaveBeenCalledWith ( 200 ) ;
@@ -386,7 +388,8 @@ describe('MCP Servers - Search Servers', () => {
386388 'test-user-id' ,
387389 'global_admin' ,
388390 [ ] ,
389- expect . any ( Object )
391+ expect . any ( Object ) ,
392+ 'name'
390393 ) ;
391394 } ) ;
392395
@@ -421,7 +424,8 @@ describe('MCP Servers - Search Servers', () => {
421424 'test-user-id' ,
422425 'global_user' ,
423426 [ 'team-1' , 'team-2' ] ,
424- expect . any ( Object )
427+ expect . any ( Object ) ,
428+ 'name'
425429 ) ;
426430 } ) ;
427431
@@ -445,7 +449,8 @@ describe('MCP Servers - Search Servers', () => {
445449 'test-user-id' ,
446450 'global_user' ,
447451 [ ] ,
448- expect . any ( Object )
452+ expect . any ( Object ) ,
453+ 'name'
449454 ) ;
450455 } ) ;
451456
@@ -621,6 +626,66 @@ describe('MCP Servers - Search Servers', () => {
621626 } ) ;
622627 } ) ;
623628
629+ describe ( 'Sorting' , ( ) => {
630+ beforeEach ( async ( ) => {
631+ await searchServers ( mockFastify as FastifyInstance ) ;
632+ } ) ;
633+
634+ it ( 'should sort by name by default' , async ( ) => {
635+ mockMcpService . getServersForUser . mockResolvedValue ( [ ] ) ;
636+
637+ const handler = routeHandlers [ 'GET /mcp/servers/search' ] ;
638+ await handler ( {
639+ ...mockRequest ,
640+ query : { q : 'test' , limit : '20' , offset : '0' }
641+ } , mockReply ) ;
642+
643+ expect ( mockMcpService . getServersForUser ) . toHaveBeenCalledWith (
644+ 'test-user-id' ,
645+ 'global_user' ,
646+ [ ] ,
647+ expect . any ( Object ) ,
648+ 'name'
649+ ) ;
650+ } ) ;
651+
652+ it ( 'should sort by github_stars when specified' , async ( ) => {
653+ mockMcpService . getServersForUser . mockResolvedValue ( [ ] ) ;
654+
655+ const handler = routeHandlers [ 'GET /mcp/servers/search' ] ;
656+ await handler ( {
657+ ...mockRequest ,
658+ query : { q : 'test' , sort_by : 'github_stars' , limit : '20' , offset : '0' }
659+ } , mockReply ) ;
660+
661+ expect ( mockMcpService . getServersForUser ) . toHaveBeenCalledWith (
662+ 'test-user-id' ,
663+ 'global_user' ,
664+ [ ] ,
665+ expect . any ( Object ) ,
666+ 'github_stars'
667+ ) ;
668+ } ) ;
669+
670+ it ( 'should sort by name when explicitly specified' , async ( ) => {
671+ mockMcpService . getServersForUser . mockResolvedValue ( [ ] ) ;
672+
673+ const handler = routeHandlers [ 'GET /mcp/servers/search' ] ;
674+ await handler ( {
675+ ...mockRequest ,
676+ query : { q : 'test' , sort_by : 'name' , limit : '20' , offset : '0' }
677+ } , mockReply ) ;
678+
679+ expect ( mockMcpService . getServersForUser ) . toHaveBeenCalledWith (
680+ 'test-user-id' ,
681+ 'global_user' ,
682+ [ ] ,
683+ expect . any ( Object ) ,
684+ 'name'
685+ ) ;
686+ } ) ;
687+ } ) ;
688+
624689 describe ( 'Query Parameter Validation' , ( ) => {
625690 beforeEach ( async ( ) => {
626691 await searchServers ( mockFastify as FastifyInstance ) ;
@@ -659,7 +724,8 @@ describe('MCP Servers - Search Servers', () => {
659724 'test-user-id' ,
660725 'global_user' ,
661726 [ ] ,
662- expect . objectContaining ( { featured : true } )
727+ expect . objectContaining ( { featured : true } ) ,
728+ 'name'
663729 ) ;
664730
665731 // Test featured: 'false' (as string, which gets converted to boolean)
@@ -672,7 +738,8 @@ describe('MCP Servers - Search Servers', () => {
672738 'test-user-id' ,
673739 'global_user' ,
674740 [ ] ,
675- expect . objectContaining ( { featured : false } )
741+ expect . objectContaining ( { featured : false } ) ,
742+ 'name'
676743 ) ;
677744 } ) ;
678745 } ) ;
0 commit comments