From cb35da3cf7822cabdf5d93f48fbf3d6a33398838 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 22 Feb 2018 12:03:13 +0000 Subject: [PATCH 01/11] increment a project version number on every change in folder structure --- .../Project/ProjectEntityMongoUpdateHandler.coffee | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee index eaf92df92a..beb2004042 100644 --- a/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee @@ -56,6 +56,8 @@ module.exports = ProjectEntityMongoUpdateHandler = self = conditions = _id:project._id inc = {} inc["#{path.mongo}.rev"] = 1 + # we need to increment the project version number for any structure change + inc['version'] = 1 set = {} set["#{path.mongo}.created"] = new Date() update = @@ -144,9 +146,11 @@ module.exports = ProjectEntityMongoUpdateHandler = self = return callback(error) if error? endPath = path.join(path.dirname(entPath.fileSystem), newName) conditions = {_id:project_id} - update = "$set":{} + update = "$set":{}, "$inc":{} namePath = entPath.mongo+".name" update["$set"][namePath] = newName + # we need to increment the project version number for any structure change + update["$inc"]["version"] = 1 Project.findOneAndUpdate conditions, update, { "new": true}, (error, newProject) -> return callback(error) if error? ProjectEntityHandler.getAllEntitiesFromProject newProject, (error, newDocs, newFiles) => @@ -174,9 +178,11 @@ module.exports = ProjectEntityMongoUpdateHandler = self = update = {"$unset":{}} update["$unset"][path] = 1 model.update conditions, update, {}, (err)-> - pullUpdate = {"$pull":{}} + pullUpdate = {"$pull":{}, "$inc":{}} nonArrayPath = path.slice(0, path.lastIndexOf(".")) pullUpdate["$pull"][nonArrayPath] = null + # we need to increment the project version number for any structure change + pullUpdate["$inc"]["version"] = 1 model.findOneAndUpdate conditions, pullUpdate, {"new": true}, callback _countElements: (project)-> @@ -245,8 +251,10 @@ module.exports = ProjectEntityMongoUpdateHandler = self = element._id = require('mongoose').Types.ObjectId(id) conditions = _id:project._id mongopath = "#{path.mongo}.#{type}" - update = "$push":{} + update = "$push":{}, "$inc":{} update["$push"][mongopath] = element + # we need to increment the project version number for any structure change + update["$inc"]["version"] = 1# increment project version number logger.log project_id: project._id, element_id: element._id, fileType: type, folder_id: folder_id, mongopath:mongopath, "adding element to project" Project.findOneAndUpdate conditions, update, {"new": true}, (err, project)-> if err? From 470d67a3aacea97aaae5876ae152911ca10efd5c Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Fri, 23 Feb 2018 12:09:35 +0000 Subject: [PATCH 02/11] avoid exception in error message when project undefined --- .../Project/ProjectEntityMongoUpdateHandler.coffee | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee index beb2004042..64bf12f232 100644 --- a/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee @@ -254,13 +254,13 @@ module.exports = ProjectEntityMongoUpdateHandler = self = update = "$push":{}, "$inc":{} update["$push"][mongopath] = element # we need to increment the project version number for any structure change - update["$inc"]["version"] = 1# increment project version number - logger.log project_id: project._id, element_id: element._id, fileType: type, folder_id: folder_id, mongopath:mongopath, "adding element to project" - Project.findOneAndUpdate conditions, update, {"new": true}, (err, project)-> + update["$inc"]["version"] = 1 # increment project version number + logger.log project_id: project._id, element_id: element._id, fileType: type, folder_id: folder_id, mongopath:mongopath, update: update, "adding element to project" + Project.findOneAndUpdate conditions, update, {"new": true}, (err, newProject)-> if err? logger.err err: err, project_id: project._id, 'error saving in putElement project' return callback(err) - callback(err, {path:newPath}, project) + callback(err, {path:newPath}, newProject) _checkValidElementName: (folder, name, callback = (err) ->) -> # check if the name is already taken by a doc, file or From 67d784a74ad56bf4476ad6873d6cf1267740484a Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Mon, 26 Feb 2018 12:55:05 +0000 Subject: [PATCH 03/11] increment project version on every structure change --- .../Features/Project/ProjectEntityMongoUpdateHandler.coffee | 2 +- services/web/app/coffee/models/Project.coffee | 1 + .../Project/ProjectEntityMongoUpdateHandlerTests.coffee | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee index 64bf12f232..da4421e4ec 100644 --- a/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee @@ -255,7 +255,7 @@ module.exports = ProjectEntityMongoUpdateHandler = self = update["$push"][mongopath] = element # we need to increment the project version number for any structure change update["$inc"]["version"] = 1 # increment project version number - logger.log project_id: project._id, element_id: element._id, fileType: type, folder_id: folder_id, mongopath:mongopath, update: update, "adding element to project" + logger.log project_id: project._id, element_id: element._id, fileType: type, folder_id: folder_id, mongopath:mongopath, "adding element to project" Project.findOneAndUpdate conditions, update, {"new": true}, (err, newProject)-> if err? logger.err err: err, project_id: project._id, 'error saving in putElement project' diff --git a/services/web/app/coffee/models/Project.coffee b/services/web/app/coffee/models/Project.coffee index 252388b169..89f8b94097 100644 --- a/services/web/app/coffee/models/Project.coffee +++ b/services/web/app/coffee/models/Project.coffee @@ -22,6 +22,7 @@ ProjectSchema = new Schema readOnly_refs : [ type:ObjectId, ref:'User' ] rootDoc_id : {type: ObjectId} rootFolder : [FolderSchema] + version : {type: Number} publicAccesLevel : {type: String, default: 'private'} compiler : {type:String, default:'pdflatex'} spellCheckLanguage : {type:String, default:'en'} diff --git a/services/web/test/unit/coffee/Project/ProjectEntityMongoUpdateHandlerTests.coffee b/services/web/test/unit/coffee/Project/ProjectEntityMongoUpdateHandlerTests.coffee index d2a5a334b4..be5b177786 100644 --- a/services/web/test/unit/coffee/Project/ProjectEntityMongoUpdateHandlerTests.coffee +++ b/services/web/test/unit/coffee/Project/ProjectEntityMongoUpdateHandlerTests.coffee @@ -117,7 +117,7 @@ describe 'ProjectEntityMongoUpdateHandler', -> .calledWith( { _id: project_id }, { - '$inc': { 'file.png.rev': 1 } + '$inc': { 'file.png.rev': 1, 'version': 1 } '$set': { 'file.png.created': new Date() } } {} @@ -324,7 +324,7 @@ describe 'ProjectEntityMongoUpdateHandler', -> @ProjectModel.findOneAndUpdate .calledWith( { _id: project_id }, - { $set: { "mongo.path.name": @newName } }, + { $set: { "mongo.path.name": @newName }, $inc: {"version": 1} }, { new: true } ).should.equal true @@ -384,7 +384,7 @@ describe 'ProjectEntityMongoUpdateHandler', -> it 'should pull', -> @ProjectModel.findOneAndUpdate - .calledWith({ _id: @id }, { '$pull': { 'folders[0]': null } }, {'new': true}) + .calledWith({ _id: @id }, { '$pull': { 'folders[0]': null }, '$inc': {'version': 1} }, {'new': true}) .should.equal true it 'should call the callback', -> From 98f50919e81aea0c58482571f72429df4da55828 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Mon, 26 Feb 2018 16:56:10 +0000 Subject: [PATCH 04/11] comment about file replacements --- .../Features/Project/ProjectEntityMongoUpdateHandler.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee index da4421e4ec..47a8d0c553 100644 --- a/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEntityMongoUpdateHandler.coffee @@ -56,7 +56,10 @@ module.exports = ProjectEntityMongoUpdateHandler = self = conditions = _id:project._id inc = {} inc["#{path.mongo}.rev"] = 1 - # we need to increment the project version number for any structure change + # currently we do not need to increment the project version number for changes that are replacements + # but when we make switch to having immutable files the replace operation will add a new file, and + # this will require a version increase. We will start incrementing the project version now as it does + # no harm and will help to test it. inc['version'] = 1 set = {} set["#{path.mongo}.created"] = new Date() From 12911598dec359ddb10ad079a3c9fea31d01503f Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Tue, 27 Feb 2018 11:48:51 +0000 Subject: [PATCH 05/11] send current project structure version to docupdater --- .../DocumentUpdaterHandler.coffee | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee b/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee index c5a74fea28..04c11c6419 100644 --- a/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee +++ b/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee @@ -205,29 +205,32 @@ module.exports = DocumentUpdaterHandler = updateProjectStructure : (project_id, userId, changes, callback = (error) ->)-> return callback() if !settings.apis.project_history?.sendProjectStructureOps + Project.findOne {_id: project_id}, {version:true}, (err, currentProject) -> + return callback(err) if err? + return callback new Error("project not found") if !currentProject? - docUpdates = DocumentUpdaterHandler._getUpdates('doc', changes.oldDocs, changes.newDocs) - fileUpdates = DocumentUpdaterHandler._getUpdates('file', changes.oldFiles, changes.newFiles) + docUpdates = DocumentUpdaterHandler._getUpdates('doc', changes.oldDocs, changes.newDocs) + fileUpdates = DocumentUpdaterHandler._getUpdates('file', changes.oldFiles, changes.newFiles) - timer = new metrics.Timer("set-document") - url = "#{settings.apis.documentupdater.url}/project/#{project_id}" - body = - url: url - json: { docUpdates, fileUpdates, userId } + timer = new metrics.Timer("set-document") + url = "#{settings.apis.documentupdater.url}/project/#{project_id}" + body = + url: url + json: { docUpdates, fileUpdates, userId, version: currentProject.version } - return callback() if (docUpdates.length + fileUpdates.length) < 1 + return callback() if (docUpdates.length + fileUpdates.length) < 1 - request.post body, (error, res, body)-> - timer.done() - if error? - logger.error {error, url, project_id}, "error update project structure in doc updater" - callback(error) - else if res.statusCode >= 200 and res.statusCode < 300 - logger.log {project_id}, "updated project structure in doc updater" - callback(null) - else - logger.error {project_id, url}, "doc updater returned a non-success status code: #{res.statusCode}" - callback new Error("doc updater returned a non-success status code: #{res.statusCode}") + request.post body, (error, res, body)-> + timer.done() + if error? + logger.error {error, url, project_id}, "error update project structure in doc updater" + callback(error) + else if res.statusCode >= 200 and res.statusCode < 300 + logger.log {project_id}, "updated project structure in doc updater" + callback(null) + else + logger.error {project_id, url}, "doc updater returned a non-success status code: #{res.statusCode}" + callback new Error("doc updater returned a non-success status code: #{res.statusCode}") _getUpdates: (entityType, oldEntities, newEntities) -> oldEntities ||= [] From f7e70e8228ebdb938aded0e94b5b8be492e553f8 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Mon, 26 Feb 2018 16:56:33 +0000 Subject: [PATCH 06/11] add acceptance tests --- .../coffee/ProjectStructureTests.coffee | 140 ++++++++++++++---- 1 file changed, 115 insertions(+), 25 deletions(-) diff --git a/services/web/test/acceptance/coffee/ProjectStructureTests.coffee b/services/web/test/acceptance/coffee/ProjectStructureTests.coffee index 77106e20a3..ac070097f8 100644 --- a/services/web/test/acceptance/coffee/ProjectStructureTests.coffee +++ b/services/web/test/acceptance/coffee/ProjectStructureTests.coffee @@ -89,6 +89,7 @@ describe "ProjectStructureChanges", -> ProjectGetter.getProject example_project_id, (error, project) => throw error if error? + @project_0 = project @owner.request.post { uri: "project/#{example_project_id}/doc", json: @@ -99,7 +100,10 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to add doc #{res.statusCode}") example_doc_id = body._id - done() + ProjectGetter.getProject @example_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + done() it "should version the doc added", -> updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).docUpdates @@ -109,6 +113,9 @@ describe "ProjectStructureChanges", -> expect(update.pathname).to.equal("/new.tex") expect(update.docLines).to.be.a('string'); + it "should increment the project structure version number", -> + expect(@project_1.version).to.equal(@project_0.version + 1) + describe "uploading a project", -> before (done) -> MockDocUpdaterApi.clearProjectStructureUpdates() @@ -143,15 +150,14 @@ describe "ProjectStructureChanges", -> expect(update.url).to.be.a('string'); describe "uploading a file", -> - before (done) -> + beforeEach (done) -> + MockDocUpdaterApi.clearProjectStructureUpdates() ProjectGetter.getProject example_project_id, (error, project) => throw error if error? @root_folder_id = project.rootFolder[0]._id.toString() + @project_0 = project done() - - beforeEach () -> - MockDocUpdaterApi.clearProjectStructureUpdates() - + it "should version a newly uploaded file", (done) -> image_file = fs.createReadStream(Path.resolve(__dirname + '/../files/1pixel.png')) @@ -180,7 +186,12 @@ describe "ProjectStructureChanges", -> expect(update.url).to.be.a('string'); @original_file_url = update.url - done() + ProjectGetter.getProject @example_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # uploading a new file does change the project structure + expect(@project_1.version).to.equal(@project_0.version + 1) + done() it "should version a replacement file", (done) -> image_file = fs.createReadStream(Path.resolve(__dirname + '/../files/2pixel.png')) @@ -207,7 +218,12 @@ describe "ProjectStructureChanges", -> expect(update.pathname).to.equal("/1pixel.png") expect(update.url).to.be.a('string'); - done() + ProjectGetter.getProject @example_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # replacing a file should update the project structure + expect(@project_1.version).to.equal(@project_0.version + 1) + done() describe "moving entities", -> before (done) -> @@ -220,8 +236,13 @@ describe "ProjectStructureChanges", -> example_folder_id_1 = JSON.parse(body)._id done() - beforeEach () -> + beforeEach (done) -> MockDocUpdaterApi.clearProjectStructureUpdates() + ProjectGetter.getProject @example_project_id, (error, project) => + throw error if error? + @root_folder_id = project.rootFolder[0]._id.toString() + @project_0 = project + done() it "should version moving a doc", (done) -> @owner.request.post { @@ -240,7 +261,12 @@ describe "ProjectStructureChanges", -> expect(update.pathname).to.equal("/new.tex") expect(update.newPathname).to.equal("/foo/new.tex") - done() + ProjectGetter.getProject @example_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # replacing a file should update the project structure + expect(@project_1.version).to.equal(@project_0.version + 2) # 2 because it's a delete and then add + done() it "should version moving a file", (done) -> @owner.request.post { @@ -258,8 +284,12 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/1pixel.png") expect(update.newPathname).to.equal("/foo/1pixel.png") - - done() + ProjectGetter.getProject @example_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # replacing a file should update the project structure + expect(@project_1.version).to.equal(@project_0.version + 2) # 2 because it's a delete and then add + done() it "should version moving a folder", (done) -> @owner.request.post { @@ -292,12 +322,21 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/foo/1pixel.png") expect(update.newPathname).to.equal("/bar/foo/1pixel.png") - - done() + ProjectGetter.getProject @example_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # replacing a file should update the project structure + expect(@project_1.version).to.equal(@project_0.version + 3) # because folder and 2 files move + done() describe "renaming entities", -> - beforeEach () -> + beforeEach (done) -> MockDocUpdaterApi.clearProjectStructureUpdates() + ProjectGetter.getProject @example_project_id, (error, project) => + throw error if error? + @root_folder_id = project.rootFolder[0]._id.toString() + @project_0 = project + done() it "should version renaming a doc", (done) -> @owner.request.post { @@ -316,7 +355,12 @@ describe "ProjectStructureChanges", -> expect(update.pathname).to.equal("/bar/foo/new.tex") expect(update.newPathname).to.equal("/bar/foo/new_renamed.tex") - done() + ProjectGetter.getProject @example_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # replacing a file should update the project structure + expect(@project_1.version).to.equal(@project_0.version + 1) + done() it "should version renaming a file", (done) -> @owner.request.post { @@ -335,7 +379,12 @@ describe "ProjectStructureChanges", -> expect(update.pathname).to.equal("/bar/foo/1pixel.png") expect(update.newPathname).to.equal("/bar/foo/1pixel_renamed.png") - done() + ProjectGetter.getProject @example_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # replacing a file should update the project structure + expect(@project_1.version).to.equal(@project_0.version + 1) + done() it "should version renaming a folder", (done) -> @owner.request.post { @@ -361,11 +410,22 @@ describe "ProjectStructureChanges", -> expect(update.pathname).to.equal("/bar/foo/1pixel_renamed.png") expect(update.newPathname).to.equal("/bar/foo_renamed/1pixel_renamed.png") - done() + ProjectGetter.getProject @example_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # replacing a file should update the project structure + expect(@project_1.version).to.equal(@project_0.version + 1) + done() + describe "deleting entities", -> - beforeEach () -> + beforeEach (done) -> MockDocUpdaterApi.clearProjectStructureUpdates() + ProjectGetter.getProject @example_project_id, (error, project) => + throw error if error? + @root_folder_id = project.rootFolder[0]._id.toString() + @project_0 = project + done() it "should version deleting a folder", (done) -> @owner.request.delete { @@ -389,7 +449,12 @@ describe "ProjectStructureChanges", -> expect(update.pathname).to.equal("/bar/foo_renamed/1pixel_renamed.png") expect(update.newPathname).to.equal("") - done() + ProjectGetter.getProject @example_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # replacing a file should update the project structure + expect(@project_1.version).to.equal(@project_0.version + 1) + done() describe "tpds", -> before (done) -> @@ -399,8 +464,13 @@ describe "ProjectStructureChanges", -> @tpds_project_id = project_id mkdirp Settings.path.dumpFolder, done - beforeEach () -> + beforeEach (done) -> MockDocUpdaterApi.clearProjectStructureUpdates() + ProjectGetter.getProject @tpds_project_id, (error, project) => + throw error if error? + @root_folder_id = project.rootFolder[0]._id.toString() + @project_0 = project + done() it "should version adding a doc", (done) -> tex_file = fs.createReadStream(Path.resolve(__dirname + '/../files/test.tex')) @@ -430,7 +500,12 @@ describe "ProjectStructureChanges", -> expect(update.pathname).to.equal("/test.tex") expect(update.docLines).to.equal("Test") - done() + ProjectGetter.getProject @tpds_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # replacing a file should update the project structure + expect(@project_1.version).to.equal(@project_0.version + 1) + done() tex_file.pipe(req) @@ -462,7 +537,12 @@ describe "ProjectStructureChanges", -> expect(update.pathname).to.equal("/1pixel.png") expect(update.url).to.be.a('string'); - done() + ProjectGetter.getProject @tpds_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # replacing a file should update the project structure + expect(@project_1.version).to.equal(@project_0.version + 1) + done() image_file.pipe(req) @@ -494,7 +574,12 @@ describe "ProjectStructureChanges", -> expect(update.pathname).to.equal("/1pixel.png") expect(update.url).to.be.a('string'); - done() + ProjectGetter.getProject @tpds_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # replacing a file should update the project structure + expect(@project_1.version).to.equal(@project_0.version + 1) + done() image_file.pipe(req) @@ -517,5 +602,10 @@ describe "ProjectStructureChanges", -> expect(update.pathname).to.equal("/test.tex") expect(update.newPathname).to.equal("") - done() + ProjectGetter.getProject @tpds_project_id, (error, newProject) => + throw error if error? + @project_1 = newProject + # replacing a file should update the project structure + expect(@project_1.version).to.equal(@project_0.version + 1) + done() From 792c0135a0ba230ffbc6b31d45e7d5af5982e9b5 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Tue, 27 Feb 2018 11:58:30 +0000 Subject: [PATCH 07/11] update acceptance tests helper to include version --- .../acceptance/coffee/helpers/MockDocUpdaterApi.coffee | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/services/web/test/acceptance/coffee/helpers/MockDocUpdaterApi.coffee b/services/web/test/acceptance/coffee/helpers/MockDocUpdaterApi.coffee index b21fb1adab..a9a2c49875 100644 --- a/services/web/test/acceptance/coffee/helpers/MockDocUpdaterApi.coffee +++ b/services/web/test/acceptance/coffee/helpers/MockDocUpdaterApi.coffee @@ -12,7 +12,7 @@ module.exports = MockDocUpdaterApi = getProjectStructureUpdates: (project_id) -> @updates[project_id] || { docUpdates: [], fileUpdates: [] } - addProjectStructureUpdates: (project_id, userId, docUpdates, fileUpdates) -> + addProjectStructureUpdates: (project_id, userId, docUpdates, fileUpdates, version) -> @updates[project_id] ||= { docUpdates: [], fileUpdates: [] } for update in docUpdates @@ -22,6 +22,8 @@ module.exports = MockDocUpdaterApi = for update in fileUpdates update.userId = userId @updates[project_id].fileUpdates.push(update) + + @updates[project_id].version = version run: () -> app.post "/project/:project_id/flush", (req, res, next) => @@ -29,8 +31,8 @@ module.exports = MockDocUpdaterApi = app.post "/project/:project_id", jsonParser, (req, res, next) => project_id = req.params.project_id - {userId, docUpdates, fileUpdates} = req.body - @addProjectStructureUpdates(project_id, userId, docUpdates, fileUpdates) + {userId, docUpdates, fileUpdates, version} = req.body + @addProjectStructureUpdates(project_id, userId, docUpdates, fileUpdates, version) res.sendStatus 200 app.delete "/project/:project_id/doc/:doc_id", (req, res, next) => From 389f2d64ef696ddf7602828aa0a808d01da7ee03 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 1 Mar 2018 11:27:52 +0000 Subject: [PATCH 08/11] prepare tests for versioning --- .../coffee/ProjectStructureTests.coffee | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/services/web/test/acceptance/coffee/ProjectStructureTests.coffee b/services/web/test/acceptance/coffee/ProjectStructureTests.coffee index ac070097f8..d1e498252c 100644 --- a/services/web/test/acceptance/coffee/ProjectStructureTests.coffee +++ b/services/web/test/acceptance/coffee/ProjectStructureTests.coffee @@ -35,7 +35,7 @@ describe "ProjectStructureChanges", -> done() it "should version creating a doc", -> - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).docUpdates + {docUpdates: updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(2) _.each updates, (update) => expect(update.userId).to.equal(@owner._id) @@ -44,7 +44,7 @@ describe "ProjectStructureChanges", -> expect(_.where(updates, pathname: "/references.bib").length).to.equal 1 it "should version creating a file", -> - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).fileUpdates + {fileUpdates: updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) @@ -67,7 +67,7 @@ describe "ProjectStructureChanges", -> done() it "should version the docs created", -> - updates = MockDocUpdaterApi.getProjectStructureUpdates(@dup_project_id).docUpdates + {docUpdates: updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(@dup_project_id) expect(updates.length).to.equal(2) _.each updates, (update) => expect(update.userId).to.equal(@owner._id) @@ -76,7 +76,7 @@ describe "ProjectStructureChanges", -> expect(_.where(updates, pathname: "/references.bib").length).to.equal(1) it "should version the files created", -> - updates = MockDocUpdaterApi.getProjectStructureUpdates(@dup_project_id).fileUpdates + {fileUpdates: updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(@dup_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) @@ -100,13 +100,13 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to add doc #{res.statusCode}") example_doc_id = body._id - ProjectGetter.getProject @example_project_id, (error, newProject) => + ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @project_1 = newProject done() it "should version the doc added", -> - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).docUpdates + {docUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) @@ -134,7 +134,7 @@ describe "ProjectStructureChanges", -> done() it "should version the dosc created", -> - updates = MockDocUpdaterApi.getProjectStructureUpdates(@uploaded_project_id).docUpdates + {docUpdates: updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(@uploaded_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) @@ -142,7 +142,7 @@ describe "ProjectStructureChanges", -> expect(update.docLines).to.equal("Test") it "should version the files created", -> - updates = MockDocUpdaterApi.getProjectStructureUpdates(@uploaded_project_id).fileUpdates + {fileUpdates: updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(@uploaded_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) @@ -178,7 +178,7 @@ describe "ProjectStructureChanges", -> example_file_id = JSON.parse(body).entity_id - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).fileUpdates + {fileUpdates: updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) @@ -186,7 +186,7 @@ describe "ProjectStructureChanges", -> expect(update.url).to.be.a('string'); @original_file_url = update.url - ProjectGetter.getProject @example_project_id, (error, newProject) => + ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @project_1 = newProject # uploading a new file does change the project structure @@ -211,14 +211,14 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to upload file #{res.statusCode}") - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).fileUpdates + {fileUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/1pixel.png") expect(update.url).to.be.a('string'); - ProjectGetter.getProject @example_project_id, (error, newProject) => + ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @project_1 = newProject # replacing a file should update the project structure @@ -238,7 +238,7 @@ describe "ProjectStructureChanges", -> beforeEach (done) -> MockDocUpdaterApi.clearProjectStructureUpdates() - ProjectGetter.getProject @example_project_id, (error, project) => + ProjectGetter.getProject example_project_id, (error, project) => throw error if error? @root_folder_id = project.rootFolder[0]._id.toString() @project_0 = project @@ -254,14 +254,14 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to move doc #{res.statusCode}") - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).docUpdates + {docUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/new.tex") expect(update.newPathname).to.equal("/foo/new.tex") - ProjectGetter.getProject @example_project_id, (error, newProject) => + ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @project_1 = newProject # replacing a file should update the project structure @@ -278,13 +278,13 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to move file #{res.statusCode}") - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).fileUpdates + {fileUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/1pixel.png") expect(update.newPathname).to.equal("/foo/1pixel.png") - ProjectGetter.getProject @example_project_id, (error, newProject) => + ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @project_1 = newProject # replacing a file should update the project structure @@ -309,20 +309,20 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to move folder #{res.statusCode}") - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).docUpdates + {docUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/foo/new.tex") expect(update.newPathname).to.equal("/bar/foo/new.tex") - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).fileUpdates + {fileUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/foo/1pixel.png") expect(update.newPathname).to.equal("/bar/foo/1pixel.png") - ProjectGetter.getProject @example_project_id, (error, newProject) => + ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @project_1 = newProject # replacing a file should update the project structure @@ -332,7 +332,7 @@ describe "ProjectStructureChanges", -> describe "renaming entities", -> beforeEach (done) -> MockDocUpdaterApi.clearProjectStructureUpdates() - ProjectGetter.getProject @example_project_id, (error, project) => + ProjectGetter.getProject example_project_id, (error, project) => throw error if error? @root_folder_id = project.rootFolder[0]._id.toString() @project_0 = project @@ -348,14 +348,14 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to move doc #{res.statusCode}") - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).docUpdates + {docUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/bar/foo/new.tex") expect(update.newPathname).to.equal("/bar/foo/new_renamed.tex") - ProjectGetter.getProject @example_project_id, (error, newProject) => + ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @project_1 = newProject # replacing a file should update the project structure @@ -372,14 +372,14 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to move file #{res.statusCode}") - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).fileUpdates + {fileUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/bar/foo/1pixel.png") expect(update.newPathname).to.equal("/bar/foo/1pixel_renamed.png") - ProjectGetter.getProject @example_project_id, (error, newProject) => + ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @project_1 = newProject # replacing a file should update the project structure @@ -396,21 +396,21 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to move folder #{res.statusCode}") - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).docUpdates + {docUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/bar/foo/new_renamed.tex") expect(update.newPathname).to.equal("/bar/foo_renamed/new_renamed.tex") - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).fileUpdates + {fileUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/bar/foo/1pixel_renamed.png") expect(update.newPathname).to.equal("/bar/foo_renamed/1pixel_renamed.png") - ProjectGetter.getProject @example_project_id, (error, newProject) => + ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @project_1 = newProject # replacing a file should update the project structure @@ -421,7 +421,7 @@ describe "ProjectStructureChanges", -> describe "deleting entities", -> beforeEach (done) -> MockDocUpdaterApi.clearProjectStructureUpdates() - ProjectGetter.getProject @example_project_id, (error, project) => + ProjectGetter.getProject example_project_id, (error, project) => throw error if error? @root_folder_id = project.rootFolder[0]._id.toString() @project_0 = project @@ -435,21 +435,21 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to delete folder #{res.statusCode}") - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).docUpdates + {docUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/bar/foo_renamed/new_renamed.tex") expect(update.newPathname).to.equal("") - updates = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id).fileUpdates + {fileUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/bar/foo_renamed/1pixel_renamed.png") expect(update.newPathname).to.equal("") - ProjectGetter.getProject @example_project_id, (error, newProject) => + ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @project_1 = newProject # replacing a file should update the project structure @@ -493,7 +493,7 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to upload file #{res.statusCode}") - updates = MockDocUpdaterApi.getProjectStructureUpdates(@tpds_project_id).docUpdates + {docUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(@tpds_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) @@ -530,7 +530,7 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to upload file #{res.statusCode}") - updates = MockDocUpdaterApi.getProjectStructureUpdates(@tpds_project_id).fileUpdates + {fileUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(@tpds_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) @@ -567,7 +567,7 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to upload file #{res.statusCode}") - updates = MockDocUpdaterApi.getProjectStructureUpdates(@tpds_project_id).fileUpdates + {fileUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(@tpds_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) @@ -595,7 +595,7 @@ describe "ProjectStructureChanges", -> if res.statusCode < 200 || res.statusCode >= 300 throw new Error("failed to delete doc #{res.statusCode}") - updates = MockDocUpdaterApi.getProjectStructureUpdates(@tpds_project_id).docUpdates + {docUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(@tpds_project_id) expect(updates.length).to.equal(1) update = updates[0] expect(update.userId).to.equal(@owner._id) From e6020e2e9be3d68263f0bf5c95a2143b62d831f1 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 1 Mar 2018 11:45:21 +0000 Subject: [PATCH 09/11] update acceptance tests to include project structure version this tests the version sent to the docupdater --- .../coffee/ProjectStructureTests.coffee | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/services/web/test/acceptance/coffee/ProjectStructureTests.coffee b/services/web/test/acceptance/coffee/ProjectStructureTests.coffee index d1e498252c..51bd4a26c7 100644 --- a/services/web/test/acceptance/coffee/ProjectStructureTests.coffee +++ b/services/web/test/acceptance/coffee/ProjectStructureTests.coffee @@ -42,6 +42,7 @@ describe "ProjectStructureChanges", -> expect(update.docLines).to.be.a('string') expect(_.where(updates, pathname: "/main.tex").length).to.equal 1 expect(_.where(updates, pathname: "/references.bib").length).to.equal 1 + expect(version).to.equal(3) it "should version creating a file", -> {fileUpdates: updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) @@ -50,6 +51,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/universe.jpg") expect(update.url).to.be.a('string'); + expect(version).to.equal(3) describe "duplicating a project", -> before (done) -> @@ -74,6 +76,7 @@ describe "ProjectStructureChanges", -> expect(update.docLines).to.be.a('string') expect(_.where(updates, pathname: "/main.tex").length).to.equal(1) expect(_.where(updates, pathname: "/references.bib").length).to.equal(1) + expect(version).to.equal(3) it "should version the files created", -> {fileUpdates: updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(@dup_project_id) @@ -82,6 +85,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/universe.jpg") expect(update.url).to.be.a('string'); + expect(version).to.equal(3) describe "adding a doc", -> before (done) -> @@ -112,6 +116,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/new.tex") expect(update.docLines).to.be.a('string'); + expect(version).to.equal(@project_0.version + 1) it "should increment the project structure version number", -> expect(@project_1.version).to.equal(@project_0.version + 1) @@ -140,6 +145,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/main.tex") expect(update.docLines).to.equal("Test") + expect(version).to.equal(2) it "should version the files created", -> {fileUpdates: updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(@uploaded_project_id) @@ -148,6 +154,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/1pixel.png") expect(update.url).to.be.a('string'); + expect(version).to.equal(2) describe "uploading a file", -> beforeEach (done) -> @@ -185,6 +192,7 @@ describe "ProjectStructureChanges", -> expect(update.pathname).to.equal("/1pixel.png") expect(update.url).to.be.a('string'); @original_file_url = update.url + expect(version).to.equal(@project_0.version + 1) ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @@ -217,6 +225,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/1pixel.png") expect(update.url).to.be.a('string'); + expect(version).to.equal(@project_0.version + 1) ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @@ -260,6 +269,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/new.tex") expect(update.newPathname).to.equal("/foo/new.tex") + expect(version).to.equal(@project_0.version + 2) ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @@ -284,6 +294,8 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/1pixel.png") expect(update.newPathname).to.equal("/foo/1pixel.png") + expect(version).to.equal(@project_0.version + 2) + ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @project_1 = newProject @@ -315,6 +327,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/foo/new.tex") expect(update.newPathname).to.equal("/bar/foo/new.tex") + expect(version).to.equal(@project_0.version + 3) {fileUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) @@ -322,6 +335,8 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/foo/1pixel.png") expect(update.newPathname).to.equal("/bar/foo/1pixel.png") + expect(version).to.equal(@project_0.version + 3) + ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @project_1 = newProject @@ -354,6 +369,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/bar/foo/new.tex") expect(update.newPathname).to.equal("/bar/foo/new_renamed.tex") + expect(version).to.equal(@project_0.version + 1) ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @@ -378,6 +394,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/bar/foo/1pixel.png") expect(update.newPathname).to.equal("/bar/foo/1pixel_renamed.png") + expect(version).to.equal(@project_0.version + 1) ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @@ -402,6 +419,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/bar/foo/new_renamed.tex") expect(update.newPathname).to.equal("/bar/foo_renamed/new_renamed.tex") + expect(version).to.equal(@project_0.version + 1) {fileUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) @@ -409,6 +427,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/bar/foo/1pixel_renamed.png") expect(update.newPathname).to.equal("/bar/foo_renamed/1pixel_renamed.png") + expect(version).to.equal(@project_0.version + 1) ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @@ -441,6 +460,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/bar/foo_renamed/new_renamed.tex") expect(update.newPathname).to.equal("") + expect(version).to.equal(@project_0.version + 1) {fileUpdates:updates, version} = MockDocUpdaterApi.getProjectStructureUpdates(example_project_id) expect(updates.length).to.equal(1) @@ -448,6 +468,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/bar/foo_renamed/1pixel_renamed.png") expect(update.newPathname).to.equal("") + expect(version).to.equal(@project_0.version + 1) ProjectGetter.getProject example_project_id, (error, newProject) => throw error if error? @@ -499,6 +520,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/test.tex") expect(update.docLines).to.equal("Test") + expect(version).to.equal(@project_0.version + 1) ProjectGetter.getProject @tpds_project_id, (error, newProject) => throw error if error? @@ -536,6 +558,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/1pixel.png") expect(update.url).to.be.a('string'); + expect(version).to.equal(@project_0.version + 1) ProjectGetter.getProject @tpds_project_id, (error, newProject) => throw error if error? @@ -573,6 +596,7 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/1pixel.png") expect(update.url).to.be.a('string'); + expect(version).to.equal(@project_0.version + 1) ProjectGetter.getProject @tpds_project_id, (error, newProject) => throw error if error? @@ -601,7 +625,8 @@ describe "ProjectStructureChanges", -> expect(update.userId).to.equal(@owner._id) expect(update.pathname).to.equal("/test.tex") expect(update.newPathname).to.equal("") - + expect(version).to.equal(@project_0.version + 1) + ProjectGetter.getProject @tpds_project_id, (error, newProject) => throw error if error? @project_1 = newProject From af494dedf2fd14b1d4fb17631c21e83060947f00 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 1 Mar 2018 11:59:01 +0000 Subject: [PATCH 10/11] check project structure version in unit tests --- .../DocumentUpdater/DocumentUpdaterHandlerTests.coffee | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/services/web/test/unit/coffee/DocumentUpdater/DocumentUpdaterHandlerTests.coffee b/services/web/test/unit/coffee/DocumentUpdater/DocumentUpdaterHandlerTests.coffee index a4e0a4dc53..8db9ed4830 100644 --- a/services/web/test/unit/coffee/DocumentUpdater/DocumentUpdaterHandlerTests.coffee +++ b/services/web/test/unit/coffee/DocumentUpdater/DocumentUpdaterHandlerTests.coffee @@ -390,6 +390,8 @@ describe 'DocumentUpdaterHandler', -> describe "updateProjectStructure ", -> beforeEach -> @user_id = 1234 + @version = 999 + @Project.findOne = sinon.stub().callsArgWith(2,null, {_id: @project_id, version:@version}) describe "with project history disabled", -> beforeEach -> @@ -434,7 +436,7 @@ describe 'DocumentUpdaterHandler', -> @handler.updateProjectStructure @project_id, @user_id, @changes, () => @request.post - .calledWith(url: @url, json: {docUpdates, fileUpdates: [], userId: @user_id}) + .calledWith(url: @url, json: {docUpdates, fileUpdates: [], userId: @user_id, version:@version}) .should.equal true done() @@ -454,7 +456,7 @@ describe 'DocumentUpdaterHandler', -> @handler.updateProjectStructure @project_id, @user_id, @changes, () => @request.post - .calledWith(url: @url, json: {docUpdates, fileUpdates: [], userId: @user_id}) + .calledWith(url: @url, json: {docUpdates, fileUpdates: [], userId: @user_id, version:@version}) .should.equal true done() @@ -474,7 +476,7 @@ describe 'DocumentUpdaterHandler', -> @handler.updateProjectStructure @project_id, @user_id, @changes, () => @request.post - .calledWith(url: @url, json: {docUpdates: [], fileUpdates, userId: @user_id}) + .calledWith(url: @url, json: {docUpdates: [], fileUpdates, userId: @user_id, version:@version}) .should.equal true done() @@ -493,7 +495,7 @@ describe 'DocumentUpdaterHandler', -> @handler.updateProjectStructure @project_id, @user_id, @changes, () => @request.post - .calledWith(url: @url, json: {docUpdates, fileUpdates: [], userId: @user_id}) + .calledWith(url: @url, json: {docUpdates, fileUpdates: [], userId: @user_id, version:@version}) .should.equal true done() From 14713aa393a4967aef05f26b826ae639aa7c8314 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 1 Mar 2018 15:15:09 +0000 Subject: [PATCH 11/11] added comment about project version --- services/web/app/coffee/models/Project.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/coffee/models/Project.coffee b/services/web/app/coffee/models/Project.coffee index 89f8b94097..fb0bc0fd6b 100644 --- a/services/web/app/coffee/models/Project.coffee +++ b/services/web/app/coffee/models/Project.coffee @@ -22,7 +22,7 @@ ProjectSchema = new Schema readOnly_refs : [ type:ObjectId, ref:'User' ] rootDoc_id : {type: ObjectId} rootFolder : [FolderSchema] - version : {type: Number} + version : {type: Number} # incremented for every change in the project structure (folders and filenames) publicAccesLevel : {type: String, default: 'private'} compiler : {type:String, default:'pdflatex'} spellCheckLanguage : {type:String, default:'en'}