소스 검색

update unit tests for duplicate checks

Brian Gough 8 년 전
부모
커밋
ea9976994a
1개의 변경된 파일과 138개의 추가작업 그리고 2개의 파일을 삭제
  1. 138 2
      services/web/test/unit/coffee/Project/ProjectEntityHandlerTests.coffee

+ 138 - 2
services/web/test/unit/coffee/Project/ProjectEntityHandlerTests.coffee

@@ -62,7 +62,7 @@ describe 'ProjectEntityHandler', ->
 		@ProjectGetter =
 		@ProjectGetter =
 			getProjectWithOnlyFolders : (project_id, callback)=> callback(null, @project)
 			getProjectWithOnlyFolders : (project_id, callback)=> callback(null, @project)
 			getProjectWithoutDocLines : (project_id, callback)=> callback(null, @project)
 			getProjectWithoutDocLines : (project_id, callback)=> callback(null, @project)
-			getProject:sinon.stub()
+			getProject: sinon.stub().callsArgWith(2, null, @project)
 		@projectUpdater = markAsUpdated:sinon.stub()
 		@projectUpdater = markAsUpdated:sinon.stub()
 		@projectLocator =
 		@projectLocator =
 			findElement : sinon.stub()
 			findElement : sinon.stub()
@@ -287,6 +287,8 @@ describe 'ProjectEntityHandler', ->
 				@projectLocator.findElement = sinon.stub()
 				@projectLocator.findElement = sinon.stub()
 				@projectLocator.findElement.withArgs({project: @project, element_id: @docId, type: 'docs'})
 				@projectLocator.findElement.withArgs({project: @project, element_id: @docId, type: 'docs'})
 					.callsArgWith(1, null, @doc, @path)
 					.callsArgWith(1, null, @doc, @path)
+				@projectLocator.findElement.withArgs({project: @project, element_id: folder_id, type:"folder"},)
+					.callsArgWith(1, null, @destFolder, @destFolderPath)
 				@ProjectEntityHandler.moveEntity project_id, @docId, folder_id, "docs", userId, done
 				@ProjectEntityHandler.moveEntity project_id, @docId, folder_id, "docs", userId, done
 
 
 			it 'should find the doc to move', ->
 			it 'should find the doc to move', ->
@@ -315,6 +317,46 @@ describe 'ProjectEntityHandler', ->
 					})
 					})
 					.should.equal true
 					.should.equal true
 
 
+		describe "moving a doc when another with the same name already exists", ->
+			beforeEach () ->
+				@docId = "4eecaffcbffa66588e000009"
+				@doc = { name: "another-doc.tex", lines:["1234","312343d"], rev: "1234"}
+				@path = {
+					mongo:"folders[0]"
+					fileSystem:"/old_folder/somewhere.txt"
+				}
+				@destFolder = { name: "folder", docs: [ {name:"another-doc.tex"} ] }
+				@destFolderPath = {
+					mongo:      "folders[0]"
+					fileSystem: "/dest_folder"
+				}
+				@projectLocator.findElement = sinon.stub()
+				@projectLocator.findElement.withArgs({project: @project, element_id: @docId, type: 'docs'})
+					.callsArgWith(1, null, @doc, @path)
+				@projectLocator.findElement.withArgs({project: @project, element_id: folder_id, type:"folder"},)
+					.callsArgWith(1, null, @destFolder, @destFolderPath)
+				@callback = sinon.stub()
+				@ProjectEntityHandler.moveEntity project_id, @docId, folder_id, "docs", userId, @callback
+
+			it 'should return an error', ->
+				@callback.calledWith(new Errors.InvalidNameError("file already exists")).should.equal true
+
+			it "should should not send the update to the doc updater", ->
+				@documentUpdaterHandler.updateProjectStructure
+					.called.should.equal false
+
+			it 'should not remove the element from its current position', ->
+				@ProjectEntityHandler._removeElementFromMongoArray
+					.called.should.equal false
+
+			it "should not put the element back in the new folder", ->
+				@ProjectEntityHandler._putElement.called.should.equal false
+
+			it 'should not tell the third party data store', ->
+				@tpdsUpdateSender.moveEntity
+					.called.should.equal false
+
+
 		describe "moving a folder", ->
 		describe "moving a folder", ->
 			beforeEach ->
 			beforeEach ->
 				@folder_id = "folder-to-move"
 				@folder_id = "folder-to-move"
@@ -379,10 +421,37 @@ describe 'ProjectEntityHandler', ->
 						})
 						})
 						.should.equal true
 						.should.equal true
 
 
