overleaf/services/spelling/test/unit/js/ASpellWorkerTests.js

108 lines
3.2 KiB
JavaScript
Raw Normal View History

/* eslint-disable
no-undef
*/
const sinon = require('sinon')
const { expect } = require('chai')
const SandboxedModule = require('sandboxed-module')
const EventEmitter = require('events')
2020-08-10 16:23:15 +00:00
describe('ASpellWorker', function () {
beforeEach(function () {
this.child_process = {}
2019-10-03 08:41:16 +00:00
return (this.ASpellWorker = SandboxedModule.require(
'../../../app/js/ASpellWorker',
{
requires: {
'@overleaf/metrics': {
2019-10-03 08:41:16 +00:00
gauge() {},
2021-07-13 11:04:47 +00:00
inc() {},
2019-10-03 08:41:16 +00:00
},
2021-07-13 11:04:47 +00:00
child_process: this.child_process,
},
}
2019-10-03 08:41:16 +00:00
))
})
2020-08-10 16:23:15 +00:00
describe('creating a worker', function () {
beforeEach(function () {
this.pipe = {
2019-10-03 08:41:16 +00:00
stdout: new EventEmitter(),
stderr: { on: sinon.stub() },
stdin: { on: sinon.stub() },
on: sinon.stub(),
2021-07-13 11:04:47 +00:00
pid: 12345,
}
this.child_process.spawn = sinon.stub().returns(this.pipe)
this.pipe.stdout.setEncoding = sinon.stub()
worker = new this.ASpellWorker('en')
})
2020-08-10 16:23:15 +00:00
describe('with normal aspell output', function () {
beforeEach(function () {
this.callback = worker.callback = sinon.stub()
this.pipe.stdout.emit('data', '& hello\n')
this.pipe.stdout.emit('data', '& world\n')
this.pipe.stdout.emit('data', 'en\n')
this.pipe.stdout.emit('data', '& goodbye')
})
2020-08-10 16:23:15 +00:00
it('should call the callback', function () {
expect(this.callback.called).to.equal(true)
2019-10-03 08:41:16 +00:00
expect(
this.callback.calledWith(null, '& hello\n& world\nen\n')
).to.equal(true)
})
})
2020-08-10 16:23:15 +00:00
describe('with the aspell end marker split across chunks', function () {
beforeEach(function () {
this.callback = worker.callback = sinon.stub()
this.pipe.stdout.emit('data', '& hello\n')
this.pipe.stdout.emit('data', '& world\ne')
this.pipe.stdout.emit('data', 'n\n')
this.pipe.stdout.emit('data', '& goodbye')
})
2020-08-10 16:23:15 +00:00
it('should call the callback', function () {
expect(this.callback.called).to.equal(true)
2019-10-03 08:41:16 +00:00
expect(
this.callback.calledWith(null, '& hello\n& world\nen\n')
).to.equal(true)
})
})
2020-08-10 16:23:15 +00:00
describe('with the aspell end marker newline split across chunks', function () {
beforeEach(function () {
this.callback = worker.callback = sinon.stub()
this.pipe.stdout.emit('data', '& hello\n')
this.pipe.stdout.emit('data', '& world\n')
this.pipe.stdout.emit('data', 'en')
this.pipe.stdout.emit('data', '\n& goodbye')
})
2020-08-10 16:23:15 +00:00
it('should call the callback', function () {
expect(this.callback.called).to.equal(true)
2019-10-03 08:41:16 +00:00
expect(this.callback.calledWith(null, '& hello\n& world\nen')).to.equal(
true
)
})
})
2020-08-10 16:23:15 +00:00
describe('with everything split across chunks', function () {
beforeEach(function () {
this.callback = worker.callback = sinon.stub()
2021-07-13 11:04:47 +00:00
'& hello\n& world\nen\n& goodbye'.split('').forEach(x => {
this.pipe.stdout.emit('data', x)
})
})
2020-08-10 16:23:15 +00:00
it('should call the callback', function () {
expect(this.callback.called).to.equal(true)
2019-10-03 08:41:16 +00:00
expect(this.callback.calledWith(null, '& hello\n& world\nen')).to.equal(
true
)
})
})
})
})