97 lines
2.7 KiB
JavaScript
97 lines
2.7 KiB
JavaScript
import { describe, expect, it } from 'bun:test';
|
|
|
|
import {
|
|
createExecutableSearchEnv,
|
|
findExecutableOnPath,
|
|
getExecutableSearchDirectories,
|
|
resolveExecutableLaunchTarget,
|
|
} from './executable-search.js';
|
|
|
|
describe('getExecutableSearchDirectories', () => {
|
|
it('adds the WindowsApps app-alias directory on Windows', () => {
|
|
const directories = getExecutableSearchDirectories({
|
|
platform: 'win32',
|
|
env: {
|
|
PATH: 'C:\\Tools',
|
|
LOCALAPPDATA: 'C:\\Users\\Ada\\AppData\\Local',
|
|
},
|
|
});
|
|
|
|
expect(directories).toContain('C:\\Users\\Ada\\AppData\\Local\\Microsoft\\WindowsApps');
|
|
});
|
|
|
|
it('reads Windows Path casing when PATH is not present', () => {
|
|
const directories = getExecutableSearchDirectories({
|
|
platform: 'win32',
|
|
env: {
|
|
Path: 'C:\\Tools;C:\\MoreTools',
|
|
LOCALAPPDATA: 'C:\\Users\\Ada\\AppData\\Local',
|
|
},
|
|
});
|
|
|
|
expect(directories[0]).toBe('C:\\Tools');
|
|
expect(directories[1]).toBe('C:\\MoreTools');
|
|
});
|
|
});
|
|
|
|
describe('findExecutableOnPath', () => {
|
|
it('finds Windows Store app execution aliases even when PATH omits WindowsApps', () => {
|
|
const aliasPath = 'C:\\Users\\Ada\\AppData\\Local\\Microsoft\\WindowsApps\\ngrok.exe';
|
|
const fsLike = {
|
|
statSync: (candidate) => {
|
|
if (candidate === aliasPath) {
|
|
return { isFile: () => true };
|
|
}
|
|
throw new Error('not found');
|
|
},
|
|
accessSync: () => {},
|
|
};
|
|
|
|
const resolved = findExecutableOnPath('ngrok', {
|
|
platform: 'win32',
|
|
env: {
|
|
PATH: 'C:\\Tools',
|
|
LOCALAPPDATA: 'C:\\Users\\Ada\\AppData\\Local',
|
|
PATHEXT: '.EXE;.CMD',
|
|
},
|
|
fsLike,
|
|
});
|
|
|
|
expect(resolved).toBe(aliasPath);
|
|
});
|
|
});
|
|
|
|
describe('resolveExecutableLaunchTarget', () => {
|
|
it('returns a Windows launch target with WindowsApps on PATH when stat lookup fails', () => {
|
|
const target = resolveExecutableLaunchTarget('ngrok', {
|
|
platform: 'win32',
|
|
env: {
|
|
PATH: 'C:\\Windows\\System32',
|
|
LOCALAPPDATA: 'C:\\Users\\Ada\\AppData\\Local',
|
|
},
|
|
fsLike: {
|
|
statSync: () => { throw new Error('EACCES'); },
|
|
accessSync: () => {},
|
|
},
|
|
});
|
|
|
|
expect(target?.command).toBe('ngrok');
|
|
expect(target?.env.Path).toContain('C:\\Users\\Ada\\AppData\\Local\\Microsoft\\WindowsApps');
|
|
});
|
|
});
|
|
|
|
describe('createExecutableSearchEnv', () => {
|
|
it('keeps Windows PATH variants in sync', () => {
|
|
const env = createExecutableSearchEnv({
|
|
platform: 'win32',
|
|
env: {
|
|
PATH: 'C:\\Windows\\System32',
|
|
LOCALAPPDATA: 'C:\\Users\\Ada\\AppData\\Local',
|
|
},
|
|
});
|
|
|
|
expect(env.PATH).toBe(env.Path);
|
|
expect(env.path).toBe(env.Path);
|
|
});
|
|
});
|