overleaf/services/web/test/acceptance/src/mocks/MockV1HistoryApi.js
Alf Eaton 1be43911b4 Merge pull request #3942 from overleaf/prettier-trailing-comma
Set Prettier's "trailingComma" setting to "es5"

GitOrigin-RevId: 9f14150511929a855b27467ad17be6ab262fe5d5
2021-04-28 02:10:01 +00:00

86 lines
2.4 KiB
JavaScript

const AbstractMockApi = require('./AbstractMockApi')
const { EventEmitter } = require('events')
class MockV1HistoryApi extends AbstractMockApi {
reset() {
this.fakeZipCall = 0
this.requestedZipPacks = 0
this.sentChunks = 0
this.events = new EventEmitter()
}
applyRoutes() {
this.app.get(
'/api/projects/:project_id/version/:version/zip',
(req, res, next) => {
res.header('content-disposition', 'attachment; name=project.zip')
res.header('content-type', 'application/octet-stream')
res.send(
`Mock zip for ${req.params.project_id} at version ${req.params.version}`
)
}
)
this.app.get(
'/fake-zip-download/:project_id/version/:version',
(req, res, next) => {
if (!(this.fakeZipCall++ > 0)) {
return res.sendStatus(404)
}
res.header('content-disposition', 'attachment; name=project.zip')
res.header('content-type', 'application/octet-stream')
if (req.params.version === '42') {
return res.send(
`Mock zip for ${req.params.project_id} at version ${req.params.version}`
)
}
const writeChunk = () => {
res.write('chunk' + this.sentChunks++)
}
const writeEvery = interval => {
if (req.aborted) return
// setInterval delays the first run
writeChunk()
const periodicWrite = setInterval(writeChunk, interval)
req.on('aborted', () => clearInterval(periodicWrite))
const deadLine = setTimeout(() => {
clearInterval(periodicWrite)
res.end()
}, 10 * 1000)
res.on('end', () => clearTimeout(deadLine))
}
if (req.params.version === '100') {
return writeEvery(100)
}
res.sendStatus(400)
}
)
this.app.post(
'/api/projects/:project_id/version/:version/zip',
(req, res, next) => {
this.requestedZipPacks++
this.events.emit('v1-history-pack-zip')
res.json({
zipUrl: `http://localhost:3100/fake-zip-download/${req.params.project_id}/version/${req.params.version}`,
})
}
)
this.app.delete('/api/projects/:project_id', (req, res, next) => {
res.sendStatus(204)
})
}
}
module.exports = MockV1HistoryApi
// type hint for the inherited `instance` method
/**
* @function instance
* @memberOf MockV1HistoryApi
* @static
* @returns {MockV1HistoryApi}
*/