Files
DeskClaw/tests/unit/launch-at-startup.test.ts
2026-03-11 18:41:18 +08:00

92 lines
2.8 KiB
TypeScript

import { access, readFile, rm } from 'node:fs/promises';
import { join } from 'node:path';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
const originalPlatform = process.platform;
const {
testHome,
electronAppMock,
setLoginItemSettingsMock,
} = vi.hoisted(() => {
const suffix = Math.random().toString(36).slice(2);
const setLoginItemSettingsMock = vi.fn();
const electronAppMock = {
isPackaged: true,
getPath: (name: string) => (name === 'home' ? `/tmp/clawx-launch-startup-${suffix}` : '/tmp'),
setLoginItemSettings: setLoginItemSettingsMock,
};
return {
testHome: `/tmp/clawx-launch-startup-${suffix}`,
electronAppMock,
setLoginItemSettingsMock,
};
});
vi.mock('electron', () => ({
app: electronAppMock,
}));
function setPlatform(platform: string): void {
Object.defineProperty(process, 'platform', { value: platform, writable: true });
}
describe('launch-at-startup integration', () => {
beforeEach(async () => {
vi.resetModules();
vi.clearAllMocks();
electronAppMock.isPackaged = true;
await rm(testHome, { recursive: true, force: true });
});
afterEach(() => {
Object.defineProperty(process, 'platform', { value: originalPlatform, writable: true });
});
it('uses login item settings on Windows', async () => {
setPlatform('win32');
const { applyLaunchAtStartupSetting } = await import('@electron/main/launch-at-startup');
await applyLaunchAtStartupSetting(true);
expect(setLoginItemSettingsMock).toHaveBeenCalledWith({
openAtLogin: true,
openAsHidden: false,
});
});
it('uses login item settings on macOS', async () => {
setPlatform('darwin');
const { applyLaunchAtStartupSetting } = await import('@electron/main/launch-at-startup');
await applyLaunchAtStartupSetting(false);
expect(setLoginItemSettingsMock).toHaveBeenCalledWith({
openAtLogin: false,
openAsHidden: false,
});
});
it('creates and removes Linux autostart desktop entry', async () => {
setPlatform('linux');
const { applyLaunchAtStartupSetting } = await import('@electron/main/launch-at-startup');
const autostartPath = join(testHome, '.config', 'autostart', 'clawx.desktop');
await applyLaunchAtStartupSetting(true);
const content = await readFile(autostartPath, 'utf8');
expect(content).toContain('[Desktop Entry]');
expect(content).toContain('Name=ClawX');
expect(content).toContain('Exec=');
await applyLaunchAtStartupSetting(false);
await expect(access(autostartPath)).rejects.toThrow();
});
it('does not throw on unsupported platforms', async () => {
setPlatform('freebsd');
const { applyLaunchAtStartupSetting } = await import('@electron/main/launch-at-startup');
await expect(applyLaunchAtStartupSetting(true)).resolves.toBeUndefined();
});
});