From 3c4e74af4b1012007a632fedd11a9c8b66ea5509 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Thu, 10 Mar 2016 12:42:21 +0000 Subject: [PATCH] project duplicator works and tests pass. not so bad now. --- .../Features/Project/ProjectDuplicator.coffee | 30 ++++++-------- .../Project/ProjectDuplicatorTests.coffee | 39 ++++++++++--------- 2 files changed, 33 insertions(+), 36 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectDuplicator.coffee b/services/web/app/coffee/Features/Project/ProjectDuplicator.coffee index 779a39861f..208b218b0c 100644 --- a/services/web/app/coffee/Features/Project/ProjectDuplicator.coffee +++ b/services/web/app/coffee/Features/Project/ProjectDuplicator.coffee @@ -13,9 +13,8 @@ logger = require("logger-sharelatex") module.exports = ProjectDuplicator = _copyDocs: (newProject, originalRootDoc, originalFolder, desFolder, docContents, callback)-> - console.log "_copyDocs", originalRootDoc setRootDoc = _.once (doc_id)-> - projectEntityHandler.setRootDoc newProject, doc_id + projectEntityHandler.setRootDoc newProject._id, doc_id jobs = originalFolder.docs.map (doc)-> return (callback)-> @@ -34,20 +33,20 @@ module.exports = ProjectDuplicator = jobs = originalFolder.fileRefs.map (file)-> return (cb)-> projectEntityHandler.copyFileFromExistingProjectWithProject newProject, desFolder._id, originalProject_id, file, cb - async.series jobs, callback + async.parallelLimit jobs, 5, callback - _copyFolder: (newProject, originalProject_id, originalRootDoc, originalFolder, desFolder, docContents, callback)-> - ProjectGetter.getProject newProject._id, {rootFolder:true, name:true}, (err, newProject)-> + _copyFolderRecursivly: (newProject_id, originalProject_id, originalRootDoc, originalFolder, desFolder, docContents, callback)-> + ProjectGetter.getProject newProject_id, {rootFolder:true, name:true}, (err, newProject)-> if err? - logger.err project_id:newProject?._id, "could not get project" + logger.err project_id:newProject_id, "could not get project" return cb(err) jobs = originalFolder.folders.map (childFolder)-> return (cb)-> projectEntityHandler.addFolderWithProject newProject, desFolder?._id, childFolder.name, (err, newFolder)-> return cb(err) if err? - ProjectDuplicator._copyFolder newProject, originalProject_id, originalRootDoc, childFolder, newFolder, docContents, cb + ProjectDuplicator._copyFolderRecursivly newProject_id, originalProject_id, originalRootDoc, childFolder, newFolder, docContents, cb jobs.push (cb)-> ProjectDuplicator._copyFiles newProject, originalProject_id, originalFolder, desFolder, cb @@ -56,7 +55,6 @@ module.exports = ProjectDuplicator = async.series jobs, callback - duplicate: (owner, originalProject_id, newProjectName, callback)-> jobs = @@ -76,20 +74,16 @@ module.exports = ProjectDuplicator = logger.err err:err, originalProject_id:originalProject_id, "error duplicating project" return callback(err) {originalProject, newProject, originalRootDoc, docContentsArray} = results - originalRootDoc = originalRootDoc[0] #wtf array? + + originalRootDoc = originalRootDoc[0] + docContents = {} for docContent in docContentsArray docContents[docContent._id] = docContent projectOptionsHandler.setCompiler newProject._id, originalProject.compiler, -> - console.log originalProject.rootFolder, "originalProject" - ProjectDuplicator._copyFolder newProject, originalProject_id, originalRootDoc, originalProject.rootFolder[0], newProject.rootFolder[0], docContents, -> + + ProjectDuplicator._copyFolderRecursivly newProject._id, originalProject_id, originalRootDoc, originalProject.rootFolder[0], newProject.rootFolder[0], docContents, -> if err? logger.err err:err, originalProject_id:originalProject_id, newProjectName:newProjectName, "error cloning project" - - ProjectGetter.getProject newProject._id, {rootFolder:true, name:true}, (err, project)-> - if err? - logger.err err:err, "could not get project for clone" - return callback(err) - callback(err, newProject) - + callback(err, newProject) diff --git a/services/web/test/UnitTests/coffee/Project/ProjectDuplicatorTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectDuplicatorTests.coffee index c2c53e4ee6..7897ae47c8 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectDuplicatorTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectDuplicatorTests.coffee @@ -25,7 +25,7 @@ describe 'ProjectDuplicator', -> folders:[@level1folder] fileRefs:[{name:"file0", _id:"file0"}] @project = - _id: @project_id = "this_is_the_old_project" + _id: @old_project_id = "this_is_the_old_project_id" rootDoc_id: "rootDoc_id" rootFolder:[@rootFolder] compiler: "this_is_a_Compiler" @@ -45,7 +45,7 @@ describe 'ProjectDuplicator', -> @owner = {_id:"this_is_the_owner"} @stubbedNewProject = - _id:"new_project_id" + _id: @new_project_id = "new_project_id" readOnly_refs:[] collaberator_refs:[] rootFolder:[ @@ -59,7 +59,7 @@ describe 'ProjectDuplicator', -> @newFolder = {_id: "newFolderId"} @locator = - findRootDoc : sinon.stub().callsArgWith(1, null, @foundRootDoc) + findRootDoc : sinon.stub().callsArgWith(1, null, @foundRootDoc, {}) @projectOptionsHandler = setCompiler : sinon.stub() @@ -76,7 +76,10 @@ describe 'ProjectDuplicator', -> findById: sinon.stub().callsArgWith(1, null, @project) @ProjectGetter = - getProject: sinon.stub().callsArgWith(2, null, @project) + getProject: sinon.stub() + + @ProjectGetter.getProject.withArgs(@old_project_id, sinon.match.any).callsArgWith(2, null, @project) + @ProjectGetter.getProject.withArgs(@new_project_id, sinon.match.any).callsArgWith(2, null, @stubbedNewProject) @duplicator = SandboxedModule.require modulePath, requires: '../../models/Project':{Project:@Project} @@ -91,58 +94,58 @@ describe 'ProjectDuplicator', -> it "should look up the original project", (done) -> newProjectName = "someProj" - @duplicator.duplicate @owner, @project_id, newProjectName, (err, newProject)=> - @ProjectGetter.getProject.calledWith(@project_id).should.equal true + @duplicator.duplicate @owner, @old_project_id, newProjectName, (err, newProject)=> + @ProjectGetter.getProject.calledWith(@old_project_id).should.equal true done() it "should flush the original project to mongo", (done) -> newProjectName = "someProj" - @duplicator.duplicate @owner, @project_id, newProjectName, (err, newProject)=> - @DocumentUpdaterHandler.flushProjectToMongo.calledWith(@project_id).should.equal true + @duplicator.duplicate @owner, @old_project_id, newProjectName, (err, newProject)=> + @DocumentUpdaterHandler.flushProjectToMongo.calledWith(@old_project_id).should.equal true done() it 'should create a blank project', (done)-> newProjectName = "someProj" - @duplicator.duplicate @owner, @project_id, newProjectName, (err, newProject)=> + @duplicator.duplicate @owner, @old_project_id, newProjectName, (err, newProject)=> newProject._id.should.equal @stubbedNewProject._id @creationHandler.createBlankProject.calledWith(@owner._id, newProjectName).should.equal true done() it 'should use the same compiler', (done)-> @entityHandler.addDocWithProject.callsArgWith(4, null, @rootFolder.docs[0]) - @duplicator.duplicate @owner, @project_id, "", (err, newProject)=> + @duplicator.duplicate @owner, @old_project_id, "", (err, newProject)=> @projectOptionsHandler.setCompiler.calledWith(@stubbedNewProject._id, @project.compiler).should.equal true done() - it 'should use the same root doc', (done)-> + it 'should use the same root docccccccc', (done)-> @entityHandler.addDocWithProject.callsArgWith(4, null, @rootFolder.docs[0]) - @duplicator.duplicate @owner, @project_id, "", (err, newProject)=> - @entityHandler.setRootDoc.calledWith(@stubbedNewProject, @rootFolder.docs[0]._id).should.equal true + @duplicator.duplicate @owner, @old_project_id, "", (err, newProject)=> + @entityHandler.setRootDoc.calledWith(@stubbedNewProject._id, @rootFolder.docs[0]._id).should.equal true done() it 'should not copy the collaberators or read only refs', (done)-> - @duplicator.duplicate @owner, @project_id, "", (err, newProject)=> + @duplicator.duplicate @owner, @old_project_id, "", (err, newProject)=> newProject.collaberator_refs.length.should.equal 0 newProject.readOnly_refs.length.should.equal 0 done() it 'should copy all the folders', (done)-> - @duplicator.duplicate @owner, @project_id, "", (err, newProject)=> + @duplicator.duplicate @owner, @old_project_id, "", (err, newProject)=> @entityHandler.addFolderWithProject.calledWith(@stubbedNewProject, @stubbedNewProject.rootFolder[0]._id, @level1folder.name).should.equal true @entityHandler.addFolderWithProject.calledWith(@stubbedNewProject, @newFolder._id, @level2folder.name).should.equal true @entityHandler.addFolderWithProject.callCount.should.equal 2 done() it 'should copy all the docs', (done)-> - @duplicator.duplicate @owner, @project_id, "", (err, newProject)=> - @DocstoreManager.getAllDocs.calledWith(@project_id).should.equal true + @duplicator.duplicate @owner, @old_project_id, "", (err, newProject)=> + @DocstoreManager.getAllDocs.calledWith(@old_project_id).should.equal true @entityHandler.addDocWithProject.calledWith(@stubbedNewProject, @stubbedNewProject.rootFolder[0]._id, @doc0.name, @doc0_lines).should.equal true @entityHandler.addDocWithProject.calledWith(@stubbedNewProject, @newFolder._id, @doc1.name, @doc1_lines).should.equal true @entityHandler.addDocWithProject.calledWith(@stubbedNewProject, @newFolder._id, @doc2.name, @doc2_lines).should.equal true done() it 'should copy all the files', (done)-> - @duplicator.duplicate @owner, @project_id, "", (err, newProject)=> + @duplicator.duplicate @owner, @old_project_id, "", (err, newProject)=> @entityHandler.copyFileFromExistingProjectWithProject.calledWith(@stubbedNewProject, @stubbedNewProject.rootFolder[0]._id, @project._id, @rootFolder.fileRefs[0]).should.equal true @entityHandler.copyFileFromExistingProjectWithProject.calledWith(@stubbedNewProject, @newFolder._id, @project._id, @level1folder.fileRefs[0]).should.equal true @entityHandler.copyFileFromExistingProjectWithProject.calledWith(@stubbedNewProject, @newFolder._id, @project._id, @level2folder.fileRefs[0]).should.equal true