Skip to content

Commit 8f16801

Browse files
committed
fix tests
1 parent 47ae00b commit 8f16801

File tree

2 files changed

+114
-107
lines changed

2 files changed

+114
-107
lines changed
Lines changed: 105 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,146 +1,151 @@
11
// Mock the modules before importing anything else
2-
jest.mock('fs', () => ({
3-
existsSync: jest.fn()
4-
}));
5-
6-
jest.mock('shelljs', () => ({
7-
cat: jest.fn(),
8-
which: jest.fn(),
9-
exec: jest.fn(),
10-
error: jest.fn()
11-
}));
12-
13-
import { existsSync } from 'fs';
14-
import * as shell from 'shelljs';
15-
16-
// Mock implementations
17-
const mockExistsSync = existsSync as jest.Mock;
18-
const mockShellCat = shell.cat as jest.Mock;
19-
const mockShellWhich = shell.which as jest.Mock;
2+
jest.mock('fs');
3+
jest.mock('shelljs');
204

215
describe('Docker dependency detection', () => {
226
const originalEnv = process.env;
237

248
beforeEach(() => {
259
jest.clearAllMocks();
10+
jest.resetModules(); // Clear module cache
2611

2712
// Reset environment to original state
2813
process.env = { ...originalEnv };
2914

3015
// Explicitly remove any environment variables that could affect tests
3116
delete process.env.KUBERNETES_SERVICE_HOST;
3217
delete process.env.STARSHIP_SKIP_DOCKER_CHECK;
33-
34-
// Set up default mocks
35-
mockExistsSync.mockReturnValue(false);
36-
mockShellCat.mockReturnValue({
37-
includes: (_str: string) => false,
38-
toString: () => ''
39-
});
40-
mockShellWhich.mockImplementation((cmd: string) => {
41-
if (cmd === 'kubectl' || cmd === 'helm') return '/usr/bin/' + cmd;
42-
return null;
43-
});
4418
});
4519

4620
afterEach(() => {
4721
process.env = originalEnv;
4822
});
4923

5024
test('should detect Docker via .dockerenv file', async () => {
51-
await jest.isolateModules(async () => {
52-
mockExistsSync.mockImplementation((path: string) => {
53-
return path === '/.dockerenv';
54-
});
25+
const fs = require('fs');
26+
const shell = require('shelljs');
27+
28+
fs.existsSync = jest.fn().mockImplementation((path: string) => {
29+
return path === '/.dockerenv';
30+
});
31+
32+
shell.cat = jest.fn().mockReturnValue({
33+
includes: (_str: string) => false,
34+
toString: () => ''
35+
});
36+
37+
shell.which = jest.fn().mockImplementation((cmd: string) => {
38+
if (cmd === 'kubectl' || cmd === 'helm') return '/usr/bin/' + cmd;
39+
return null;
40+
});
5541

56-
const { dependencies } = await import('../src/deps');
57-
const dockerDep = dependencies.find((d: any) => d.name === 'docker');
42+
const { dependencies } = await import('../src/deps');
43+
const dockerDep = dependencies.find((d: any) => d.name === 'docker');
5844

59-
expect(dockerDep).toBeDefined();
60-
expect(dockerDep.installed).toBe(true);
61-
});
45+
expect(dockerDep).toBeDefined();
46+
expect(dockerDep.installed).toBe(true);
6247
});
6348

6449
test('should detect Docker via cgroup', async () => {
65-
await jest.isolateModules(async () => {
66-
mockShellCat.mockReturnValue({
67-
includes: (str: string) => str === 'docker',
68-
toString: () => '1:name=systemd:/docker/abc123'
69-
});
50+
const fs = require('fs');
51+
const shell = require('shelljs');
52+
53+
fs.existsSync = jest.fn().mockImplementation((path: string) => {
54+
// /proc/1/cgroup exists but /.dockerenv doesn't
55+
return path === '/proc/1/cgroup';
56+
});
57+
58+
shell.cat = jest.fn().mockReturnValue({
59+
includes: (str: string) => str === 'docker',
60+
toString: () => '1:name=systemd:/docker/abc123'
61+
});
62+
63+
shell.which = jest.fn().mockImplementation((cmd: string) => {
64+
if (cmd === 'kubectl' || cmd === 'helm') return '/usr/bin/' + cmd;
65+
return null;
66+
});
7067

71-
const { dependencies } = await import('../src/deps');
72-
const dockerDep = dependencies.find((d: any) => d.name === 'docker');
68+
const { dependencies } = await import('../src/deps');
69+
const dockerDep = dependencies.find((d: any) => d.name === 'docker');
7370

74-
expect(dockerDep).toBeDefined();
75-
expect(dockerDep.installed).toBe(true);
76-
});
71+
expect(dockerDep).toBeDefined();
72+
expect(dockerDep.installed).toBe(true);
7773
});
7874

7975
test('should detect Kubernetes pod environment', async () => {
80-
await jest.isolateModules(async () => {
81-
process.env.KUBERNETES_SERVICE_HOST = '10.0.0.1';
82-
83-
const { dependencies } = await import('../src/deps');
84-
const dockerDep = dependencies.find((d: any) => d.name === 'docker');
85-
86-
expect(dockerDep).toBeDefined();
87-
expect(dockerDep.installed).toBe(true);
88-
89-
// Clean up
90-
delete process.env.KUBERNETES_SERVICE_HOST;
76+
const fs = require('fs');
77+
const shell = require('shelljs');
78+
79+
process.env.KUBERNETES_SERVICE_HOST = '10.0.0.1';
80+
81+
fs.existsSync = jest.fn().mockReturnValue(false);
82+
83+
shell.cat = jest.fn().mockReturnValue({
84+
includes: (_str: string) => false,
85+
toString: () => ''
86+
});
87+
88+
shell.which = jest.fn().mockImplementation((cmd: string) => {
89+
if (cmd === 'kubectl' || cmd === 'helm') return '/usr/bin/' + cmd;
90+
return null;
9191
});
92-
});
93-
94-
test('should skip Docker check with environment variable', async () => {
95-
await jest.isolateModules(async () => {
96-
process.env.STARSHIP_SKIP_DOCKER_CHECK = 'true';
9792

98-
const { dependencies } = await import('../src/deps');
99-
const dockerDep = dependencies.find((d: any) => d.name === 'docker');
93+
const { dependencies } = await import('../src/deps');
94+
const dockerDep = dependencies.find((d: any) => d.name === 'docker');
10095

101-
expect(dockerDep).toBeDefined();
102-
expect(dockerDep.installed).toBe(true);
96+
expect(dockerDep).toBeDefined();
97+
expect(dockerDep.installed).toBe(true);
10398

104-
// Clean up
105-
delete process.env.STARSHIP_SKIP_DOCKER_CHECK;
106-
});
99+
// Clean up
100+
delete process.env.KUBERNETES_SERVICE_HOST;
107101
});
108102

109103
test('should require Docker when not in container', async () => {
110-
await jest.isolateModules(async () => {
111-
// Ensure we're not detected as running in a container
112-
mockExistsSync.mockReturnValue(false); // No .dockerenv file
113-
mockShellCat.mockReturnValue({
114-
includes: (_str: string) => false, // No docker in cgroup
115-
toString: () => 'some-other-cgroup-content'
116-
});
117-
delete process.env.KUBERNETES_SERVICE_HOST; // Not in Kubernetes
118-
delete process.env.STARSHIP_SKIP_DOCKER_CHECK; // Don't skip the check
119-
120-
mockShellWhich.mockImplementation((cmd: string) => {
121-
if (cmd === 'kubectl' || cmd === 'helm') return '/usr/bin/' + cmd;
122-
return null; // Docker not installed
123-
});
124-
125-
const { dependencies } = await import('../src/deps');
126-
const dockerDep = dependencies.find((d: any) => d.name === 'docker');
127-
128-
expect(dockerDep).toBeDefined();
129-
expect(dockerDep.installed).toBe(false);
104+
const fs = require('fs');
105+
const shell = require('shelljs');
106+
107+
// Ensure we're not detected as running in a container
108+
fs.existsSync = jest.fn().mockReturnValue(false); // No .dockerenv file
109+
110+
shell.cat = jest.fn().mockReturnValue({
111+
includes: (_str: string) => false, // No docker in cgroup
112+
toString: () => 'some-other-cgroup-content'
113+
});
114+
115+
delete process.env.KUBERNETES_SERVICE_HOST; // Not in Kubernetes
116+
delete process.env.STARSHIP_SKIP_DOCKER_CHECK; // Don't skip the check
117+
118+
shell.which = jest.fn().mockImplementation((cmd: string) => {
119+
if (cmd === 'kubectl' || cmd === 'helm') return '/usr/bin/' + cmd;
120+
return null; // Docker not installed
130121
});
122+
123+
const { dependencies } = await import('../src/deps');
124+
const dockerDep = dependencies.find((d: any) => d.name === 'docker');
125+
126+
expect(dockerDep).toBeDefined();
127+
expect(dockerDep.installed).toBe(false);
131128
});
132129

133130
test('should detect Docker binary when available', async () => {
134-
await jest.isolateModules(async () => {
135-
mockShellWhich.mockImplementation((cmd: string) => {
136-
return '/usr/bin/' + cmd; // All binaries available
137-
});
131+
const fs = require('fs');
132+
const shell = require('shelljs');
133+
134+
fs.existsSync = jest.fn().mockReturnValue(false);
135+
136+
shell.cat = jest.fn().mockReturnValue({
137+
includes: (_str: string) => false,
138+
toString: () => ''
139+
});
140+
141+
shell.which = jest.fn().mockImplementation((cmd: string) => {
142+
return '/usr/bin/' + cmd; // All binaries available
143+
});
138144

139-
const { dependencies } = await import('../src/deps');
140-
const dockerDep = dependencies.find((d: any) => d.name === 'docker');
145+
const { dependencies } = await import('../src/deps');
146+
const dockerDep = dependencies.find((d: any) => d.name === 'docker');
141147

142-
expect(dockerDep).toBeDefined();
143-
expect(dockerDep.installed).toBe(true);
144-
});
148+
expect(dockerDep).toBeDefined();
149+
expect(dockerDep.installed).toBe(true);
145150
});
146151
});

packages/packages/client/src/deps.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,16 @@ function isRunningInDocker(): boolean {
1515
return true;
1616
}
1717

18-
// Check cgroup for docker signatures
19-
try {
20-
const cgroup = shell.cat('/proc/1/cgroup');
21-
if (cgroup && cgroup.includes('docker')) {
22-
return true;
18+
// Check cgroup for docker signatures (Linux only)
19+
if (existsSync('/proc/1/cgroup')) {
20+
try {
21+
const cgroup = shell.cat('/proc/1/cgroup');
22+
if (cgroup && cgroup.includes('docker')) {
23+
return true;
24+
}
25+
} catch (e) {
26+
// Ignore errors when reading cgroup
2327
}
24-
} catch (e) {
25-
// Ignore errors when reading cgroup
2628
}
2729

2830
// Check for KUBERNETES_SERVICE_HOST which indicates we're in a K8s pod

0 commit comments

Comments
 (0)