+			describe "when the destination folder contains a file with the same name", ->
+				beforeEach ->
+					@path.fileSystem = "/one/src_dir"
+					@pathToMoveTo.fileSystem = "/two/dest_dir"
+					@folder_to_move_to = { name: "folder to move to", fileRefs: [ {name: "folder"}] }
+					@projectLocator.findElement.withArgs({project: @project, element_id: @move_to_folder_id, type: 'folder'})
+						.callsArgWith(1, null, @folder_to_move_to, @pathToMoveTo)
+					@callback = sinon.stub()
+					@ProjectEntityHandler.moveEntity project_id, @folder_id, @move_to_folder_id, "folder", userId, @callback
+
+				it 'should find the folder we are moving to element', ->
+					@projectLocator.findElement
+						.calledWith({
+							element_id: @move_to_folder_id,
+							type: "folder",
+							project: @project
+						})
+						.should.equal true
+
+				it "should return an error", ->
+					@callback
+						.calledWith(new Errors.InvalidNameError("file already exists"))
+						.should.equal true
+
 			describe "when the destination folder is inside the moving folder", ->
 			describe "when the destination folder is inside the moving folder", ->
 				beforeEach ->
 				beforeEach ->
 					@path.fileSystem = "/one/two"
 					@path.fileSystem = "/one/two"
 					@pathToMoveTo.fileSystem = "/one/two/three"
 					@pathToMoveTo.fileSystem = "/one/two/three"
+
+					@projectLocator.findElement.withArgs({project: @project, element_id: @move_to_folder_id, type: 'folder'})
+						.callsArgWith(1, null, @folder_to_move_to, @pathToMoveTo)
 					@callback = sinon.stub()
 					@callback = sinon.stub()
 					@ProjectEntityHandler.moveEntity project_id, @folder_id, @move_to_folder_id, "folder", userId, @callback
 					@ProjectEntityHandler.moveEntity project_id, @folder_id, @move_to_folder_id, "folder", userId, @callback
 
 
@@ -472,6 +541,7 @@ describe 'ProjectEntityHandler', ->
 			@lines = ['1234','abc']
 			@lines = ['1234','abc']
 			@path = "/path/to/doc"
 			@path = "/path/to/doc"
 
 
+			@ProjectGetter.getProject = sinon.stub().callsArgWith(2, null, @project)
 			@ProjectEntityHandler._putElement = sinon.stub().callsArgWith(4, null, {path:{fileSystem:@path}})
 			@ProjectEntityHandler._putElement = sinon.stub().callsArgWith(4, null, {path:{fileSystem:@path}})
 			@callback = sinon.stub()
 			@callback = sinon.stub()
 			@tpdsUpdateSender.addDoc = sinon.stub().callsArg(1)
 			@tpdsUpdateSender.addDoc = sinon.stub().callsArg(1)
@@ -522,6 +592,7 @@ describe 'ProjectEntityHandler', ->
 			@lines = ['1234','abc']
 			@lines = ['1234','abc']
 			@path = "/path/to/doc"
 			@path = "/path/to/doc"
 
 
+			@ProjectGetter.getProject = sinon.stub().callsArgWith(2, null, @project)
 			@ProjectEntityHandler._putElement = sinon.stub().callsArgWith(4, null, {path:{fileSystem:@path}})
 			@ProjectEntityHandler._putElement = sinon.stub().callsArgWith(4, null, {path:{fileSystem:@path}})
 			@callback = sinon.stub()
 			@callback = sinon.stub()
 			@tpdsUpdateSender.addDoc = sinon.stub().callsArg(1)
 			@tpdsUpdateSender.addDoc = sinon.stub().callsArg(1)
@@ -1123,6 +1194,20 @@ describe 'ProjectEntityHandler', ->
 			@newName = "new.tex"
 			@newName = "new.tex"
 			@path = mongo: "mongo.path", fileSystem: "/oldnamepath/oldname"
 			@path = mongo: "mongo.path", fileSystem: "/oldnamepath/oldname"
 
 
+			@project_id = project_id
+			@project =
+				_id: ObjectId(project_id)
+				rootFolder: [_id:ObjectId()]
+			@folder =
+				_id: ObjectId()
+				name: "someFolder"
+				docs: [ {name: "another-doc.tex"} ]
+				fileRefs: [ {name: "another-file.tex"} ]
+				folders: [ {name: "another-folder"} ]
+			@doc =
+				_id: ObjectId()
+				name: "new.tex"
+
 			@ProjectGetter.getProject.callsArgWith(2, null, @project)
 			@ProjectGetter.getProject.callsArgWith(2, null, @project)
 			@ProjectEntityHandler.getAllEntitiesFromProject = sinon.stub()
 			@ProjectEntityHandler.getAllEntitiesFromProject = sinon.stub()
 			@ProjectEntityHandler.getAllEntitiesFromProject
 			@ProjectEntityHandler.getAllEntitiesFromProject
