mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
7f48c67512
* Add `unicorn/prefer-node-protocol` * Fix `unicorn/prefer-node-protocol` ESLint errors * Run `npm run format:fix` * Add sandboxed-module sourceTransformers in mocha setups Fix `no such file or directory, open 'node:fs'` in `sandboxed-module` * Remove `node:` in the SandboxedModule requires * Fix new linting errors with `node:` GitOrigin-RevId: 68f6e31e2191fcff4cb8058dd0a6914c14f59926
105 lines
2.8 KiB
JavaScript
105 lines
2.8 KiB
JavaScript
const SandboxedModule = require('sandboxed-module')
|
|
const sinon = require('sinon')
|
|
const MODULE_PATH = require('node:path').join(
|
|
__dirname,
|
|
'../../../app/js/OutputController'
|
|
)
|
|
|
|
describe('OutputController', function () {
|
|
describe('createOutputZip', function () {
|
|
beforeEach(function () {
|
|
this.archive = {}
|
|
|
|
this.pipeline = sinon.stub().resolves()
|
|
|
|
this.archiveFilesForBuild = sinon.stub().resolves(this.archive)
|
|
|
|
this.OutputController = SandboxedModule.require(MODULE_PATH, {
|
|
requires: {
|
|
'./OutputFileArchiveManager': {
|
|
archiveFilesForBuild: this.archiveFilesForBuild,
|
|
},
|
|
'stream/promises': {
|
|
pipeline: this.pipeline,
|
|
},
|
|
},
|
|
})
|
|
})
|
|
|
|
describe('when OutputFileArchiveManager creates an archive', function () {
|
|
beforeEach(function (done) {
|
|
this.res = {
|
|
attachment: sinon.stub(),
|
|
setHeader: sinon.stub(),
|
|
}
|
|
this.req = {
|
|
params: {
|
|
project_id: 'project-id-123',
|
|
user_id: 'user-id-123',
|
|
build_id: 'build-id-123',
|
|
},
|
|
query: {
|
|
files: ['output.tex'],
|
|
},
|
|
}
|
|
this.pipeline.callsFake(() => {
|
|
done()
|
|
return Promise.resolve()
|
|
})
|
|
this.OutputController.createOutputZip(this.req, this.res)
|
|
})
|
|
|
|
it('creates a pipeline from the archive to the response', function () {
|
|
sinon.assert.calledWith(this.pipeline, this.archive, this.res)
|
|
})
|
|
|
|
it('calls the express convenience method to set attachment headers', function () {
|
|
sinon.assert.calledWith(this.res.attachment, 'output.zip')
|
|
})
|
|
|
|
it('sets the X-Content-Type-Options header to nosniff', function () {
|
|
sinon.assert.calledWith(
|
|
this.res.setHeader,
|
|
'X-Content-Type-Options',
|
|
'nosniff'
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('when OutputFileArchiveManager throws an error', function () {
|
|
let error
|
|
|
|
beforeEach(function (done) {
|
|
error = new Error('error message')
|
|
|
|
this.archiveFilesForBuild.rejects(error)
|
|
|
|
this.res = {
|
|
status: sinon.stub().returnsThis(),
|
|
send: sinon.stub(),
|
|
}
|
|
this.req = {
|
|
params: {
|
|
project_id: 'project-id-123',
|
|
user_id: 'user-id-123',
|
|
build_id: 'build-id-123',
|
|
},
|
|
query: {
|
|
files: ['output.tex'],
|
|
},
|
|
}
|
|
this.OutputController.createOutputZip(
|
|
this.req,
|
|
this.res,
|
|
(this.next = sinon.stub().callsFake(() => {
|
|
done()
|
|
}))
|
|
)
|
|
})
|
|
|
|
it('calls next with the error', function () {
|
|
sinon.assert.calledWith(this.next, error)
|
|
})
|
|
})
|
|
})
|
|
})
|