Skip to content

Commit c754c7b

Browse files
committed
chore: cleanup info apps to use the docker service
1 parent d1a3c59 commit c754c7b

3 files changed

Lines changed: 105 additions & 24 deletions

File tree

api/src/unraid-api/graph/resolvers/info/info.resolver.spec.ts

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,65 @@
11
import type { TestingModule } from '@nestjs/testing';
2+
import { CACHE_MANAGER } from '@nestjs/cache-manager';
23
import { Test } from '@nestjs/testing';
34

4-
import { beforeEach, describe, expect, it } from 'vitest';
5+
import { beforeEach, describe, expect, it, vi } from 'vitest';
56

7+
import { DockerService } from '@app/unraid-api/graph/resolvers/docker/docker.service.js';
68
import { InfoResolver } from '@app/unraid-api/graph/resolvers/info/info.resolver.js';
79
import { InfoService } from '@app/unraid-api/graph/resolvers/info/info.service.js';
810

11+
// Mock necessary modules
12+
vi.mock('fs/promises', () => ({
13+
readFile: vi.fn().mockResolvedValue(''),
14+
}));
15+
16+
vi.mock('@app/core/pubsub.js', () => ({
17+
pubsub: {
18+
publish: vi.fn().mockResolvedValue(undefined),
19+
},
20+
PUBSUB_CHANNEL: {
21+
INFO: 'info',
22+
},
23+
}));
24+
25+
vi.mock('dockerode', () => {
26+
return {
27+
default: vi.fn().mockImplementation(() => ({
28+
listContainers: vi.fn(),
29+
listNetworks: vi.fn(),
30+
})),
31+
};
32+
});
33+
34+
vi.mock('@app/store/index.js', () => ({
35+
getters: {
36+
paths: () => ({
37+
'docker-autostart': '/path/to/docker-autostart',
38+
}),
39+
},
40+
}));
41+
42+
// Mock Cache Manager
43+
const mockCacheManager = {
44+
get: vi.fn(),
45+
set: vi.fn(),
46+
del: vi.fn(),
47+
};
48+
949
describe('InfoResolver', () => {
1050
let resolver: InfoResolver;
1151

1252
beforeEach(async () => {
1353
const module: TestingModule = await Test.createTestingModule({
14-
providers: [InfoResolver, InfoService],
54+
providers: [
55+
InfoResolver,
56+
InfoService,
57+
DockerService,
58+
{
59+
provide: CACHE_MANAGER,
60+
useValue: mockCacheManager,
61+
},
62+
],
1563
}).compile();
1664

1765
resolver = module.get<InfoResolver>(InfoResolver);

api/src/unraid-api/graph/resolvers/info/info.service.spec.ts

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
import type { TestingModule } from '@nestjs/testing';
2+
import { CACHE_MANAGER } from '@nestjs/cache-manager';
23
import { Test } from '@nestjs/testing';
34

45
import { 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';
69
import { InfoService } from '@app/unraid-api/graph/resolvers/info/info.service.js';
710

811
// Mock external dependencies
912
vi.mock('fs/promises', () => ({
1013
access: vi.fn().mockResolvedValue(undefined),
14+
readFile: vi.fn().mockResolvedValue(''),
1115
}));
1216

1317
vi.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+
4460
vi.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+
7599
describe('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

api/src/unraid-api/graph/resolvers/info/info.service.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ import { getUnraidVersion } from '@app/common/dashboard/get-unraid-version.js';
99
import { AppError } from '@app/core/errors/app-error.js';
1010
import { type DynamixConfig } from '@app/core/types/ini.js';
1111
import { toBoolean } from '@app/core/utils/casting.js';
12-
import { docker } from '@app/core/utils/clients/docker.js';
1312
import { cleanStdout } from '@app/core/utils/misc/clean-stdout.js';
1413
import { loadState } from '@app/core/utils/misc/load-state.js';
1514
import { getters } from '@app/store/index.js';
1615
import { ThemeName } from '@app/unraid-api/graph/resolvers/customization/theme.model.js';
16+
import { ContainerState } from '@app/unraid-api/graph/resolvers/docker/docker.model.js';
17+
import { DockerService } from '@app/unraid-api/graph/resolvers/docker/docker.service.js';
1718
import {
1819
Devices,
1920
Display,
@@ -28,15 +29,15 @@ import {
2829

2930
@Injectable()
3031
export class InfoService {
32+
constructor(private readonly dockerService: DockerService) {}
33+
3134
async generateApps(): Promise<InfoApps> {
32-
const installed = await docker
33-
.listContainers({ all: true })
34-
.catch(() => [])
35-
.then((containers) => containers.length);
36-
const started = await docker
37-
.listContainers()
38-
.catch(() => [])
39-
.then((containers) => containers.length);
35+
const containers = await this.dockerService.getContainers({ skipCache: false });
36+
const installed = containers.length;
37+
const started = containers.filter(
38+
(container) => container.state === ContainerState.RUNNING
39+
).length;
40+
4041
return { id: 'info/apps', installed, started };
4142
}
4243

0 commit comments

Comments
 (0)