Эх сурвалжийг харах

project duplicator works and tests pass.

not so bad now.
Henry Oswald 10 жил өмнө
parent
commit
3c4e74af4b

+ 12 - 18
services/web/app/coffee/Features/Project/ProjectDuplicator.coffee

@@ -13,9 +13,8 @@ logger = require("logger-sharelatex")
 module.exports = ProjectDuplicator =
 module.exports = ProjectDuplicator =
 
 
 	_copyDocs: (newProject, originalRootDoc, originalFolder, desFolder, docContents, callback)->
 	_copyDocs: (newProject, originalRootDoc, originalFolder, desFolder, docContents, callback)->
-		console.log "_copyDocs", originalRootDoc
 		setRootDoc = _.once (doc_id)->
 		setRootDoc = _.once (doc_id)->
-			projectEntityHandler.setRootDoc newProject, doc_id
+			projectEntityHandler.setRootDoc newProject._id, doc_id
 
 
 		jobs = originalFolder.docs.map (doc)->
 		jobs = originalFolder.docs.map (doc)->
 			return (callback)->
 			return (callback)->
@@ -34,20 +33,20 @@ module.exports = ProjectDuplicator =
 		jobs = originalFolder.fileRefs.map (file)->
 		jobs = originalFolder.fileRefs.map (file)->
 			return (cb)->
 			return (cb)->
 				projectEntityHandler.copyFileFromExistingProjectWithProject newProject, desFolder._id, originalProject_id, file, 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?
 			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)
 				return cb(err)
 
 
 			jobs = originalFolder.folders.map (childFolder)->
 			jobs = originalFolder.folders.map (childFolder)->
 				return (cb)->
 				return (cb)->
 					projectEntityHandler.addFolderWithProject newProject, desFolder?._id, childFolder.name, (err, newFolder)->
 					projectEntityHandler.addFolderWithProject newProject, desFolder?._id, childFolder.name, (err, newFolder)->
 						return cb(err) if err?
 						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)->
 			jobs.push (cb)->
 				ProjectDuplicator._copyFiles newProject, originalProject_id, originalFolder, desFolder, cb
 				ProjectDuplicator._copyFiles newProject, originalProject_id, originalFolder, desFolder, cb
@@ -56,7 +55,6 @@ module.exports = ProjectDuplicator =
 
 
 			async.series jobs, callback
 			async.series jobs, callback
 
 
-
 	duplicate: (owner, originalProject_id, newProjectName, callback)->
 	duplicate: (owner, originalProject_id, newProjectName, callback)->
 
 
 		jobs = 
 		jobs = 
@@ -76,20 +74,16 @@ module.exports = ProjectDuplicator =
 				logger.err err:err, originalProject_id:originalProject_id, "error duplicating project"
 				logger.err err:err, originalProject_id:originalProject_id, "error duplicating project"
 				return callback(err)
 				return callback(err)
 			{originalProject, newProject, originalRootDoc, docContentsArray} = results
 			{originalProject, newProject, originalRootDoc, docContentsArray} = results
-			originalRootDoc = originalRootDoc[0] #wtf array?
+
+			originalRootDoc = originalRootDoc[0]
+
 			docContents = {}
 			docContents = {}
 			for docContent in docContentsArray
 			for docContent in docContentsArray
 				docContents[docContent._id] = docContent
 				docContents[docContent._id] = docContent
 			
 			
 			projectOptionsHandler.setCompiler newProject._id, originalProject.compiler, ->
 			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?
 				if err?
 					logger.err err:err, originalProject_id:originalProject_id,  newProjectName:newProjectName, "error cloning project"
 					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)

+ 21 - 18
services/web/test/UnitTests/coffee/Project/ProjectDuplicatorTests.coffee

@@ -25,7 +25,7 @@ describe 'ProjectDuplicator', ->
 			folders:[@level1folder]
 			folders:[@level1folder]
 			fileRefs:[{name:"file0", _id:"file0"}]
 			fileRefs:[{name:"file0", _id:"file0"}]
 		@project = 
 		@project = 
-			_id: @project_id = "this_is_the_old_project"
+			_id: @old_project_id = "this_is_the_old_project_id"
 			rootDoc_id: "rootDoc_id"
 			rootDoc_id: "rootDoc_id"
 			rootFolder:[@rootFolder]
 			rootFolder:[@rootFolder]
 			compiler: "this_is_a_Compiler"
 			compiler: "this_is_a_Compiler"
