11import type { TestingModule } from '@nestjs/testing' ;
2+ import { CACHE_MANAGER } from '@nestjs/cache-manager' ;
23import { Test } from '@nestjs/testing' ;
34
45import { beforeEach , describe , expect , it , vi } from 'vitest' ;
56
7+ import { ContainerState } from '@app/unraid-api/graph/resolvers/docker/docker.model.js' ;
8+ import { DockerService } from '@app/unraid-api/graph/resolvers/docker/docker.service.js' ;
69import { InfoService } from '@app/unraid-api/graph/resolvers/info/info.service.js' ;
710
811// Mock external dependencies
912vi . mock ( 'fs/promises' , ( ) => ( {
1013 access : vi . fn ( ) . mockResolvedValue ( undefined ) ,
14+ readFile : vi . fn ( ) . mockResolvedValue ( '' ) ,
1115} ) ) ;
1216
1317vi . mock ( 'execa' , ( ) => ( {
@@ -35,12 +39,24 @@ vi.mock('@app/common/dashboard/get-unraid-version.js', () => ({
3539 getUnraidVersion : vi . fn ( ) ,
3640} ) ) ;
3741
38- vi . mock ( '@app/core/utils/clients/docker.js' , ( ) => ( {
39- docker : {
40- listContainers : vi . fn ( ) ,
42+ vi . mock ( '@app/core/pubsub.js' , ( ) => ( {
43+ pubsub : {
44+ publish : vi . fn ( ) . mockResolvedValue ( undefined ) ,
45+ } ,
46+ PUBSUB_CHANNEL : {
47+ INFO : 'info' ,
4148 } ,
4249} ) ) ;
4350
51+ vi . mock ( 'dockerode' , ( ) => {
52+ return {
53+ default : vi . fn ( ) . mockImplementation ( ( ) => ( {
54+ listContainers : vi . fn ( ) ,
55+ listNetworks : vi . fn ( ) ,
56+ } ) ) ,
57+ } ;
58+ } ) ;
59+
4460vi . mock ( '@app/core/utils/misc/clean-stdout.js' , ( ) => ( {
4561 cleanStdout : vi . fn ( ( input ) => input ) ,
4662} ) ) ;
@@ -68,13 +84,21 @@ vi.mock('@app/store/index.js', () => ({
6884 } ) ,
6985 paths : ( ) => ( {
7086 'dynamix-config' : [ '/test/config/path' ] ,
87+ 'docker-autostart' : '/path/to/docker-autostart' ,
7188 } ) ,
7289 } ,
7390} ) ) ;
7491
92+ // Mock Cache Manager
93+ const mockCacheManager = {
94+ get : vi . fn ( ) ,
95+ set : vi . fn ( ) ,
96+ del : vi . fn ( ) ,
97+ } ;
98+
7599describe ( 'InfoService' , ( ) => {
76100 let service : InfoService ;
77- let mockDocker : any ;
101+ let dockerService : DockerService ;
78102 let mockSystemInfo : any ;
79103 let mockExeca : any ;
80104 let mockGetUnraidVersion : any ;
@@ -83,15 +107,25 @@ describe('InfoService', () => {
83107 beforeEach ( async ( ) => {
84108 // Reset all mocks
85109 vi . clearAllMocks ( ) ;
110+ mockCacheManager . get . mockReset ( ) ;
111+ mockCacheManager . set . mockReset ( ) ;
112+ mockCacheManager . del . mockReset ( ) ;
86113
87114 const module : TestingModule = await Test . createTestingModule ( {
88- providers : [ InfoService ] ,
115+ providers : [
116+ InfoService ,
117+ DockerService ,
118+ {
119+ provide : CACHE_MANAGER ,
120+ useValue : mockCacheManager ,
121+ } ,
122+ ] ,
89123 } ) . compile ( ) ;
90124
91125 service = module . get < InfoService > ( InfoService ) ;
126+ dockerService = module . get < DockerService > ( DockerService ) ;
92127
93128 // Get mock references
94- mockDocker = await import ( '@app/core/utils/clients/docker.js' ) ;
95129 mockSystemInfo = await import ( 'systeminformation' ) ;
96130 mockExeca = await import ( 'execa' ) ;
97131 mockGetUnraidVersion = await import ( '@app/common/dashboard/get-unraid-version.js' ) ;
@@ -105,14 +139,12 @@ describe('InfoService', () => {
105139 describe ( 'generateApps' , ( ) => {
106140 it ( 'should return docker container statistics' , async ( ) => {
107141 const mockContainers = [
108- { id : '1' , status : 'running' } ,
109- { id : '2' , status : 'exited' } ,
110- { id : '3' , status : 'running' } ,
142+ { id : '1' , state : ContainerState . RUNNING } ,
143+ { id : '2' , state : ContainerState . EXITED } ,
144+ { id : '3' , state : ContainerState . RUNNING } ,
111145 ] ;
112146
113- mockDocker . docker . listContainers
114- . mockResolvedValueOnce ( mockContainers ) // all containers
115- . mockResolvedValueOnce ( [ mockContainers [ 0 ] , mockContainers [ 2 ] ] ) ; // running containers
147+ mockCacheManager . get . mockResolvedValue ( mockContainers ) ;
116148
117149 const result = await service . generateApps ( ) ;
118150
@@ -124,7 +156,7 @@ describe('InfoService', () => {
124156 } ) ;
125157
126158 it ( 'should handle docker errors gracefully' , async ( ) => {
127- mockDocker . docker . listContainers . mockRejectedValue ( new Error ( 'Docker error' ) ) ;
159+ mockCacheManager . get . mockResolvedValue ( [ ] ) ;
128160
129161 const result = await service . generateApps ( ) ;
130162
0 commit comments