| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809 |
- /*
- * decaffeinate suggestions:
- * DS102: Remove unnecessary code created because of implicit returns
- * DS206: Consider reworking classes to avoid initClass
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
- */
- const sinon = require('sinon');
- const chai = require('chai');
- const should = chai.should();
- const modulePath = "../../../../app/js/HttpController.js";
- const SandboxedModule = require('sandboxed-module');
- const Errors = require("../../../../app/js/Errors.js");
- describe("HttpController", function() {
- beforeEach(function() {
- let Timer;
- this.HttpController = SandboxedModule.require(modulePath, { requires: {
- "./DocumentManager": (this.DocumentManager = {}),
- "./HistoryManager": (this.HistoryManager =
- {flushProjectChangesAsync: sinon.stub()}),
- "./ProjectManager": (this.ProjectManager = {}),
- "logger-sharelatex" : (this.logger = { log: sinon.stub() }),
- "./ProjectFlusher": {flushAllProjects() {}},
- "./DeleteQueueManager": (this.DeleteQueueManager = {}),
- "./Metrics": (this.Metrics = {}),
- "./Errors" : Errors
- }
- }
- );
- this.Metrics.Timer = (Timer = (function() {
- Timer = class Timer {
- static initClass() {
- this.prototype.done = sinon.stub();
- }
- };
- Timer.initClass();
- return Timer;
- })());
- this.project_id = "project-id-123";
- this.doc_id = "doc-id-123";
- this.next = sinon.stub();
- return this.res = {
- send: sinon.stub(),
- sendStatus: sinon.stub(),
- json: sinon.stub()
- };
- });
- describe("getDoc", function() {
- beforeEach(function() {
- this.lines = ["one", "two", "three"];
- this.ops = ["mock-op-1", "mock-op-2"];
- this.version = 42;
- this.fromVersion = 42;
- this.ranges = { changes: "mock", comments: "mock" };
- this.pathname = '/a/b/c';
- return this.req = {
- params: {
- project_id: this.project_id,
- doc_id: this.doc_id
- }
- };
- });
- describe("when the document exists and no recent ops are requested", function() {
- beforeEach(function() {
- this.DocumentManager.getDocAndRecentOpsWithLock = sinon.stub().callsArgWith(3, null, this.lines, this.version, [], this.ranges, this.pathname);
- return this.HttpController.getDoc(this.req, this.res, this.next);
- });
- it("should get the doc", function() {
- return this.DocumentManager.getDocAndRecentOpsWithLock
- .calledWith(this.project_id, this.doc_id, -1)
- .should.equal(true);
- });
- it("should return the doc as JSON", function() {
- return this.res.json
- .calledWith({
- id: this.doc_id,
- lines: this.lines,
- version: this.version,
- ops: [],
- ranges: this.ranges,
- pathname: this.pathname
- })
- .should.equal(true);
- });
- it("should log the request", function() {
- return this.logger.log
- .calledWith({doc_id: this.doc_id, project_id: this.project_id}, "getting doc via http")
- .should.equal(true);
- });
- return it("should time the request", function() {
- return this.Metrics.Timer.prototype.done.called.should.equal(true);
- });
- });
- describe("when recent ops are requested", function() {
- beforeEach(function() {
- this.DocumentManager.getDocAndRecentOpsWithLock = sinon.stub().callsArgWith(3, null, this.lines, this.version, this.ops, this.ranges, this.pathname);
- this.req.query = {fromVersion: `${this.fromVersion}`};
- return this.HttpController.getDoc(this.req, this.res, this.next);
- });
- it("should get the doc", function() {
- return this.DocumentManager.getDocAndRecentOpsWithLock
- .calledWith(this.project_id, this.doc_id, this.fromVersion)
- .should.equal(true);
- });
- it("should return the doc as JSON", function() {
- return this.res.json
- .calledWith({
- id: this.doc_id,
- lines: this.lines,
- version: this.version,
- ops: this.ops,
- ranges: this.ranges,
- pathname: this.pathname
- })
- .should.equal(true);
- });
- it("should log the request", function() {
- return this.logger.log
- .calledWith({doc_id: this.doc_id, project_id: this.project_id}, "getting doc via http")
- .should.equal(true);
- });
- return it("should time the request", function() {
- return this.Metrics.Timer.prototype.done.called.should.equal(true);
- });
- });
- describe("when the document does not exist", function() {
- beforeEach(function() {
- this.DocumentManager.getDocAndRecentOpsWithLock = sinon.stub().callsArgWith(3, null, null, null);
- return this.HttpController.getDoc(this.req, this.res, this.next);
- });
- return it("should call next with NotFoundError", function() {
- return this.next
- .calledWith(new Errors.NotFoundError("not found"))
- .should.equal(true);
- });
- });
- return describe("when an errors occurs", function() {
- beforeEach(function() {
- this.DocumentManager.getDocAndRecentOpsWithLock = sinon.stub().callsArgWith(3, new Error("oops"), null, null);
- return this.HttpController.getDoc(this.req, this.res, this.next);
- });
- return it("should call next with the error", function() {
- return this.next
- .calledWith(new Error("oops"))
- .should.equal(true);
- });
- });
- });
- describe("setDoc", function() {
- beforeEach(function() {
- this.lines = ["one", "two", "three"];
- this.source = "dropbox";
- this.user_id = "user-id-123";
- return this.req = {
- headers: {},
- params: {
- project_id: this.project_id,
- doc_id: this.doc_id
- },
- body: {
- lines: this.lines,
- source: this.source,
- user_id: this.user_id,
- undoing: (this.undoing = true)
- }
- };
- });
- describe("successfully", function() {
- beforeEach(function() {
- this.DocumentManager.setDocWithLock = sinon.stub().callsArgWith(6);
- return this.HttpController.setDoc(this.req, this.res, this.next);
- });
- it("should set the doc", function() {
- return this.DocumentManager.setDocWithLock
- .calledWith(this.project_id, this.doc_id, this.lines, this.source, this.user_id, this.undoing)
- .should.equal(true);
- });
- it("should return a successful No Content response", function() {
- return this.res.sendStatus
- .calledWith(204)
- .should.equal(true);
- });
- it("should log the request", function() {
- return this.logger.log
- .calledWith({doc_id: this.doc_id, project_id: this.project_id, lines: this.lines, source: this.source, user_id: this.user_id, undoing: this.undoing}, "setting doc via http")
- .should.equal(true);
- });
- return it("should time the request", function() {
- return this.Metrics.Timer.prototype.done.called.should.equal(true);
- });
- });
- describe("when an errors occurs", function() {
- beforeEach(function() {
- this.DocumentManager.setDocWithLock = sinon.stub().callsArgWith(6, new Error("oops"));
- return this.HttpController.setDoc(this.req, this.res, this.next);
- });
- return it("should call next with the error", function() {
- return this.next
- .calledWith(new Error("oops"))
- .should.equal(true);
- });
- });
- return describe("when the payload is too large", function() {
- beforeEach(function() {
- const lines = [];
- for (let _ = 0; _ <= 200000; _++) {
- lines.push("test test test");
- }
- this.req.body.lines = lines;
- this.DocumentManager.setDocWithLock = sinon.stub().callsArgWith(6);
- return this.HttpController.setDoc(this.req, this.res, this.next);
- });
- it('should send back a 406 response', function() {
- return this.res.sendStatus.calledWith(406).should.equal(true);
- });
- return it('should not call setDocWithLock', function() {
- return this.DocumentManager.setDocWithLock.callCount.should.equal(0);
- });
- });
- });
- describe("flushProject", function() {
- beforeEach(function() {
- return this.req = {
- params: {
- project_id: this.project_id
- }
- };
- });
- describe("successfully", function() {
- beforeEach(function() {
- this.ProjectManager.flushProjectWithLocks = sinon.stub().callsArgWith(1);
- return this.HttpController.flushProject(this.req, this.res, this.next);
- });
- it("should flush the project", function() {
- return this.ProjectManager.flushProjectWithLocks
- .calledWith(this.project_id)
- .should.equal(true);
- });
- it("should return a successful No Content response", function() {
- return this.res.sendStatus
- .calledWith(204)
- .should.equal(true);
- });
- it("should log the request", function() {
- return this.logger.log
- .calledWith({project_id: this.project_id}, "flushing project via http")
- .should.equal(true);
- });
- return it("should time the request", function() {
- return this.Metrics.Timer.prototype.done.called.should.equal(true);
- });
- });
- return describe("when an errors occurs", function() {
- beforeEach(function() {
- this.ProjectManager.flushProjectWithLocks = sinon.stub().callsArgWith(1, new Error("oops"));
- return this.HttpController.flushProject(this.req, this.res, this.next);
- });
- return it("should call next with the error", function() {
- return this.next
- .calledWith(new Error("oops"))
- .should.equal(true);
- });
- });
- });
- describe("flushDocIfLoaded", function() {
- beforeEach(function() {
- this.lines = ["one", "two", "three"];
- this.version = 42;
- return this.req = {
- params: {
- project_id: this.project_id,
- doc_id: this.doc_id
- }
- };
- });
- describe("successfully", function() {
- beforeEach(function() {
- this.DocumentManager.flushDocIfLoadedWithLock = sinon.stub().callsArgWith(2);
- return this.HttpController.flushDocIfLoaded(this.req, this.res, this.next);
- });
- it("should flush the doc", function() {
- return this.DocumentManager.flushDocIfLoadedWithLock
- .calledWith(this.project_id, this.doc_id)
- .should.equal(true);
- });
- it("should return a successful No Content response", function() {
- return this.res.sendStatus
- .calledWith(204)
- .should.equal(true);
- });
- it("should log the request", function() {
- return this.logger.log
- .calledWith({doc_id: this.doc_id, project_id: this.project_id}, "flushing doc via http")
- .should.equal(true);
- });
- return it("should time the request", function() {
- return this.Metrics.Timer.prototype.done.called.should.equal(true);
- });
- });
- return describe("when an errors occurs", function() {
- beforeEach(function() {
- this.DocumentManager.flushDocIfLoadedWithLock = sinon.stub().callsArgWith(2, new Error("oops"));
- return this.HttpController.flushDocIfLoaded(this.req, this.res, this.next);
- });
- return it("should call next with the error", function() {
- return this.next
- .calledWith(new Error("oops"))
- .should.equal(true);
- });
- });
- });
- describe("deleteDoc", function() {
- beforeEach(function() {
- return this.req = {
- params: {
- project_id: this.project_id,
- doc_id: this.doc_id
- },
- query: {}
- };});
- describe("successfully", function() {
- beforeEach(function() {
- this.DocumentManager.flushAndDeleteDocWithLock = sinon.stub().callsArgWith(3);
- return this.HttpController.deleteDoc(this.req, this.res, this.next);
- });
- it("should flush and delete the doc", function() {
- return this.DocumentManager.flushAndDeleteDocWithLock
- .calledWith(this.project_id, this.doc_id, { ignoreFlushErrors: false })
- .should.equal(true);
- });
- it("should flush project history", function() {
- return this.HistoryManager.flushProjectChangesAsync
- .calledWithExactly(this.project_id)
- .should.equal(true);
- });
- it("should return a successful No Content response", function() {
- return this.res.sendStatus
- .calledWith(204)
- .should.equal(true);
- });
- it("should log the request", function() {
- return this.logger.log
- .calledWith({doc_id: this.doc_id, project_id: this.project_id}, "deleting doc via http")
- .should.equal(true);
- });
- return it("should time the request", function() {
- return this.Metrics.Timer.prototype.done.called.should.equal(true);
- });
- });
- describe("ignoring errors", function() {
- beforeEach(function() {
- this.req.query.ignore_flush_errors = 'true';
- this.DocumentManager.flushAndDeleteDocWithLock = sinon.stub().yields();
- return this.HttpController.deleteDoc(this.req, this.res, this.next);
- });
- it("should delete the doc", function() {
- return this.DocumentManager.flushAndDeleteDocWithLock
- .calledWith(this.project_id, this.doc_id, { ignoreFlushErrors: true })
- .should.equal(true);
- });
- return it("should return a successful No Content response", function() {
- return this.res.sendStatus.calledWith(204).should.equal(true);
- });
- });
- return describe("when an errors occurs", function() {
- beforeEach(function() {
- this.DocumentManager.flushAndDeleteDocWithLock = sinon.stub().callsArgWith(3, new Error("oops"));
- return this.HttpController.deleteDoc(this.req, this.res, this.next);
- });
- it("should flush project history", function() {
- return this.HistoryManager.flushProjectChangesAsync
- .calledWithExactly(this.project_id)
- .should.equal(true);
- });
- return it("should call next with the error", function() {
- return this.next
- .calledWith(new Error("oops"))
- .should.equal(true);
- });
- });
- });
- describe("deleteProject", function() {
- beforeEach(function() {
- return this.req = {
- params: {
- project_id: this.project_id
- }
- };
- });
- describe("successfully", function() {
- beforeEach(function() {
- this.ProjectManager.flushAndDeleteProjectWithLocks = sinon.stub().callsArgWith(2);
- return this.HttpController.deleteProject(this.req, this.res, this.next);
- });
- it("should delete the project", function() {
- return this.ProjectManager.flushAndDeleteProjectWithLocks
- .calledWith(this.project_id)
- .should.equal(true);
- });
- it("should return a successful No Content response", function() {
- return this.res.sendStatus
- .calledWith(204)
- .should.equal(true);
- });
- it("should log the request", function() {
- return this.logger.log
- .calledWith({project_id: this.project_id}, "deleting project via http")
- .should.equal(true);
- });
- return it("should time the request", function() {
- return this.Metrics.Timer.prototype.done.called.should.equal(true);
- });
- });
- describe("with the background=true option from realtime", function() {
- beforeEach(function() {
- this.ProjectManager.queueFlushAndDeleteProject = sinon.stub().callsArgWith(1);
- this.req.query = {background:true, shutdown:true};
- return this.HttpController.deleteProject(this.req, this.res, this.next);
- });
- return it("should queue the flush and delete", function() {
- return this.ProjectManager.queueFlushAndDeleteProject
- .calledWith(this.project_id)
- .should.equal(true);
- });
- });
- return describe("when an errors occurs", function() {
- beforeEach(function() {
- this.ProjectManager.flushAndDeleteProjectWithLocks = sinon.stub().callsArgWith(2, new Error("oops"));
- return this.HttpController.deleteProject(this.req, this.res, this.next);
- });
- return it("should call next with the error", function() {
- return this.next
- .calledWith(new Error("oops"))
- .should.equal(true);
- });
- });
- });
- describe("acceptChanges", function() {
- beforeEach(function() {
- return this.req = {
- params: {
- project_id: this.project_id,
- doc_id: this.doc_id,
- change_id: (this.change_id = "mock-change-od-1")
- }
- };
- });
- describe("successfully with a single change", function() {
- beforeEach(function() {
- this.DocumentManager.acceptChangesWithLock = sinon.stub().callsArgWith(3);
- return this.HttpController.acceptChanges(this.req, this.res, this.next);
- });
- it("should accept the change", function() {
- return this.DocumentManager.acceptChangesWithLock
- .calledWith(this.project_id, this.doc_id, [ this.change_id ])
- .should.equal(true);
- });
- it("should return a successful No Content response", function() {
- return this.res.sendStatus
- .calledWith(204)
- .should.equal(true);
- });
- it("should log the request", function() {
- return this.logger.log
- .calledWith({project_id: this.project_id, doc_id: this.doc_id}, "accepting 1 changes via http")
- .should.equal(true);
- });
- return it("should time the request", function() {
- return this.Metrics.Timer.prototype.done.called.should.equal(true);
- });
- });
- describe("succesfully with with multiple changes", function() {
- beforeEach(function() {
- this.change_ids = [ "mock-change-od-1", "mock-change-od-2", "mock-change-od-3", "mock-change-od-4" ];
- this.req.body =
- {change_ids: this.change_ids};
- this.DocumentManager.acceptChangesWithLock = sinon.stub().callsArgWith(3);
- return this.HttpController.acceptChanges(this.req, this.res, this.next);
- });
- it("should accept the changes in the body payload", function() {
- return this.DocumentManager.acceptChangesWithLock
- .calledWith(this.project_id, this.doc_id, this.change_ids)
- .should.equal(true);
- });
- return it("should log the request with the correct number of changes", function() {
- return this.logger.log
- .calledWith({project_id: this.project_id, doc_id: this.doc_id}, `accepting ${ this.change_ids.length } changes via http`)
- .should.equal(true);
- });
- });
- return describe("when an errors occurs", function() {
- beforeEach(function() {
- this.DocumentManager.acceptChangesWithLock = sinon.stub().callsArgWith(3, new Error("oops"));
- return this.HttpController.acceptChanges(this.req, this.res, this.next);
- });
- return it("should call next with the error", function() {
- return this.next
- .calledWith(new Error("oops"))
- .should.equal(true);
- });
- });
- });
- describe("deleteComment", function() {
- beforeEach(function() {
- return this.req = {
- params: {
- project_id: this.project_id,
- doc_id: this.doc_id,
- comment_id: (this.comment_id = "mock-comment-id")
- }
- };
- });
- describe("successfully", function() {
- beforeEach(function() {
- this.DocumentManager.deleteCommentWithLock = sinon.stub().callsArgWith(3);
- return this.HttpController.deleteComment(this.req, this.res, this.next);
- });
- it("should accept the change", function() {
- return this.DocumentManager.deleteCommentWithLock
- .calledWith(this.project_id, this.doc_id, this.comment_id)
- .should.equal(true);
- });
- it("should return a successful No Content response", function() {
- return this.res.sendStatus
- .calledWith(204)
- .should.equal(true);
- });
- it("should log the request", function() {
- return this.logger.log
- .calledWith({project_id: this.project_id, doc_id: this.doc_id, comment_id: this.comment_id}, "deleting comment via http")
- .should.equal(true);
- });
- return it("should time the request", function() {
- return this.Metrics.Timer.prototype.done.called.should.equal(true);
- });
- });
- return describe("when an errors occurs", function() {
- beforeEach(function() {
- this.DocumentManager.deleteCommentWithLock = sinon.stub().callsArgWith(3, new Error("oops"));
- return this.HttpController.deleteComment(this.req, this.res, this.next);
- });
- return it("should call next with the error", function() {
- return this.next
- .calledWith(new Error("oops"))
- .should.equal(true);
- });
- });
- });
- describe("getProjectDocsAndFlushIfOld", function() {
- beforeEach(function() {
- this.state = "01234567890abcdef";
- this.docs = [{_id: "1234", lines: "hello", v: 23}, {_id: "4567", lines: "world", v: 45}];
- return this.req = {
- params: {
- project_id: this.project_id
- },
- query: {
- state: this.state
- }
- };
- });
- describe("successfully", function() {
- beforeEach(function() {
- this.ProjectManager.getProjectDocsAndFlushIfOld = sinon.stub().callsArgWith(3,null, this.docs);
- return this.HttpController.getProjectDocsAndFlushIfOld(this.req, this.res, this.next);
- });
- it("should get docs from the project manager", function() {
- return this.ProjectManager.getProjectDocsAndFlushIfOld
- .calledWith(this.project_id, this.state, {})
- .should.equal(true);
- });
- it("should return a successful response", function() {
- return this.res.send
- .calledWith(this.docs)
- .should.equal(true);
- });
- it("should log the request", function() {
- return this.logger.log
- .calledWith({project_id: this.project_id, exclude: []}, "getting docs via http")
- .should.equal(true);
- });
- it("should log the response", function() {
- return this.logger.log
- .calledWith({project_id: this.project_id, result: ["1234:23", "4567:45"]}, "got docs via http")
- .should.equal(true);
- });
- return it("should time the request", function() {
- return this.Metrics.Timer.prototype.done.called.should.equal(true);
- });
- });
- describe("when there is a conflict", function() {
- beforeEach(function() {
- this.ProjectManager.getProjectDocsAndFlushIfOld = sinon.stub().callsArgWith(3, new Errors.ProjectStateChangedError("project state changed"));
- return this.HttpController.getProjectDocsAndFlushIfOld(this.req, this.res, this.next);
- });
- return it("should return an HTTP 409 Conflict response", function() {
- return this.res.sendStatus
- .calledWith(409)
- .should.equal(true);
- });
- });
- return describe("when an error occurs", function() {
- beforeEach(function() {
- this.ProjectManager.getProjectDocsAndFlushIfOld = sinon.stub().callsArgWith(3, new Error("oops"));
- return this.HttpController.getProjectDocsAndFlushIfOld(this.req, this.res, this.next);
- });
- return it("should call next with the error", function() {
- return this.next
- .calledWith(new Error("oops"))
- .should.equal(true);
- });
- });
- });
- describe("updateProject", function() {
- beforeEach(function() {
- this.projectHistoryId = "history-id-123";
- this.userId = "user-id-123";
- this.docUpdates = sinon.stub();
- this.fileUpdates = sinon.stub();
- this.version = 1234567;
- return this.req = {
- body: {projectHistoryId: this.projectHistoryId, userId: this.userId, docUpdates: this.docUpdates, fileUpdates: this.fileUpdates, version: this.version},
- params: {
- project_id: this.project_id
- }
- };
- });
- describe("successfully", function() {
- beforeEach(function() {
- this.ProjectManager.updateProjectWithLocks = sinon.stub().callsArgWith(6);
- return this.HttpController.updateProject(this.req, this.res, this.next);
- });
- it("should accept the change", function() {
- return this.ProjectManager.updateProjectWithLocks
- .calledWith(this.project_id, this.projectHistoryId, this.userId, this.docUpdates, this.fileUpdates, this.version)
- .should.equal(true);
- });
- it("should return a successful No Content response", function() {
- return this.res.sendStatus
- .calledWith(204)
- .should.equal(true);
- });
- return it("should time the request", function() {
- return this.Metrics.Timer.prototype.done.called.should.equal(true);
- });
- });
- return describe("when an errors occurs", function() {
- beforeEach(function() {
- this.ProjectManager.updateProjectWithLocks = sinon.stub().callsArgWith(6, new Error("oops"));
- return this.HttpController.updateProject(this.req, this.res, this.next);
- });
- return it("should call next with the error", function() {
- return this.next
- .calledWith(new Error("oops"))
- .should.equal(true);
- });
- });
- });
- return describe("resyncProjectHistory", function() {
- beforeEach(function() {
- this.projectHistoryId = "history-id-123";
- this.docs = sinon.stub();
- this.files = sinon.stub();
- this.fileUpdates = sinon.stub();
- return this.req = {
- body:
- {projectHistoryId: this.projectHistoryId, docs: this.docs, files: this.files},
- params: {
- project_id: this.project_id
- }
- };
- });
- describe("successfully", function() {
- beforeEach(function() {
- this.HistoryManager.resyncProjectHistory = sinon.stub().callsArgWith(4);
- return this.HttpController.resyncProjectHistory(this.req, this.res, this.next);
- });
- it("should accept the change", function() {
- return this.HistoryManager.resyncProjectHistory
- .calledWith(this.project_id, this.projectHistoryId, this.docs, this.files)
- .should.equal(true);
- });
- return it("should return a successful No Content response", function() {
- return this.res.sendStatus
- .calledWith(204)
- .should.equal(true);
- });
- });
- return describe("when an errors occurs", function() {
- beforeEach(function() {
- this.HistoryManager.resyncProjectHistory = sinon.stub().callsArgWith(4, new Error("oops"));
- return this.HttpController.resyncProjectHistory(this.req, this.res, this.next);
- });
- return it("should call next with the error", function() {
- return this.next
- .calledWith(new Error("oops"))
- .should.equal(true);
- });
- });
- });
- });
|