Files
2026-07-13 13:20:22 +08:00

112 lines
3.3 KiB
TypeScript

/**
* @license
* Copyright 2025 AionUi (aionui.com)
* SPDX-License-Identifier: Apache-2.0
*/
import { describe, expect, it, vi } from 'vitest';
import { startBackendOrExit } from '@/process/startup/backendStartup';
describe('startBackendOrExit', () => {
it('registers the backend port when startup succeeds', async () => {
const onStarted = vi.fn();
const captureFailure = vi.fn();
const exitApp = vi.fn();
const result = await startBackendOrExit({
startBackend: async () => 42123,
onStarted,
captureFailure,
exitApp,
logError: vi.fn(),
});
expect(result).toEqual({ ok: true, port: 42123 });
expect(onStarted).toHaveBeenCalledWith(42123);
expect(captureFailure).not.toHaveBeenCalled();
expect(exitApp).not.toHaveBeenCalled();
});
it('captures startup failure and exits without registering a backend port by default', async () => {
const error = new Error('aioncore failed to start within timeout');
const calls: string[] = [];
const onStarted = vi.fn();
const captureFailure = vi.fn(async () => {
calls.push('capture-start');
await Promise.resolve();
calls.push('capture-end');
});
const exitApp = vi.fn(() => {
calls.push('exit');
});
const logError = vi.fn();
const result = await startBackendOrExit({
startBackend: async () => {
throw error;
},
onStarted,
captureFailure,
exitApp,
logError,
});
expect(result).toEqual({ ok: false });
expect(logError).toHaveBeenCalledWith('[AionUi] Failed to start aioncore:', error);
expect(captureFailure).toHaveBeenCalledWith(error);
expect(exitApp).toHaveBeenCalledWith(1);
expect(calls).toEqual(['capture-start', 'capture-end', 'exit']);
expect(onStarted).not.toHaveBeenCalled();
});
it('captures startup failure without dialog or exit when exitOnFailure is disabled', async () => {
const error = new Error('aioncore exited before health check passed');
const onStarted = vi.fn();
const captureFailure = vi.fn();
const exitApp = vi.fn();
const logError = vi.fn();
const result = await startBackendOrExit({
startBackend: async () => {
throw error;
},
onStarted,
captureFailure,
exitApp,
exitOnFailure: false,
logError,
});
expect(result).toEqual({ ok: false });
expect(logError).toHaveBeenCalledWith('[AionUi] Failed to start aioncore:', error);
expect(captureFailure).toHaveBeenCalledWith(error);
expect(exitApp).not.toHaveBeenCalled();
expect(onStarted).not.toHaveBeenCalled();
});
it('does not capture or exit when backend startup is cancelled by shutdown', async () => {
const error = new Error('aioncore startup cancelled');
error.name = 'BackendStartupCancelledError';
const onStarted = vi.fn();
const captureFailure = vi.fn();
const exitApp = vi.fn();
const logError = vi.fn();
const result = await startBackendOrExit({
startBackend: async () => {
throw error;
},
onStarted,
captureFailure,
exitApp,
logError,
});
expect(result).toEqual({ ok: false });
expect(logError).not.toHaveBeenCalled();
expect(captureFailure).not.toHaveBeenCalled();
expect(exitApp).not.toHaveBeenCalled();
expect(onStarted).not.toHaveBeenCalled();
});
});