@@ -1416,6 +1416,105 @@ describe('Docker Watcher', () => {
14161416 expect ( storeContainer . updateContainer ) . not . toHaveBeenCalled ( ) ;
14171417 } ) ;
14181418
1419+ test ( 'should use old container name when inspect name is empty and compose trigger is created' , async ( ) => {
1420+ await docker . register ( 'watcher' , 'docker' , 'test' , { } ) ;
1421+ docker . log = createMockLogWithChild ( [ 'info' ] ) ;
1422+ mockContainer . inspect . mockResolvedValue ( {
1423+ Name : '' ,
1424+ State : { Status : 'running' } ,
1425+ Config : {
1426+ Labels : {
1427+ 'dd.compose.file' : '/tmp/my-stack/docker-compose.yml' ,
1428+ } ,
1429+ } ,
1430+ } ) ;
1431+ const existingContainer = {
1432+ id : 'container123' ,
1433+ name : 'old-compose-name' ,
1434+ displayName : 'old-compose-name' ,
1435+ status : 'running' ,
1436+ image : { name : 'library/nginx' } ,
1437+ labels : {
1438+ 'dd.compose.file' : '/tmp/my-stack/docker-compose.yml' ,
1439+ } ,
1440+ } ;
1441+ storeContainer . getContainer . mockReturnValue ( existingContainer ) ;
1442+
1443+ await docker . onDockerEvent ( Buffer . from ( '{"Action":"start","id":"container123"}\n' ) ) ;
1444+
1445+ expect ( registry . ensureDockercomposeTriggerForContainer ) . toHaveBeenCalledWith (
1446+ 'old-compose-name' ,
1447+ '/tmp/my-stack/docker-compose.yml' ,
1448+ { } ,
1449+ ) ;
1450+ } ) ;
1451+
1452+ test ( 'should use old container name in warning when compose trigger creation fails and inspect name is empty' , async ( ) => {
1453+ await docker . register ( 'watcher' , 'docker' , 'test' , { } ) ;
1454+ docker . log = createMockLogWithChild ( [ 'warn' ] ) ;
1455+ mockContainer . inspect . mockResolvedValue ( {
1456+ Name : '' ,
1457+ State : { Status : 'running' } ,
1458+ Config : {
1459+ Labels : {
1460+ 'dd.compose.file' : '/tmp/my-stack/docker-compose.yml' ,
1461+ } ,
1462+ } ,
1463+ } ) ;
1464+ const existingContainer = {
1465+ id : 'container123' ,
1466+ name : 'old-compose-name' ,
1467+ displayName : 'old-compose-name' ,
1468+ status : 'running' ,
1469+ image : { name : 'library/nginx' } ,
1470+ labels : {
1471+ 'dd.compose.file' : '/tmp/my-stack/docker-compose.yml' ,
1472+ } ,
1473+ } ;
1474+ storeContainer . getContainer . mockReturnValue ( existingContainer ) ;
1475+
1476+ vi . spyOn ( registry , 'ensureDockercomposeTriggerForContainer' ) . mockRejectedValueOnce (
1477+ new Error ( 'event create failed' ) ,
1478+ ) ;
1479+
1480+ await docker . onDockerEvent ( Buffer . from ( '{"Action":"start","id":"container123"}\n' ) ) ;
1481+
1482+ expect ( docker . log . _child . warn ) . toHaveBeenCalledWith (
1483+ expect . stringContaining ( 'old-compose-name' ) ,
1484+ ) ;
1485+ } ) ;
1486+
1487+ test ( 'should skip update when compose label is absent, cached trigger exists, and trigger include is unchanged' , async ( ) => {
1488+ await docker . register ( 'watcher' , 'docker' , 'test' , { } ) ;
1489+ docker . log = createMockLogWithChild ( [ 'info' ] ) ;
1490+ mockContainer . inspect . mockResolvedValue ( {
1491+ Name : '/compose-container' ,
1492+ State : { Status : 'running' } ,
1493+ Config : {
1494+ Labels : { } ,
1495+ } ,
1496+ } ) ;
1497+ const existingContainer = {
1498+ id : 'container123' ,
1499+ name : 'compose-container' ,
1500+ displayName : 'compose-container' ,
1501+ status : 'running' ,
1502+ image : { name : 'library/nginx' } ,
1503+ labels : { } ,
1504+ triggerInclude : undefined ,
1505+ } ;
1506+ docker . composeTriggersByContainer = {
1507+ container123 : 'dockercompose.my-stack-compose-container' ,
1508+ } ;
1509+ storeContainer . getContainer . mockReturnValue ( existingContainer ) ;
1510+
1511+ await docker . onDockerEvent ( Buffer . from ( '{"Action":"start","id":"container123"}\n' ) ) ;
1512+
1513+ expect ( existingContainer . triggerInclude ) . toBeUndefined ( ) ;
1514+ expect ( docker . composeTriggersByContainer . container123 ) . toBeUndefined ( ) ;
1515+ expect ( storeContainer . updateContainer ) . not . toHaveBeenCalled ( ) ;
1516+ } ) ;
1517+
14191518 test ( 'should skip store update when inspect payload does not change tracked fields' , async ( ) => {
14201519 await docker . register ( 'watcher' , 'docker' , 'test' , { } ) ;
14211520 docker . log = createMockLogWithChild ( [ 'info' ] ) ;
@@ -4619,6 +4718,10 @@ describe('Docker Watcher', () => {
46194718 expect ( testable_removeTriggerId ( 'ntfy.default:major' , undefined ) ) . toBe ( 'ntfy.default:major' ) ;
46204719 } ) ;
46214720
4721+ test ( 'removeTriggerId should return undefined when last trigger is removed' , ( ) => {
4722+ expect ( testable_removeTriggerId ( 'dockercompose.test' , 'dockercompose.test' ) ) . toBeUndefined ( ) ;
4723+ } ) ;
4724+
46224725
46234726 test ( 'getCurrentPrefix should return the non-numeric prefix before the first digit' , ( ) => {
46244727 expect ( testable_getCurrentPrefix ( 'v2026.2.1' ) ) . toBe ( 'v' ) ;
0 commit comments