sinon = require "sinon" chai = require("chai") chai.should() expect = require("chai").expect {db, ObjectId} = require "../../../app/js/mongojs" Settings = require('settings-sharelatex') rclient = require("redis-sharelatex").createClient(Settings.redis.web) MockTrackChangesApi = require "./helpers/MockTrackChangesApi" MockWebApi = require "./helpers/MockWebApi" DocUpdaterClient = require "./helpers/DocUpdaterClient" describe "Setting a document", -> before -> @lines = ["one", "two", "three"] @version = 42 @update = doc: @doc_id op: [{ i: "one and a half\n" p: 4 }] v: @version @result = ["one", "one and a half", "two", "three"] @newLines = ["these", "are", "the", "new", "lines"] @source = "dropbox" @user_id = "user-id-123" sinon.spy MockTrackChangesApi, "flushDoc" sinon.spy MockWebApi, "setDocumentLines" after -> MockWebApi.setDocumentLines.restore() MockTrackChangesApi.flushDoc.restore() describe "when the updated doc exists in the doc updater", -> before (done) -> [@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()] MockWebApi.insertDoc @project_id, @doc_id, lines: @lines db.docOps.insert { doc_id: ObjectId(@doc_id) version: @version }, (error) => throw error if error? DocUpdaterClient.preloadDoc @project_id, @doc_id, (error) => throw error if error? DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) => throw error if error? setTimeout () => DocUpdaterClient.setDocLines @project_id, @doc_id, @newLines, @source, @user_id, (error, res, body) => @statusCode = res.statusCode done() , 200 it "should return a 204 status code", -> @statusCode.should.equal 204 it "should send the updated doc lines to the web api", -> MockWebApi.setDocumentLines .calledWith(@project_id, @doc_id, @newLines) .should.equal true it "should update the lines in the doc updater", (done) -> DocUpdaterClient.getDoc @project_id, @doc_id, (error, res, doc) => doc.lines.should.deep.equal @newLines done() it "should bump the version in the doc updater", (done) -> DocUpdaterClient.getDoc @project_id, @doc_id, (error, res, doc) => doc.version.should.equal @version + 2 done() it "should leave the document in redis", (done) -> rclient.get "doclines:#{@doc_id}", (error, lines) => throw error if error? expect(JSON.parse(lines)).to.deep.equal @newLines done() describe "when the updated doc does not exist in the doc updater", -> before (done) -> [@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()] MockWebApi.insertDoc @project_id, @doc_id, lines: @lines db.docOps.insert { doc_id: ObjectId(@doc_id) version: @version }, (error) => throw error if error? DocUpdaterClient.setDocLines @project_id, @doc_id, @newLines, @source, @user_id, (error, res, body) => @statusCode = res.statusCode setTimeout done, 200 it "should return a 204 status code", -> @statusCode.should.equal 204 it "should send the updated doc lines to the web api", -> MockWebApi.setDocumentLines .calledWith(@project_id, @doc_id, @newLines) .should.equal true it "should flush track changes", -> MockTrackChangesApi.flushDoc.calledWith(@doc_id).should.equal true it "should remove the document from redis", (done) -> rclient.get "doclines:#{@doc_id}", (error, lines) => throw error if error? expect(lines).to.not.exist done()