overleaf/services/clsi/test/unit/js/UrlFetcherTests.js

172 lines
5.5 KiB
JavaScript

/* eslint-disable
no-return-assign,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
require('chai').should()
const modulePath = require('path').join(__dirname, '../../../app/js/UrlFetcher')
const { EventEmitter } = require('events')
describe('UrlFetcher', function() {
beforeEach(function() {
this.callback = sinon.stub()
this.url = 'https://www.example.com/file/here?query=string'
return (this.UrlFetcher = SandboxedModule.require(modulePath, {
requires: {
request: {
defaults: (this.defaults = sinon.stub().returns((this.request = {})))
},
fs: (this.fs = {}),
'logger-sharelatex': (this.logger = {
log: sinon.stub(),
error: sinon.stub()
}),
'settings-sharelatex': (this.settings = {})
}
}))
})
it('should turn off the cookie jar in request', function() {
return this.defaults.calledWith({ jar: false }).should.equal(true)
})
describe('rewrite url domain if filestoreDomainOveride is set', function() {
beforeEach(function() {
this.path = '/path/to/file/on/disk'
this.request.get = sinon
.stub()
.returns((this.urlStream = new EventEmitter()))
this.urlStream.pipe = sinon.stub()
this.urlStream.pause = sinon.stub()
this.urlStream.resume = sinon.stub()
this.fs.createWriteStream = sinon
.stub()
.returns((this.fileStream = new EventEmitter()))
return (this.fs.unlink = (file, callback) => callback())
})
it('should use the normal domain when override not set', function(done) {
this.UrlFetcher.pipeUrlToFile(this.url, this.path, () => {
this.request.get.args[0][0].url.should.equal(this.url)
return done()
})
this.res = { statusCode: 200 }
this.urlStream.emit('response', this.res)
this.urlStream.emit('end')
return this.fileStream.emit('finish')
})
return it('should use override domain when filestoreDomainOveride is set', function(done) {
this.settings.filestoreDomainOveride = '192.11.11.11'
this.UrlFetcher.pipeUrlToFile(this.url, this.path, () => {
this.request.get.args[0][0].url.should.equal(
'192.11.11.11/file/here?query=string'
)
return done()
})
this.res = { statusCode: 200 }
this.urlStream.emit('response', this.res)
this.urlStream.emit('end')
return this.fileStream.emit('finish')
})
})
return describe('pipeUrlToFile', function() {
beforeEach(function(done) {
this.path = '/path/to/file/on/disk'
this.request.get = sinon
.stub()
.returns((this.urlStream = new EventEmitter()))
this.urlStream.pipe = sinon.stub()
this.urlStream.pause = sinon.stub()
this.urlStream.resume = sinon.stub()
this.fs.createWriteStream = sinon
.stub()
.returns((this.fileStream = new EventEmitter()))
this.fs.unlink = (file, callback) => callback()
return done()
})
describe('successfully', function() {
beforeEach(function(done) {
this.UrlFetcher.pipeUrlToFile(this.url, this.path, () => {
this.callback()
return done()
})
this.res = { statusCode: 200 }
this.urlStream.emit('response', this.res)
this.urlStream.emit('end')
return this.fileStream.emit('finish')
})
it('should request the URL', function() {
return this.request.get
.calledWith(sinon.match({ url: this.url }))
.should.equal(true)
})
it('should open the file for writing', function() {
return this.fs.createWriteStream
.calledWith(this.path)
.should.equal(true)
})
it('should pipe the URL to the file', function() {
return this.urlStream.pipe
.calledWith(this.fileStream)
.should.equal(true)
})
return it('should call the callback', function() {
return this.callback.called.should.equal(true)
})
})
describe('with non success status code', function() {
beforeEach(function(done) {
this.UrlFetcher.pipeUrlToFile(this.url, this.path, err => {
this.callback(err)
return done()
})
this.res = { statusCode: 404 }
this.urlStream.emit('response', this.res)
return this.urlStream.emit('end')
})
return it('should call the callback with an error', function() {
return this.callback
.calledWith(new Error('URL returned non-success status code: 404'))
.should.equal(true)
})
})
return describe('with error', function() {
beforeEach(function(done) {
this.UrlFetcher.pipeUrlToFile(this.url, this.path, err => {
this.callback(err)
return done()
})
return this.urlStream.emit(
'error',
(this.error = new Error('something went wrong'))
)
})
it('should call the callback with the error', function() {
return this.callback.calledWith(this.error).should.equal(true)
})
return it('should only call the callback once, even if end is called', function() {
this.urlStream.emit('end')
return this.callback.calledOnce.should.equal(true)
})
})
})
})