/* 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); }); }); }); });