overleaf/services/web/test/UnitTests/coffee/ThirdPartyDataStore/UpdateMergerTests.coffee

181 lines
7.5 KiB
CoffeeScript
Raw Normal View History

2014-02-12 05:23:40 -05:00
Stream = require('stream')
SandboxedModule = require('sandboxed-module')
sinon = require('sinon')
require('chai').should()
modulePath = require('path').join __dirname, '../../../../app/js/Features/ThirdPartyDataStore/UpdateMerger.js'
BufferedStream = require('bufferedstream')
describe 'UpdateMerger :', ->
beforeEach ->
@editorController = {}
@updateReciver = {}
@projectLocator = {}
@projectEntityHandler = {}
@fs = {}
@FileTypeManager = {}
2014-11-27 05:46:52 -05:00
@LockManager =
getLock:sinon.stub()
releaseLock:sinon.stub()
2014-02-12 05:23:40 -05:00
@updateMerger = SandboxedModule.require modulePath, requires:
'../Editor/EditorController': @editorController
'../Project/ProjectLocator': @projectLocator
'../Project/ProjectEntityHandler': @projectEntityHandler
'fs': @fs
'../Uploads/FileTypeManager':@FileTypeManager
2014-11-27 05:46:52 -05:00
"../../infrastructure/LockManager": @LockManager
2014-02-12 05:23:40 -05:00
'logger-sharelatex':
log: ->
err: ->
@project_id = "project_id_here"
2014-10-15 09:11:02 -04:00
@source = "dropbox"
2014-02-12 05:23:40 -05:00
@update = new BufferedStream()
@update.headers = {}
describe 'mergeUpdate :', ->
beforeEach ->
@path = "/doc1"
@fsPath = "file/system/path.tex"
@updateMerger.p.writeStreamToDisk = sinon.stub().callsArgWith(3, null, @fsPath)
2014-11-27 05:46:52 -05:00
@LockManager.getLock.callsArgWith(1)
@LockManager.releaseLock.callsArgWith(1)
2014-02-12 05:23:40 -05:00
@FileTypeManager.isBinary = sinon.stub()
it 'should get the element id', (done)->
2014-11-27 05:46:52 -05:00
@projectLocator.findElementByPath = sinon.stub().callsArgWith(2)
@FileTypeManager.isBinary.callsArgWith(2, null, false)
@updateMerger.p.processDoc = sinon.stub().callsArgWith(5)
@updateMerger.mergeUpdate @project_id, @path, @update, @source, =>
2014-11-27 05:46:52 -05:00
@projectLocator.findElementByPath.calledWith(@project_id, @path).should.equal true
done()
2014-02-12 05:23:40 -05:00
it 'should process update as doc when it is a doc', (done)->
doc_id = "231312s"
2014-09-04 08:00:41 -04:00
@FileTypeManager.isBinary.callsArgWith(2, null, false)
2014-02-12 05:23:40 -05:00
@projectLocator.findElementByPath = (_, __, cb)->cb(null, {_id:doc_id})
@updateMerger.p.processDoc = sinon.stub().callsArgWith(5)
2014-02-12 05:23:40 -05:00
filePath = "/folder/doc.tex"
@updateMerger.mergeUpdate @project_id, filePath, @update, @source, =>
2014-09-04 08:00:41 -04:00
@FileTypeManager.isBinary.calledWith(filePath, @fsPath).should.equal true
@updateMerger.p.processDoc.calledWith(@project_id, doc_id, @fsPath, filePath, @source).should.equal true
2014-02-12 05:23:40 -05:00
done()
it 'should process update as file when it is not a doc', (done)->
file_id = "1231"
@projectLocator.findElementByPath = (_, __, cb)->cb(null, {_id:file_id})
2014-09-04 08:00:41 -04:00
@FileTypeManager.isBinary.callsArgWith(2, null, true)
@updateMerger.p.processFile = sinon.stub().callsArgWith(5)
2014-02-12 05:23:40 -05:00
filePath = "/folder/file1.png"
@updateMerger.mergeUpdate @project_id, filePath, @update, @source, =>
@updateMerger.p.processFile.calledWith(@project_id, file_id, @fsPath, filePath, @source).should.equal true
2014-09-04 08:00:41 -04:00
@FileTypeManager.isBinary.calledWith(filePath, @fsPath).should.equal true
2014-02-12 05:23:40 -05:00
done()
2014-11-27 05:46:52 -05:00
it "should get the lock", (done)->
@FileTypeManager.isBinary.callsArgWith(2, null, false)
@projectLocator.findElementByPath = (_, __, cb)->cb(null, {_id:"doc_id"})
@updateMerger.p.processDoc = sinon.stub().callsArgWith(5)
@updateMerger.mergeUpdate @project_id, @path, @update, @source, =>
@LockManager.getLock.calledWith(@project_id).should.equal true
done()
2014-02-12 05:23:40 -05:00
describe 'processDoc :', (done)->
beforeEach ->
@doc_id = "312312klnkld"
@docLines = "\\documentclass{article}\n\\usepackage[utf8]{inputenc}\n\n\\title{42}\n\\author{Jane Doe}\n\\date{June 2011}"
@splitDocLines = @docLines.split("\n")
@fs.readFile = sinon.stub().callsArgWith(2, null, @docLines)
it 'should set the doc text in the editor controller', (done)->
@editorController.setDoc = ->
mock = sinon.mock(@editorController).expects("setDoc").withArgs(@project_id, @doc_id, @splitDocLines, @source).callsArg(4)
2014-02-12 05:23:40 -05:00
@update.write(@docLines)
@update.end()
@updateMerger.p.processDoc @project_id, @doc_id, @update, "path", @source, ->
2014-02-12 05:23:40 -05:00
mock.verify()
done()
it 'should create a new doc when it doesnt exist', (done)->
folder = {_id:"adslkjioj"}
docName = "main.tex"
path = "folder1/folder2/#{docName}"
2014-11-27 05:46:52 -05:00
@editorController.mkdirpWithoutLock = sinon.stub().withArgs(@project_id).callsArgWith(2, null, [folder], folder)
@editorController.addDocWithoutLock = ->
mock = sinon.mock(@editorController).expects("addDocWithoutLock").withArgs(@project_id, folder._id, docName, @splitDocLines, @source).callsArg(5)
2014-02-12 05:23:40 -05:00
@update.write(@docLines)
@update.end()
@updateMerger.p.processDoc @project_id, undefined, @update, path, @source, ->
2014-02-12 05:23:40 -05:00
mock.verify()
done()
describe 'processFile :', (done)->
beforeEach ->
@file_id = "file_id_here"
@folder_id = "folder_id_here"
@path = "folder/file.png"
@folder = _id: @folder_id
@fileName = "file.png"
@fsPath = "fs/path.tex"
2014-11-27 05:46:52 -05:00
@editorController.addFileWithoutLock = sinon.stub().callsArg(5)
@editorController.replaceFile = sinon.stub().callsArg(4)
2014-11-27 05:46:52 -05:00
@editorController.deleteEntityWithoutLock = sinon.stub()
@editorController.mkdirpWithoutLock = sinon.stub().withArgs(@project_id).callsArgWith(2, null, [@folder], @folder)
2014-02-12 05:23:40 -05:00
@updateMerger.p.writeStreamToDisk = sinon.stub().withArgs(@project_id, @file_id, @update).callsArgWith(3, null, @fsPath)
it 'should replace file if the file already exists', (done)->
@updateMerger.p.processFile @project_id, @file_id, @fsPath, @path, @source, =>
2014-11-27 05:46:52 -05:00
@editorController.addFileWithoutLock.called.should.equal false
@editorController.replaceFile.calledWith(@project_id, @file_id, @fsPath, @source).should.equal true
2014-02-12 05:23:40 -05:00
done()
it 'should call add file if the file does not exist', (done)->
@updateMerger.p.processFile @project_id, undefined, @fsPath, @path, @source, =>
2014-11-27 05:46:52 -05:00
@editorController.mkdirpWithoutLock.calledWith(@project_id, "folder/").should.equal true
@editorController.addFileWithoutLock.calledWith(@project_id, @folder_id, @fileName, @fsPath, @source).should.equal true
2014-02-12 05:23:40 -05:00
@editorController.replaceFile.called.should.equal false
done()
describe 'delete entity :', (done)->
beforeEach ->
@path = "folder/doc1"
2014-11-27 05:46:52 -05:00
@editorController.deleteEntityWithoutLock = ->
2014-02-12 05:23:40 -05:00
@entity_id = "entity_id_here"
@entity = _id:@entity_id
@projectLocator.findElementByPath = (project_id, path, cb)=> cb(null, @entity, @path)
it 'should get the element id', ->
@projectLocator.findElementByPath = sinon.spy()
@updateMerger.deleteUpdate @project_id, @path, @source, ->
2014-02-12 05:23:40 -05:00
@projectLocator.findElementByPath.calledWith(@project_id, @path).should.equal true
it 'should delete the entity in the editor controller with type doc when entity has docLines array', (done)->
@entity.lines = []
2014-11-27 05:46:52 -05:00
mock = sinon.mock(@editorController).expects("deleteEntityWithoutLock").withArgs(@project_id, @entity_id, "doc", @source).callsArg(4)
@updateMerger.deleteUpdate @project_id, @path, @source, ->
2014-02-12 05:23:40 -05:00
mock.verify()
done()
it 'should delete the entity in the editor controller with type folder when entity has folders array', (done)->
@entity.folders = []
2014-11-27 05:46:52 -05:00
mock = sinon.mock(@editorController).expects("deleteEntityWithoutLock").withArgs(@project_id, @entity_id, "folder", @source).callsArg(4)
@updateMerger.deleteUpdate @project_id, @path, @source, ->
2014-02-12 05:23:40 -05:00
mock.verify()
done()
it 'should delete the entity in the editor controller with type file when entity has no interesting properties', (done)->
2014-11-27 05:46:52 -05:00
mock = sinon.mock(@editorController).expects("deleteEntityWithoutLock").withArgs(@project_id, @entity_id, "file", @source).callsArg(4)
@updateMerger.deleteUpdate @project_id, @path, @source, ->
2014-02-12 05:23:40 -05:00
mock.verify()
done()