115 lines
2.8 KiB
TypeScript
115 lines
2.8 KiB
TypeScript
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
import type { ChildProcess } from 'node:child_process';
|
|
|
|
// Mock modules before importing the module under test
|
|
vi.mock('node:child_process', () => ({
|
|
spawn: vi.fn(),
|
|
}));
|
|
|
|
vi.mock('node:os', () => ({
|
|
platform: vi.fn(),
|
|
}));
|
|
|
|
vi.mock('node:fs', () => ({
|
|
existsSync: vi.fn(),
|
|
}));
|
|
|
|
// Mock the debug logger
|
|
vi.mock('../shared/utils/debug.js', () => ({
|
|
createLogger: () => ({
|
|
debug: vi.fn(),
|
|
info: vi.fn(),
|
|
error: vi.fn(),
|
|
enter: vi.fn(),
|
|
exit: vi.fn(),
|
|
}),
|
|
}));
|
|
|
|
// Import after mocks are set up
|
|
const { spawn } = await import('node:child_process');
|
|
const { platform } = await import('node:os');
|
|
const { existsSync } = await import('node:fs');
|
|
const { preventSleep, resetPreventSleepState } = await import('../shared/utils/sleep.js');
|
|
|
|
describe('preventSleep', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
resetPreventSleepState();
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.restoreAllMocks();
|
|
});
|
|
|
|
it('should do nothing on non-darwin platforms', () => {
|
|
vi.mocked(platform).mockReturnValue('linux');
|
|
|
|
preventSleep();
|
|
|
|
expect(spawn).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('should do nothing on Windows', () => {
|
|
vi.mocked(platform).mockReturnValue('win32');
|
|
|
|
preventSleep();
|
|
|
|
expect(spawn).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('should spawn caffeinate on macOS when available', () => {
|
|
vi.mocked(platform).mockReturnValue('darwin');
|
|
vi.mocked(existsSync).mockReturnValue(true);
|
|
|
|
const mockChild = {
|
|
unref: vi.fn(),
|
|
pid: 12345,
|
|
} as unknown as ChildProcess;
|
|
vi.mocked(spawn).mockReturnValue(mockChild);
|
|
|
|
preventSleep();
|
|
|
|
expect(spawn).toHaveBeenCalledWith(
|
|
'/usr/bin/caffeinate',
|
|
['-dis', '-w', String(process.pid)],
|
|
{ stdio: 'ignore', detached: true }
|
|
);
|
|
expect(mockChild.unref).toHaveBeenCalled();
|
|
});
|
|
|
|
it('should not spawn caffeinate if not found', () => {
|
|
vi.mocked(platform).mockReturnValue('darwin');
|
|
vi.mocked(existsSync).mockReturnValue(false);
|
|
|
|
preventSleep();
|
|
|
|
expect(spawn).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('should check for caffeinate at /usr/bin/caffeinate', () => {
|
|
vi.mocked(platform).mockReturnValue('darwin');
|
|
vi.mocked(existsSync).mockReturnValue(false);
|
|
|
|
preventSleep();
|
|
|
|
expect(existsSync).toHaveBeenCalledWith('/usr/bin/caffeinate');
|
|
});
|
|
|
|
it('should only spawn caffeinate once even when called multiple times', () => {
|
|
vi.mocked(platform).mockReturnValue('darwin');
|
|
vi.mocked(existsSync).mockReturnValue(true);
|
|
|
|
const mockChild = {
|
|
unref: vi.fn(),
|
|
pid: 12345,
|
|
} as unknown as ChildProcess;
|
|
vi.mocked(spawn).mockReturnValue(mockChild);
|
|
|
|
preventSleep();
|
|
preventSleep();
|
|
preventSleep();
|
|
|
|
expect(spawn).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|