@@ -45,7 +45,7 @@ describe 'ProjectDuplicator', ->
 
 
 		@owner = {_id:"this_is_the_owner"}
 		@owner = {_id:"this_is_the_owner"}
 		@stubbedNewProject = 
 		@stubbedNewProject = 
-			_id:"new_project_id"
+			_id: @new_project_id = "new_project_id"
 			readOnly_refs:[]
 			readOnly_refs:[]
 			collaberator_refs:[]
 			collaberator_refs:[]
 			rootFolder:[
 			rootFolder:[
@@ -59,7 +59,7 @@ describe 'ProjectDuplicator', ->
 		@newFolder = {_id: "newFolderId"}
 		@newFolder = {_id: "newFolderId"}
 
 
 		@locator =
 		@locator =
-			findRootDoc : sinon.stub().callsArgWith(1, null, @foundRootDoc)
+			findRootDoc : sinon.stub().callsArgWith(1, null, @foundRootDoc, {})
 
 
 		@projectOptionsHandler =
 		@projectOptionsHandler =
 			setCompiler : sinon.stub()								
 			setCompiler : sinon.stub()								
@@ -76,7 +76,10 @@ describe 'ProjectDuplicator', ->
 			findById: sinon.stub().callsArgWith(1, null, @project)
 			findById: sinon.stub().callsArgWith(1, null, @project)
 
 
 		@ProjectGetter =
 		@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:
 		@duplicator = SandboxedModule.require modulePath, requires:
 			'../../models/Project':{Project:@Project}
 			'../../models/Project':{Project:@Project}
@@ -91,58 +94,58 @@ describe 'ProjectDuplicator', ->
 
 
 	it "should look up the original project", (done) ->
 	it "should look up the original project", (done) ->
 		newProjectName = "someProj"
 		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()
 			done()
 
 
 	it "should flush the original project to mongo", (done) ->
 	it "should flush the original project to mongo", (done) ->
 		newProjectName = "someProj"
 		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()
 			done()
 
 
 	it 'should create a blank project', (done)->
 	it 'should create a blank project', (done)->
 		newProjectName = "someProj"
 		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
 			newProject._id.should.equal @stubbedNewProject._id
 			@creationHandler.createBlankProject.calledWith(@owner._id, newProjectName).should.equal true
 			@creationHandler.createBlankProject.calledWith(@owner._id, newProjectName).should.equal true
 			done()
 			done()
 
 
 	it 'should use the same compiler', (done)->
 	it 'should use the same compiler', (done)->
 		@entityHandler.addDocWithProject.callsArgWith(4, null, @rootFolder.docs[0])
 		@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
 			@projectOptionsHandler.setCompiler.calledWith(@stubbedNewProject._id, @project.compiler).should.equal true
 			done()
 			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])
 		@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()
 			done()
 
 
 	it 'should not copy the collaberators or read only refs', (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.collaberator_refs.length.should.equal 0
 			newProject.readOnly_refs.length.should.equal 0
 			newProject.readOnly_refs.length.should.equal 0
 			done()	
 			done()	
 
 
 	it 'should copy all the folders', (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, @stubbedNewProject.rootFolder[0]._id, @level1folder.name).should.equal true
 			@entityHandler.addFolderWithProject.calledWith(@stubbedNewProject, @newFolder._id, @level2folder.name).should.equal true
 			@entityHandler.addFolderWithProject.calledWith(@stubbedNewProject, @newFolder._id, @level2folder.name).should.equal true
 			@entityHandler.addFolderWithProject.callCount.should.equal 2
 			@entityHandler.addFolderWithProject.callCount.should.equal 2
 			done()
 			done()
 
 
 	it 'should copy all the docs', (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, @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, @doc1.name, @doc1_lines).should.equal true
 			@entityHandler.addDocWithProject.calledWith(@stubbedNewProject, @newFolder._id, @doc2.name, @doc2_lines).should.equal true
 			@entityHandler.addDocWithProject.calledWith(@stubbedNewProject, @newFolder._id, @doc2.name, @doc2_lines).should.equal true
 			done()
 			done()
 
 
 	it 'should copy all the files', (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, @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, @level1folder.fileRefs[0]).should.equal true
 			@entityHandler.copyFileFromExistingProjectWithProject.calledWith(@stubbedNewProject, @newFolder._id, @project._id, @level2folder.fileRefs[0]).should.equal true
 			@entityHandler.copyFileFromExistingProjectWithProject.calledWith(@stubbedNewProject, @newFolder._id, @project._id, @level2folder.fileRefs[0]).should.equal true