2014-02-26 10:56:52 -05:00
|
|
|
SandboxedModule = require('sandboxed-module')
|
|
|
|
sinon = require('sinon')
|
|
|
|
require('chai').should()
|
2016-12-01 11:50:55 -05:00
|
|
|
modulePath = require('path').join __dirname, '../../../../app/js/HistoryManager'
|
2014-02-26 10:56:52 -05:00
|
|
|
|
2016-12-01 11:50:55 -05:00
|
|
|
describe "HistoryManager", ->
|
2014-02-26 10:56:52 -05:00
|
|
|
beforeEach ->
|
2016-12-01 11:50:55 -05:00
|
|
|
@HistoryManager = SandboxedModule.require modulePath, requires:
|
2014-02-26 10:56:52 -05:00
|
|
|
"request": @request = {}
|
2017-10-05 08:45:29 -04:00
|
|
|
"settings-sharelatex": @Settings = {
|
|
|
|
apis:
|
|
|
|
project_history:
|
|
|
|
enabled: true
|
|
|
|
url: "http://project_history.example.com"
|
|
|
|
trackchanges:
|
|
|
|
url: "http://trackchanges.example.com"
|
|
|
|
}
|
2014-03-04 07:39:02 -05:00
|
|
|
"logger-sharelatex": @logger = { log: sinon.stub(), error: sinon.stub() }
|
2017-04-13 12:00:42 -04:00
|
|
|
"./HistoryRedisManager": @HistoryRedisManager = {}
|
2014-03-19 11:56:44 -04:00
|
|
|
@project_id = "mock-project-id"
|
2014-02-26 10:56:52 -05:00
|
|
|
@doc_id = "mock-doc-id"
|
|
|
|
@callback = sinon.stub()
|
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
describe "flushChangesAsync", ->
|
2014-02-26 10:56:52 -05:00
|
|
|
beforeEach ->
|
2017-10-05 08:45:29 -04:00
|
|
|
@HistoryManager._flushDocChangesAsync = sinon.stub()
|
|
|
|
@HistoryManager._flushProjectChangesAsync = sinon.stub()
|
2014-02-26 10:56:52 -05:00
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
@HistoryManager.flushChangesAsync(@project_id, @doc_id)
|
2014-02-26 10:56:52 -05:00
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
it "flushes doc changes", ->
|
|
|
|
@HistoryManager._flushDocChangesAsync
|
|
|
|
.calledWith(@project_id, @doc_id)
|
|
|
|
.should.equal true
|
2014-02-26 10:56:52 -05:00
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
it "flushes project changes", ->
|
|
|
|
@HistoryManager._flushProjectChangesAsync
|
|
|
|
.calledWith(@project_id)
|
|
|
|
.should.equal true
|
2014-02-26 10:56:52 -05:00
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
describe "_flushDocChangesAsync", ->
|
|
|
|
beforeEach ->
|
|
|
|
@request.post = sinon.stub().callsArgWith(1, null, statusCode: 204)
|
|
|
|
|
|
|
|
@HistoryManager._flushDocChangesAsync @project_id, @doc_id
|
2014-02-26 10:56:52 -05:00
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
it "should send a request to the track changes api", ->
|
|
|
|
@request.post
|
|
|
|
.calledWith("#{@Settings.apis.trackchanges.url}/project/#{@project_id}/doc/#{@doc_id}/flush")
|
|
|
|
.should.equal true
|
|
|
|
|
|
|
|
describe "_flushProjectChangesAsync", ->
|
|
|
|
beforeEach ->
|
|
|
|
@request.post = sinon.stub().callsArgWith(1, null, statusCode: 204)
|
|
|
|
|
|
|
|
@HistoryManager._flushProjectChangesAsync @project_id
|
|
|
|
|
|
|
|
it "should send a request to the project history api", ->
|
|
|
|
@request.post
|
|
|
|
.calledWith("#{@Settings.apis.project_history.url}/project/#{@project_id}/flush")
|
|
|
|
.should.equal true
|
2014-02-28 13:29:05 -05:00
|
|
|
|
2017-05-09 07:02:27 -04:00
|
|
|
describe "recordAndFlushHistoryOps", ->
|
2014-02-28 13:29:05 -05:00
|
|
|
beforeEach ->
|
2017-10-05 08:45:29 -04:00
|
|
|
@ops = [ 'mock-ops' ]
|
|
|
|
@project_ops_length = 10
|
|
|
|
@doc_ops_length = 5
|
2014-02-28 13:29:05 -05:00
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
@HistoryManager._flushProjectChangesAsync = sinon.stub()
|
|
|
|
@HistoryRedisManager.recordDocHasHistoryOps = sinon.stub().callsArg(3)
|
|
|
|
@HistoryManager._flushDocChangesAsync = sinon.stub()
|
|
|
|
|
|
|
|
describe "with no ops", ->
|
2014-02-28 13:29:05 -05:00
|
|
|
beforeEach ->
|
2017-10-05 08:45:29 -04:00
|
|
|
@HistoryManager.recordAndFlushHistoryOps(
|
|
|
|
@project_id, @doc_id, [], @doc_ops_length, @project_ops_length, @callback
|
|
|
|
)
|
2014-02-28 13:29:05 -05:00
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
it "should not flush project changes", ->
|
|
|
|
@HistoryManager._flushProjectChangesAsync.called.should.equal false
|
|
|
|
|
|
|
|
it "should not record doc has history ops", ->
|
|
|
|
@HistoryRedisManager.recordDocHasHistoryOps.called.should.equal false
|
|
|
|
|
|
|
|
it "should not flush doc changes", ->
|
|
|
|
@HistoryManager._flushDocChangesAsync.called.should.equal false
|
2014-03-21 08:41:05 -04:00
|
|
|
|
|
|
|
it "should call the callback", ->
|
|
|
|
@callback.called.should.equal true
|
2014-02-28 13:29:05 -05:00
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
describe "with enough ops to flush project changes", ->
|
2014-03-21 08:41:05 -04:00
|
|
|
beforeEach ->
|
2017-10-05 08:45:29 -04:00
|
|
|
@HistoryManager._shouldFlushHistoryOps = sinon.stub()
|
|
|
|
@HistoryManager._shouldFlushHistoryOps.withArgs(@project_ops_length).returns(true)
|
|
|
|
@HistoryManager._shouldFlushHistoryOps.withArgs(@doc_ops_length).returns(false)
|
2016-08-23 11:00:46 -04:00
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
@HistoryManager.recordAndFlushHistoryOps(
|
|
|
|
@project_id, @doc_id, @ops, @doc_ops_length, @project_ops_length, @callback
|
|
|
|
)
|
|
|
|
|
|
|
|
it "should flush project changes", ->
|
|
|
|
@HistoryManager._flushProjectChangesAsync
|
|
|
|
.calledWith(@project_id)
|
2016-08-23 11:00:46 -04:00
|
|
|
.should.equal true
|
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
it "should record doc has history ops", ->
|
|
|
|
@HistoryRedisManager.recordDocHasHistoryOps
|
|
|
|
.calledWith(@project_id, @doc_id, @ops)
|
|
|
|
|
|
|
|
it "should not flush doc changes", ->
|
|
|
|
@HistoryManager._flushDocChangesAsync.called.should.equal false
|
|
|
|
|
|
|
|
it "should call the callback", ->
|
|
|
|
@callback.called.should.equal true
|
|
|
|
|
|
|
|
describe "with enough ops to flush doc changes", ->
|
2016-08-23 11:00:46 -04:00
|
|
|
beforeEach ->
|
2017-10-05 08:45:29 -04:00
|
|
|
@HistoryManager._shouldFlushHistoryOps = sinon.stub()
|
|
|
|
@HistoryManager._shouldFlushHistoryOps.withArgs(@project_ops_length).returns(false)
|
|
|
|
@HistoryManager._shouldFlushHistoryOps.withArgs(@doc_ops_length).returns(true)
|
|
|
|
|
|
|
|
@HistoryManager.recordAndFlushHistoryOps(
|
|
|
|
@project_id, @doc_id, @ops, @doc_ops_length, @project_ops_length, @callback
|
|
|
|
)
|
2014-03-21 08:41:05 -04:00
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
it "should not flush project changes", ->
|
|
|
|
@HistoryManager._flushProjectChangesAsync.called.should.equal false
|
|
|
|
|
|
|
|
it "should record doc has history ops", ->
|
|
|
|
@HistoryRedisManager.recordDocHasHistoryOps
|
|
|
|
.calledWith(@project_id, @doc_id, @ops)
|
|
|
|
|
|
|
|
it "should flush doc changes", ->
|
|
|
|
@HistoryManager._flushDocChangesAsync
|
2014-03-21 08:41:05 -04:00
|
|
|
.calledWith(@project_id, @doc_id)
|
|
|
|
.should.equal true
|
|
|
|
|
2017-10-05 08:45:29 -04:00
|
|
|
it "should call the callback", ->
|
|
|
|
@callback.called.should.equal true
|
|
|
|
|
|
|
|
describe "when recording doc has history ops errors", ->
|
2014-03-21 08:41:05 -04:00
|
|
|
beforeEach ->
|
2017-10-05 08:45:29 -04:00
|
|
|
@error = new Error("error")
|
2017-05-09 04:32:56 -04:00
|
|
|
@HistoryRedisManager.recordDocHasHistoryOps =
|
2017-10-05 08:45:29 -04:00
|
|
|
sinon.stub().callsArgWith(3, @error)
|
|
|
|
|
|
|
|
@HistoryManager.recordAndFlushHistoryOps(
|
|
|
|
@project_id, @doc_id, @ops, @doc_ops_length, @project_ops_length, @callback
|
|
|
|
)
|
|
|
|
|
|
|
|
it "should not flush doc changes", ->
|
|
|
|
@HistoryManager._flushDocChangesAsync.called.should.equal false
|
|
|
|
|
|
|
|
it "should call the callback with the error", ->
|
|
|
|
@callback.calledWith(@error).should.equal true
|
|
|
|
|
|
|
|
describe "_shouldFlushHistoryOps", ->
|
|
|
|
it "should return false if the number of ops is not known", ->
|
|
|
|
@HistoryManager._shouldFlushHistoryOps(null, ['a', 'b', 'c'], 1).should.equal false
|
|
|
|
|
|
|
|
it "should return false if the updates didn't take us past the threshold", ->
|
|
|
|
# Currently there are 14 ops
|
|
|
|
# Previously we were on 11 ops
|
|
|
|
# We didn't pass over a multiple of 5
|
|
|
|
@HistoryManager._shouldFlushHistoryOps(14, ['a', 'b', 'c'], 5).should.equal false
|
|
|
|
|
|
|
|
it "should return true if the updates took to the threshold", ->
|
|
|
|
# Currently there are 15 ops
|
|
|
|
# Previously we were on 12 ops
|
|
|
|
# We've reached a new multiple of 5
|
|
|
|
@HistoryManager._shouldFlushHistoryOps(15, ['a', 'b', 'c'], 5).should.equal true
|
|
|
|
|
|
|
|
it "should return true if the updates took past the threshold", ->
|
|
|
|
# Currently there are 19 ops
|
|
|
|
# Previously we were on 16 ops
|
|
|
|
# We didn't pass over a multiple of 5
|
|
|
|
@HistoryManager._shouldFlushHistoryOps(17, ['a', 'b', 'c'], 5).should.equal true
|