|
1 | 1 | // 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'); |
20 | 4 |
|
21 | 5 | describe('Docker dependency detection', () => { |
22 | 6 | const originalEnv = process.env; |
23 | 7 |
|
24 | 8 | beforeEach(() => { |
25 | 9 | jest.clearAllMocks(); |
| 10 | + jest.resetModules(); // Clear module cache |
26 | 11 |
|
27 | 12 | // Reset environment to original state |
28 | 13 | process.env = { ...originalEnv }; |
29 | 14 |
|
30 | 15 | // Explicitly remove any environment variables that could affect tests |
31 | 16 | delete process.env.KUBERNETES_SERVICE_HOST; |
32 | 17 | 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 | | - }); |
44 | 18 | }); |
45 | 19 |
|
46 | 20 | afterEach(() => { |
47 | 21 | process.env = originalEnv; |
48 | 22 | }); |
49 | 23 |
|
50 | 24 | 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 | + }); |
55 | 41 |
|
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'); |
58 | 44 |
|
59 | | - expect(dockerDep).toBeDefined(); |
60 | | - expect(dockerDep.installed).toBe(true); |
61 | | - }); |
| 45 | + expect(dockerDep).toBeDefined(); |
| 46 | + expect(dockerDep.installed).toBe(true); |
62 | 47 | }); |
63 | 48 |
|
64 | 49 | 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 | + }); |
70 | 67 |
|
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'); |
73 | 70 |
|
74 | | - expect(dockerDep).toBeDefined(); |
75 | | - expect(dockerDep.installed).toBe(true); |
76 | | - }); |
| 71 | + expect(dockerDep).toBeDefined(); |
| 72 | + expect(dockerDep.installed).toBe(true); |
77 | 73 | }); |
78 | 74 |
|
79 | 75 | 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; |
91 | 91 | }); |
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'; |
97 | 92 |
|
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'); |
100 | 95 |
|
101 | | - expect(dockerDep).toBeDefined(); |
102 | | - expect(dockerDep.installed).toBe(true); |
| 96 | + expect(dockerDep).toBeDefined(); |
| 97 | + expect(dockerDep.installed).toBe(true); |
103 | 98 |
|
104 | | - // Clean up |
105 | | - delete process.env.STARSHIP_SKIP_DOCKER_CHECK; |
106 | | - }); |
| 99 | + // Clean up |
| 100 | + delete process.env.KUBERNETES_SERVICE_HOST; |
107 | 101 | }); |
108 | 102 |
|
109 | 103 | 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 |
130 | 121 | }); |
| 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); |
131 | 128 | }); |
132 | 129 |
|
133 | 130 | 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 | + }); |
138 | 144 |
|
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'); |
141 | 147 |
|
142 | | - expect(dockerDep).toBeDefined(); |
143 | | - expect(dockerDep.installed).toBe(true); |
144 | | - }); |
| 148 | + expect(dockerDep).toBeDefined(); |
| 149 | + expect(dockerDep.installed).toBe(true); |
145 | 150 | }); |
146 | 151 | }); |
0 commit comments