atcheck/lsscanner/new_ubuntu/node_modules_win/spawn-rx/test/spawn.ts

103 lines
3.8 KiB
TypeScript
Executable File

import { expect } from 'chai';
import './support';
import { spawn, spawnPromise, spawnDetachedPromise } from '../src/index';
import { Observable, of } from 'rxjs';
const uuidRegex = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i;
describe('The spawnPromise method', function() {
it('should return a uuid when we call uuid', async function() {
// NB: Since we get run via npm run test, we know that npm bins are in our
// PATH.
let result = await spawnPromise('uuid', []);
expect(result.match(uuidRegex)).to.be.ok;
});
});
describe('The spawnDetachedPromise method', function() {
it('should return a uuid when we call uuid', async function() {
// NB: Since we get run via npm run test, we know that npm bins are in our
// PATH.
let result = await spawnDetachedPromise('uuid', ['--help']);
expect(result.length > 10).to.be.ok;
});
});
function wrapSplitObservableInPromise(obs: Observable<{
source: any,
text: any
}>): Promise<{
stderr: string,
stdout: string,
error: Error | undefined
}> {
return new Promise((res) => {
let out = {stderr: '', stdout: '', error: undefined };
obs.subscribe(
(x) => {
if (x.source === 'stdout') {
out.stdout += x.text;
} else {
out.stderr += x.text;
}
},
(e) => { out.error = e; res(out); },
() => res(out));
});
}
describe('The spawn method', function() {
it('should return a disposable subscription', async function() {
// this only check the unsubscribe goes w/o error, not that the spawned process is killed
// (difficult to do that, maybe iterate through child processes and check ?)
spawn('sleep', ['2']).subscribe().unsubscribe();
});
it('should return split stderr in a inner tag when called with split', async function() {
// provide an invalid param to uuid so it complains on stderr
let rxSpawn: Observable<{ source: any, text: any }> = spawn('uuid', ['foo'], {split: true}) as any;
let result = await wrapSplitObservableInPromise(rxSpawn);
expect(result.stderr.length > 10).to.be.ok;
expect(result.stdout).to.be.empty;
expect(result.error).to.be.an('error');
});
it('should return split stdout in a inner tag when called with split', async function() {
let rxSpawn: Observable<{ source: any, text: any }> = spawn('uuid', [], {split: true});
let result = await wrapSplitObservableInPromise(rxSpawn);
expect(result.stdout.match(uuidRegex)).to.be.ok;
expect(result.stderr).to.be.empty;
expect(result.error).to.be.undefined;
});
it('should ignore stderr if options.stdio = ignore', async function() {
let rxSpawn: Observable<{ source: any, text: any }> = spawn('uuid', ['foo'], {split: true, stdio: [null, null, 'ignore']});
let result = await wrapSplitObservableInPromise(rxSpawn);
expect(result.stderr).to.be.empty;
});
it('should ignore stdout if options.stdio = inherit', async function() {
let rxSpawn: Observable<{ source: any, text: any }> = spawn('uuid', [], {split: true, stdio: [null, 'inherit', null]});
let result = await wrapSplitObservableInPromise(rxSpawn);
expect(result.stdout).to.be.empty;
});
it('should croak if stdin is provided but stdio.stdin is disabled', async function() {
let stdin = of('a');
let rxSpawn: Observable<{ source: any, text: any }> = spawn('marked', [], {split: true, stdin: stdin, stdio: ['ignore', null, null]});
let result = await wrapSplitObservableInPromise(rxSpawn);
expect(result.error).to.be.an('error');
});
it('should subscribe to provided stdin', async function() {
let stdin = of('a');
let rxSpawn: Observable<{ source: any, text: any }> = spawn('marked', [], {split: true, stdin: stdin});
let result = await wrapSplitObservableInPromise(rxSpawn);
expect(result.stdout.trim()).to.be.equal('<p>a</p>');
});
});