@@ -7,8 +7,11 @@ import (
77 "time"
88
99 "github.com/stretchr/testify/assert"
10+ "github.com/stretchr/testify/require"
1011 nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1"
1112 "go.uber.org/zap"
13+ "go.uber.org/zap/zapcore"
14+ "go.uber.org/zap/zaptest/observer"
1215)
1316
1417type CacheWarmupMockSource struct {
@@ -330,4 +333,107 @@ func TestCacheWarmup(t *testing.T) {
330333 assert .Len (t , processor .processedItems , 0 )
331334 processor .mux .Unlock ()
332335 })
336+ t .Run ("logs warmup started and completed at info level" , func (t * testing.T ) {
337+ t .Parallel ()
338+ core , logs := observer .New (zapcore .InfoLevel )
339+ logger := zap .New (core )
340+ source := & CacheWarmupMockSource {
341+ items : []* nodev1.Operation {
342+ {
343+ Request : & nodev1.OperationRequest {
344+ Query : "query { foo }" ,
345+ },
346+ },
347+ },
348+ }
349+ processor := & CacheWarmupMockProcessor {
350+ mux : sync.Mutex {},
351+ }
352+ cfg := & CacheWarmupConfig {
353+ Log : logger ,
354+ Source : source ,
355+ Processor : processor ,
356+ ItemsPerSecond : 0 ,
357+ Workers : 2 ,
358+ Timeout : time .Second ,
359+ }
360+ ctx , cancel := context .WithCancel (context .Background ())
361+ defer cancel ()
362+ err := WarmupCaches (ctx , cfg )
363+ require .NoError (t , err )
364+
365+ infoLogs := logs .FilterLevelExact (zapcore .InfoLevel )
366+ messages := make ([]string , infoLogs .Len ())
367+ for i , entry := range infoLogs .All () {
368+ messages [i ] = entry .Message
369+ }
370+ require .Contains (t , messages , "Warmup started" )
371+ require .Contains (t , messages , "Warmup completed" )
372+ })
373+ t .Run ("logs no items to process at info level" , func (t * testing.T ) {
374+ t .Parallel ()
375+ core , logs := observer .New (zapcore .InfoLevel )
376+ logger := zap .New (core )
377+ source := & CacheWarmupMockSource {}
378+ processor := & CacheWarmupMockProcessor {
379+ mux : sync.Mutex {},
380+ }
381+ cfg := & CacheWarmupConfig {
382+ Log : logger ,
383+ Source : source ,
384+ Processor : processor ,
385+ ItemsPerSecond : 0 ,
386+ Workers : 2 ,
387+ Timeout : time .Second ,
388+ }
389+ ctx , cancel := context .WithCancel (context .Background ())
390+ defer cancel ()
391+ err := WarmupCaches (ctx , cfg )
392+ require .NoError (t , err )
393+
394+ infoLogs := logs .FilterLevelExact (zapcore .InfoLevel )
395+ messages := make ([]string , infoLogs .Len ())
396+ for i , entry := range infoLogs .All () {
397+ messages [i ] = entry .Message
398+ }
399+ require .Contains (t , messages , "No items to process" )
400+ })
401+ t .Run ("warmup started and completed not logged at debug level" , func (t * testing.T ) {
402+ t .Parallel ()
403+ // With a DebugLevel observer, Info messages are captured too,
404+ // but the key assertion is that the entries themselves are at InfoLevel, not DebugLevel.
405+ core , logs := observer .New (zapcore .DebugLevel )
406+ logger := zap .New (core )
407+ source := & CacheWarmupMockSource {
408+ items : []* nodev1.Operation {
409+ {
410+ Request : & nodev1.OperationRequest {
411+ Query : "query { foo }" ,
412+ },
413+ },
414+ },
415+ }
416+ processor := & CacheWarmupMockProcessor {
417+ mux : sync.Mutex {},
418+ }
419+ cfg := & CacheWarmupConfig {
420+ Log : logger ,
421+ Source : source ,
422+ Processor : processor ,
423+ ItemsPerSecond : 0 ,
424+ Workers : 2 ,
425+ Timeout : time .Second ,
426+ }
427+ ctx , cancel := context .WithCancel (context .Background ())
428+ defer cancel ()
429+ err := WarmupCaches (ctx , cfg )
430+ require .NoError (t , err )
431+
432+ // Verify that "Warmup started" and "Warmup completed" are logged at Info, not Debug
433+ for _ , entry := range logs .All () {
434+ if entry .Message == "Warmup started" || entry .Message == "Warmup completed" || entry .Message == "No items to process" {
435+ require .Equal (t , zapcore .InfoLevel , entry .Level , "expected %q to be logged at Info level" , entry .Message )
436+ }
437+ }
438+ })
333439}
0 commit comments