UNPKG

eslint_d

Version:

Speed up eslint to accelerate your development workflow

147 lines (120 loc) 4.59 kB
import { Socket } from 'node:net'; import { assert, refute, sinon } from '@sinonjs/referee-sinon'; import { createResolver } from './resolver.js'; import { createService } from './service.js'; describe('lib/service', () => { context('createService', () => { const original_stdout_write = process.stdout.write; const original_stderr_write = process.stderr.write; const resolver = createResolver(); if (resolver === 'fail' || resolver === 'ignore') { throw new Error('Failed to create resolver'); } const eslint = resolver.require(`${resolver.base}/lib/cli.js`); const chalk = resolver.require('chalk'); const token = 'token'; let eslint_promise; let service; let con; beforeEach(() => { eslint_promise = sinon.promise(); sinon.replace(eslint, 'execute', sinon.fake.returns(eslint_promise)); sinon.replace(process, 'chdir', sinon.fake()); service = createService(resolver, token); chalk.level = '-'; con = new Socket({ allowHalfOpen: true }); sinon.replace(con, 'write', sinon.fake()); sinon.replace(con, 'end', sinon.fake()); service(con); }); afterEach(() => { assert.same(process.stdout.write, original_stdout_write); assert.same(process.stderr.write, original_stderr_write); }); /** * @param {string} request_token * @param {string} color_level * @param {string} cwd * @param {string[]} argv * @param {string} [text] */ function send(request_token, color_level, cwd, argv, text) { const chunks = [ `${request_token} ${color_level} `, `${JSON.stringify(cwd)} ${JSON.stringify(argv)}` ]; if (text !== undefined) { chunks.push(`\n${text}`); } sinon.replace(con, 'read', () => chunks.shift() || null); con.emit('readable'); con.emit('end'); } it('immediately ends connection if no data is received', () => { con.emit('end'); assert.calledOnceWithExactly(con.end); refute.called(con.write); refute.called(process.chdir); assert.equals(chalk.level, '-'); }); it('immediately ends connection if token does not match', () => { send('invalid', '0', '/', []); assert.calledOnceWithExactly(con.end); refute.called(con.write); refute.called(process.chdir); assert.equals(chalk.level, '-'); }); it('sets chalk.level to given color and changes directory', async () => { send(token, '3', '/', []); await eslint_promise.resolve(0); assert.equals(chalk.level, '3'); assert.calledOnceWith(process.chdir, '/'); }); it('replaces stdout with a function that write to the socket', async () => { send(token, '3', '/', []); process.stdout.write('test'); await eslint_promise.resolve(0); assert.calledOnceWith(con.write, 'test'); }); it('replaces stderr with a function that write to the socket', async () => { send(token, '3', '/', []); process.stderr.write('test'); await eslint_promise.resolve(0); assert.calledOnceWith(con.write, 'test'); }); it('invokes eslint.execute with given args and no text', async () => { send(token, '3', '/', ['--fix']); await eslint_promise.resolve(0); assert.calledOnceWith(eslint.execute, ['--fix'], null, true); }); it('invokes eslint.execute with given text', async () => { send(token, '3', '/', [], 'some text'); await eslint_promise.resolve(0); assert.calledOnceWith(eslint.execute, [], 'some text', true); }); it('ends connection with "EXIT0" if eslint returns 0', async () => { send(token, '3', '/', []); await eslint_promise.resolve(0); refute.called(con.write); assert.calledOnceWith(con.end, 'EXIT0'); }); it('ends connection with "EXIT1" if eslint returns 1', async () => { send(token, '3', '/', []); await eslint_promise.resolve(1); refute.called(con.write); assert.calledOnceWith(con.end, 'EXIT1'); }); it('ends connection with "EXIT2" if eslint returns 2', async () => { send(token, '3', '/', []); await eslint_promise.resolve(2); refute.called(con.write); assert.calledOnceWith(con.end, 'EXIT2'); }); it('ends connection with "EXIT1" if eslint throws', async () => { send(token, '3', '/', []); await eslint_promise.reject(new Error('Ouch!')); assert.calledOnceWith(con.write, 'Error: Ouch!'); assert.calledOnceWith(con.end, 'EXIT1'); }); }); });