@@ -440,6 +440,78 @@ describe("registerTemplateTools", () => {
440440 expect ( hevyClient . getExerciseTemplates ) . toHaveBeenCalledTimes ( 2 ) ;
441441 } ) ;
442442
443+ it ( "logs successful initial and explicit refreshes but stays silent on cache hits" , async ( ) => {
444+ const { server, tool } = createMockServer ( ) ;
445+ const logger = vi . fn ( ) ;
446+ const template : ExerciseTemplate = {
447+ id : "t1" ,
448+ title : "Bench Press" ,
449+ type : "barbell" ,
450+ primary_muscle_group : "chest" ,
451+ secondary_muscle_groups : [ ] ,
452+ is_custom : false ,
453+ } ;
454+ const hevyClient : HevyClient = {
455+ getExerciseTemplates : vi . fn ( ) . mockResolvedValue ( {
456+ page : 1 ,
457+ page_count : 1 ,
458+ exercise_templates : [ template ] ,
459+ } ) ,
460+ } as unknown as HevyClient ;
461+
462+ registerTemplateTools ( server , hevyClient , { logger } ) ;
463+ const { handler } = getToolRegistration (
464+ tool ,
465+ "search-exercise-templates" ,
466+ ) ;
467+
468+ await handler ( { query : "bench" , refresh : false } ) ;
469+ expect ( logger ) . toHaveBeenCalledExactlyOnceWith ( {
470+ level : "info" ,
471+ logger : "hevy-cache" ,
472+ data : {
473+ message : "Exercise template catalog refreshed" ,
474+ count : 1 ,
475+ reason : "initial-load" ,
476+ } ,
477+ } ) ;
478+
479+ await handler ( { query : "bench" , refresh : false } ) ;
480+ expect ( logger ) . toHaveBeenCalledTimes ( 1 ) ;
481+
482+ await handler ( { query : "bench" , refresh : true } ) ;
483+ expect ( logger ) . toHaveBeenNthCalledWith ( 2 , {
484+ level : "info" ,
485+ logger : "hevy-cache" ,
486+ data : {
487+ message : "Exercise template catalog refreshed" ,
488+ count : 1 ,
489+ reason : "explicit-refresh" ,
490+ } ,
491+ } ) ;
492+ } ) ;
493+
494+ it ( "does not log a cache refresh when the catalog fetch fails" , async ( ) => {
495+ const { server, tool } = createMockServer ( ) ;
496+ const logger = vi . fn ( ) ;
497+ const hevyClient : HevyClient = {
498+ getExerciseTemplates : vi
499+ . fn ( )
500+ . mockRejectedValue ( new Error ( "catalog fetch failed" ) ) ,
501+ } as unknown as HevyClient ;
502+
503+ registerTemplateTools ( server , hevyClient , { logger } ) ;
504+ const { handler } = getToolRegistration (
505+ tool ,
506+ "search-exercise-templates" ,
507+ ) ;
508+
509+ const response = await handler ( { query : "bench" , refresh : false } ) ;
510+
511+ expect ( response ) . toMatchObject ( { isError : true } ) ;
512+ expect ( logger ) . not . toHaveBeenCalled ( ) ;
513+ } ) ;
514+
443515 it ( "filters by primaryMuscleGroup when provided" , async ( ) => {
444516 const { server, tool } = createMockServer ( ) ;
445517 const chestTemplate : ExerciseTemplate = {
0 commit comments