@@ -4,6 +4,14 @@ import {
44 assert ,
55 assertThrows ,
66} from "https://deno.land/std@0.208.0/assert/mod.ts" ;
7+ import {
8+ getRestartCount ,
9+ getStopCount ,
10+ restartContainer ,
11+ stopContainer ,
12+ resetContainerActionStatsForTest ,
13+ setCommandExecutorForTest ,
14+ } from "../utils/auto-restart.ts" ;
715
816type ContainerStatus = 'running' | 'exited' | 'paused' | 'unhealthy' | 'unknown' ;
917type TimeStep = '1s' | '15s' | '1m' | '5m' | '1h' | '1d' ;
@@ -623,105 +631,93 @@ Deno.test("TIME_RANGE_PRESETS - all presets defined", () => {
623631} ) ;
624632
625633Deno . test ( "getRestartCount - returns 0 for unknown container" , ( ) => {
626- const restartCounts = new Map < string , { count : number ; lastRestart : Date } > ( ) ;
627-
628- const getRestartCount = ( containerName : string ) : number => {
629- return restartCounts . get ( containerName ) ?. count || 0 ;
630- } ;
634+ resetContainerActionStatsForTest ( ) ;
631635
632636 assertEquals ( getRestartCount ( "unknown-container" ) , 0 ) ;
633637} ) ;
634638
635- Deno . test ( "getRestartCount - returns correct count" , ( ) => {
636- const restartCounts = new Map < string , { count : number ; lastRestart : Date } > ( ) ;
637- restartCounts . set ( "test-container" , { count : 3 , lastRestart : new Date ( ) } ) ;
639+ Deno . test ( "getRestartCount - returns correct count" , async ( ) => {
640+ resetContainerActionStatsForTest ( ) ;
641+ setCommandExecutorForTest ( async ( ) => { } ) ;
638642
639- const getRestartCount = ( containerName : string ) : number => {
640- return restartCounts . get ( containerName ) ?. count || 0 ;
641- } ;
643+ try {
644+ await restartContainer ( "test-container" ) ;
645+ await restartContainer ( "test-container" ) ;
646+ await restartContainer ( "test-container" ) ;
647+ } finally {
648+ setCommandExecutorForTest ( null ) ;
649+ }
642650
643651 assertEquals ( getRestartCount ( "test-container" ) , 3 ) ;
644652} ) ;
645653
646- Deno . test ( "getRestartCount - tracks multiple containers separately" , ( ) => {
647- const restartCounts = new Map < string , { count : number ; lastRestart : Date } > ( ) ;
648- restartCounts . set ( "container-a" , { count : 2 , lastRestart : new Date ( ) } ) ;
649- restartCounts . set ( "container-b" , { count : 5 , lastRestart : new Date ( ) } ) ;
654+ Deno . test ( "getRestartCount - tracks multiple containers separately" , async ( ) => {
655+ resetContainerActionStatsForTest ( ) ;
656+ setCommandExecutorForTest ( async ( ) => { } ) ;
650657
651- const getRestartCount = ( containerName : string ) : number => {
652- return restartCounts . get ( containerName ) ?. count || 0 ;
653- } ;
658+ try {
659+ await restartContainer ( "container-a" ) ;
660+ await restartContainer ( "container-a" ) ;
661+ await restartContainer ( "container-b" ) ;
662+ await restartContainer ( "container-b" ) ;
663+ await restartContainer ( "container-b" ) ;
664+ await restartContainer ( "container-b" ) ;
665+ await restartContainer ( "container-b" ) ;
666+ } finally {
667+ setCommandExecutorForTest ( null ) ;
668+ }
654669
655670 assertEquals ( getRestartCount ( "container-a" ) , 2 ) ;
656671 assertEquals ( getRestartCount ( "container-b" ) , 5 ) ;
657672} ) ;
658673
659- Deno . test ( "getStopCount - returns correct count" , ( ) => {
660- const stopCounts = new Map < string , { count : number ; lastStop : Date } > ( ) ;
661- stopCounts . set ( "test-container" , { count : 3 , lastStop : new Date ( ) } ) ;
674+ Deno . test ( "getStopCount - returns correct count" , async ( ) => {
675+ resetContainerActionStatsForTest ( ) ;
676+ setCommandExecutorForTest ( async ( ) => { } ) ;
662677
663- const getStopCount = ( containerName : string ) : number => {
664- return stopCounts . get ( containerName ) ?. count || 0 ;
665- } ;
678+ try {
679+ await stopContainer ( "test-container" ) ;
680+ await stopContainer ( "test-container" ) ;
681+ await stopContainer ( "test-container" ) ;
682+ } finally {
683+ setCommandExecutorForTest ( null ) ;
684+ }
666685
667686 assertEquals ( getStopCount ( "test-container" ) , 3 ) ;
668687} ) ;
669688
670689Deno . test ( "restartContainer - updates restart count" , async ( ) => {
671- const restartCounts = new Map < string , { count : number ; lastRestart : Date } > ( ) ;
672- restartCounts . set ( "test-container" , { count : 1 , lastRestart : new Date ( Date . now ( ) - 10000 ) } ) ;
673-
690+ resetContainerActionStatsForTest ( ) ;
674691 let execCalledWith = "" ;
675- const mockExec = async ( cmd : string ) => {
692+ setCommandExecutorForTest ( async ( cmd : string ) => {
676693 execCalledWith = cmd ;
677- } ;
678-
679- const restartContainer = async ( containerName : string ) : Promise < void > => {
680- await mockExec ( `bash -c "echo 'bash ../../src/backend/shell_scripts/restart.sh ${ containerName } ' > /hostpipe/pipe"` ) ;
681- const current = restartCounts . get ( containerName ) ;
682- restartCounts . set ( containerName , {
683- count : ( current ?. count || 0 ) + 1 ,
684- lastRestart : new Date ( ) ,
685- } ) ;
686- } ;
694+ } ) ;
687695
688- const before = new Date ( ) ;
689- await restartContainer ( "test-container" ) ;
690- const after = new Date ( ) ;
696+ try {
697+ await restartContainer ( "test-container" ) ;
698+ } finally {
699+ setCommandExecutorForTest ( null ) ;
700+ }
691701
692702 assertEquals ( execCalledWith , `bash -c "echo 'bash ../../src/backend/shell_scripts/restart.sh test-container' > /hostpipe/pipe"` ) ;
693-
694- const stats = restartCounts . get ( "test-container" ) ;
695- assertExists ( stats ) ;
696- assertEquals ( stats . count , 2 ) ;
697- assert ( stats . lastRestart . getTime ( ) >= before . getTime ( ) && stats . lastRestart . getTime ( ) <= after . getTime ( ) ) ;
703+ assertEquals ( getRestartCount ( "test-container" ) , 1 ) ;
698704} ) ;
699705
700706Deno . test ( "stopContainer - updates stop count and calls stop script" , async ( ) => {
701- const stopCounts = new Map < string , { count : number ; lastStop : Date } > ( ) ;
707+ resetContainerActionStatsForTest ( ) ;
702708 let execCalledWith = "" ;
703- const mockExec = async ( cmd : string ) => {
709+ setCommandExecutorForTest ( async ( cmd : string ) => {
704710 execCalledWith = cmd ;
705- } ;
706-
707- const stopContainer = async ( containerName : string ) : Promise < void > => {
708- await mockExec ( `bash -c "echo 'bash ../../src/backend/shell_scripts/stop.sh ${ containerName } ' > /hostpipe/pipe"` ) ;
709- const current = stopCounts . get ( containerName ) ;
710- stopCounts . set ( containerName , {
711- count : ( current ?. count || 0 ) + 1 ,
712- lastStop : new Date ( ) ,
713- } ) ;
714- } ;
711+ } ) ;
715712
716- const before = new Date ( ) ;
717- await stopContainer ( "test-container" ) ;
718- const after = new Date ( ) ;
713+ try {
714+ await stopContainer ( "test-container" ) ;
715+ } finally {
716+ setCommandExecutorForTest ( null ) ;
717+ }
719718
720719 assertEquals ( execCalledWith , `bash -c "echo 'bash ../../src/backend/shell_scripts/stop.sh test-container' > /hostpipe/pipe"` ) ;
721- const stats = stopCounts . get ( "test-container" ) ;
722- assertExists ( stats ) ;
723- assertEquals ( stats . count , 1 ) ;
724- assert ( stats . lastStop . getTime ( ) >= before . getTime ( ) && stats . lastStop . getTime ( ) <= after . getTime ( ) ) ;
720+ assertEquals ( getStopCount ( "test-container" ) , 1 ) ;
725721} ) ;
726722
727723Deno . test ( "ContainerStats - validates all required fields" , ( ) => {
0 commit comments