basant307/AI_Governance_Project
048
1/**2 * @license3 * Copyright 2025 Qwen Team4 * SPDX-License-Identifier: Apache-2.05 */6import { afterEach, describe, expect, it, vi } from 'vitest';7import * as fs from 'node:fs';8import * as os from 'node:os';9import * as path from 'node:path';10const originalQwenHome = process.env['QWEN_HOME'];11const originalSystemSettingsPath = process.env['QWEN_CODE_SYSTEM_SETTINGS_PATH'];12const originalSystemDefaultsPath = process.env['QWEN_CODE_SYSTEM_DEFAULTS_PATH'];13const originalTrustedFoldersPath = process.env['QWEN_CODE_TRUSTED_FOLDERS_PATH'];14describe('serve fast path --open import boundary', () => {15 let tempQwenHome;16 function useTempQwenHome() {17 tempQwenHome = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'qws-fast-path-open-')));18 process.env['QWEN_HOME'] = tempQwenHome;19 process.env['QWEN_CODE_SYSTEM_SETTINGS_PATH'] = path.join(tempQwenHome, 'system-settings.json');20 process.env['QWEN_CODE_SYSTEM_DEFAULTS_PATH'] = path.join(tempQwenHome, 'system-defaults.json');21 process.env['QWEN_CODE_TRUSTED_FOLDERS_PATH'] = path.join(tempQwenHome, 'trustedFolders.json');22 }23 afterEach(() => {24 vi.restoreAllMocks();25 vi.doUnmock('./run-qwen-serve.js');26 vi.doUnmock('../commands/serve.js');27 vi.resetModules();28 if (originalQwenHome === undefined) {29 delete process.env['QWEN_HOME'];30 }31 else {32 process.env['QWEN_HOME'] = originalQwenHome;33 }34 if (originalSystemSettingsPath === undefined) {35 delete process.env['QWEN_CODE_SYSTEM_SETTINGS_PATH'];36 }37 else {38 process.env['QWEN_CODE_SYSTEM_SETTINGS_PATH'] =39 originalSystemSettingsPath;40 }41 if (originalSystemDefaultsPath === undefined) {42 delete process.env['QWEN_CODE_SYSTEM_DEFAULTS_PATH'];43 }44 else {45 process.env['QWEN_CODE_SYSTEM_DEFAULTS_PATH'] =46 originalSystemDefaultsPath;47 }48 if (originalTrustedFoldersPath === undefined) {49 delete process.env['QWEN_CODE_TRUSTED_FOLDERS_PATH'];50 }51 else {52 process.env['QWEN_CODE_TRUSTED_FOLDERS_PATH'] =53 originalTrustedFoldersPath;54 }55 if (tempQwenHome) {56 fs.rmSync(tempQwenHome, { recursive: true, force: true });57 tempQwenHome = undefined;58 }59 });60 it('defers importing the full serve command opener until runtime is ready', async () => {61 useTempQwenHome();62 let resolveRuntime;63 const runtimeReady = new Promise((resolve) => {64 resolveRuntime = resolve;65 });66 const runQwenServe = vi.fn(async () => ({67 runtimeReady,68 close: vi.fn().mockResolvedValue(undefined),69 }));70 let serveCommandImported = false;71 const openBrowser = vi.fn(async () => undefined);72 vi.doMock('./run-qwen-serve.js', () => ({ runQwenServe }));73 vi.doMock('../commands/serve.js', () => {74 serveCommandImported = true;75 return { maybeOpenWebShellBrowser: openBrowser };76 });77 const { tryRunServeFastPath } = await import('./fast-path.js');78 void tryRunServeFastPath([79 'serve',80 '--port',81 '0',82 '--hostname',83 '127.0.0.1',84 '--open',85 '--no-web',86 ]);87 await vi.waitFor(() => expect(runQwenServe).toHaveBeenCalledTimes(1));88 expect(runQwenServe).toHaveBeenCalledWith(expect.any(Object), expect.objectContaining({ deferRuntimeUntilFirstHealth: false }));89 await Promise.resolve();90 expect(serveCommandImported).toBe(false);91 resolveRuntime?.();92 await vi.waitFor(() => expect(openBrowser).toHaveBeenCalledTimes(1));93 expect(serveCommandImported).toBe(true);94 });95 it('skips importing the full serve command opener when runtime startup fails', async () => {96 useTempQwenHome();97 let rejectRuntime;98 const runtimeReady = new Promise((_resolve, reject) => {99 rejectRuntime = reject;100 });101 const close = vi.fn().mockResolvedValue(undefined);102 const runQwenServe = vi.fn(async () => ({103 runtimeReady,104 close,105 }));106 let serveCommandImported = false;107 const openBrowser = vi.fn(async () => undefined);108 vi.doMock('./run-qwen-serve.js', () => ({ runQwenServe }));109 vi.doMock('../commands/serve.js', () => {110 serveCommandImported = true;111 return { maybeOpenWebShellBrowser: openBrowser };112 });113 vi.spyOn(process, 'exit').mockImplementation(((code) => {114 throw new Error(`process.exit ${code}`);115 }));116 const { tryRunServeFastPath } = await import('./fast-path.js');117 const fastPathPromise = tryRunServeFastPath([118 'serve',119 '--port',120 '0',121 '--hostname',122 '127.0.0.1',123 '--open',124 '--no-web',125 ]);126 await vi.waitFor(() => expect(runQwenServe).toHaveBeenCalledTimes(1));127 expect(runQwenServe).toHaveBeenCalledWith(expect.any(Object), expect.objectContaining({ deferRuntimeUntilFirstHealth: false }));128 await Promise.resolve();129 expect(serveCommandImported).toBe(false);130 rejectRuntime?.(new Error('runtime boom'));131 await expect(fastPathPromise).rejects.toThrow('process.exit 1');132 expect(openBrowser).not.toHaveBeenCalled();133 expect(serveCommandImported).toBe(false);134 expect(close).toHaveBeenCalledTimes(1);135 });136});137//# sourceMappingURL=fast-path-open.test.js.map