@@ -1132,7 +1217,7 @@ describe 'ProjectEntityHandler', ->
 				.onSecondCall()
 				.onSecondCall()
 				.callsArgWith(1, null, @newDocs = ['new-doc'], @newFiles = ['new-file'])
 				.callsArgWith(1, null, @newDocs = ['new-doc'], @newFiles = ['new-file'])
 
 
-			@projectLocator.findElement = sinon.stub().callsArgWith(1, null, @entity = { _id: @entity_id, name:"oldname", rev:4 }, @path)
+			@projectLocator.findElement = sinon.stub().callsArgWith(1, null, @entity = { _id: @entity_id, name:"oldname", rev:4 }, @path, @folder)
 			@tpdsUpdateSender.moveEntity = sinon.stub()
 			@tpdsUpdateSender.moveEntity = sinon.stub()
 			@ProjectModel.findOneAndUpdate = sinon.stub().callsArgWith(3, null, @project)
 			@ProjectModel.findOneAndUpdate = sinon.stub().callsArgWith(3, null, @project)
 			@documentUpdaterHandler.updateProjectStructure = sinon.stub().yields()
 			@documentUpdaterHandler.updateProjectStructure = sinon.stub().yields()
@@ -1154,6 +1239,27 @@ describe 'ProjectEntityHandler', ->
 				@tpdsUpdateSender.moveEntity.calledWith({project_id:project_id, startPath:@path.fileSystem, endPath:"/oldnamepath/new.tex", project_name:@project.name, rev:4}).should.equal true
 				@tpdsUpdateSender.moveEntity.calledWith({project_id:project_id, startPath:@path.fileSystem, endPath:"/oldnamepath/new.tex", project_name:@project.name, rev:4}).should.equal true
 				done()
 				done()
 
 
+		describe "when a document already exists with the same name", ->
+			beforeEach ->
+				@project =
+					_id: ObjectId(project_id)
+					rootFolder: [_id:ObjectId()]
+				@folder =
+					_id: ObjectId()
+					name: "someFolder"
+					docs: [ {name: "another-doc.tex"} ]
+					fileRefs: [ {name: "another-file.tex"} ]
+					folders: [ {name: "another-folder"} ]
+				@doc =
+					_id: ObjectId()
+					name: "new.tex"
+				@newName = "another-doc.tex"
+
+			it "should return an error", (done)->
+				@ProjectEntityHandler.renameEntity project_id, @entity_id, @entityType, @newName, userId, (err)=>
+					err.should.deep.equal new Errors.InvalidNameError("file already exists")
+					done()
+
 	describe "_insertDeletedDocReference", ->
 	describe "_insertDeletedDocReference", ->
 		beforeEach ->
 		beforeEach ->
 			@doc =
 			@doc =
@@ -1248,6 +1354,9 @@ describe 'ProjectEntityHandler', ->
 			@folder =
 			@folder =
 				_id: ObjectId()
 				_id: ObjectId()
 				name: "someFolder"
 				name: "someFolder"
+				docs: [ {name: "another-doc.tex"} ]
+				fileRefs: [ {name: "another-file.tex"} ]
+				folders: [ {name: "another-folder"} ]
 			@doc =
 			@doc =
 				_id: ObjectId()
 				_id: ObjectId()
 				name: "new.tex"
 				name: "new.tex"
@@ -1290,6 +1399,33 @@ describe 'ProjectEntityHandler', ->
 					@ProjectModel.findOneAndUpdate.called.should.equal false
 					@ProjectModel.findOneAndUpdate.called.should.equal false
 					done()
 					done()
 
 
+			it "should error if a document already exists with the same name", (done)->
+				doc =
+					_id: ObjectId()
+					name: "another-doc.tex"
+				@ProjectEntityHandler._putElement @project, @folder, doc, "doc", (err)=>
+					@ProjectModel.findOneAndUpdate.called.should.equal false
+					err.should.deep.equal new Errors.InvalidNameError("file already exists")
+					done()
+
+			it "should error if a file already exists with the same name", (done)->
+				doc =
+					_id: ObjectId()
+					name: "another-file.tex"
+				@ProjectEntityHandler._putElement @project, @folder, doc, "doc", (err)=>
+					@ProjectModel.findOneAndUpdate.called.should.equal false
+					err.should.deep.equal new Errors.InvalidNameError("file already exists")
+					done()
+
+			it "should error if a folder already exists with the same name", (done)->
+				doc =
+					_id: ObjectId()
+					name: "another-folder"
+				@ProjectEntityHandler._putElement @project, @folder, doc, "doc", (err)=>
+					@ProjectModel.findOneAndUpdate.called.should.equal false
+					err.should.deep.equal new Errors.InvalidNameError("file already exists")
+					done()
+
 		describe "_countElements", ->
 		describe "_countElements", ->
 
 
 			beforeEach ->
 			beforeEach ->