From 5438f39f9ebeac546a4f9d4f78ab0557342c640b Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Mon, 25 Jul 2016 09:58:08 +0100 Subject: [PATCH] Start testing `acceptInvite` --- .../CollaboratorsInviteHandler.coffee | 6 +- .../CollaboratorsInviteHandlerTests.coffee | 88 +++++++++++++++++-- 2 files changed, 82 insertions(+), 12 deletions(-) diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee index 50d75482e6..597fe8c082 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee @@ -61,7 +61,7 @@ module.exports = CollaboratorsInviteHandler = logger.log {err, projectId, inviteId}, "no project found" return callback(err) # TODO: check if we need to cast the ids to ObjectId - ProjectInvite.findOne {_id: inviteId, projectId: projectId, token: token}, (err, invite) -> + ProjectInvite.findOne {_id: inviteId, projectId: projectId, token: tokenString}, (err, invite) -> if err? logger.err {err, projectId, inviteId}, "error finding invite" return callback(err) @@ -94,9 +94,9 @@ module.exports = CollaboratorsInviteHandler = return callback(error) if error? # Flush to TPDS in background to add files to collaborator's Dropbox ProjectEntityHandler = require("../Project/ProjectEntityHandler") - ProjectEntityHandler.flushProjectToThirdPartyDataStore project_id, (error) -> + ProjectEntityHandler.flushProjectToThirdPartyDataStore project._id, (error) -> if error? - logger.error {err: error, project_id, user_id}, "error flushing to TPDS after adding collaborator" + logger.error {err: error, project_id: project._id, user_id}, "error flushing to TPDS after adding collaborator" # Remove invite ProjectInvite.remove {_id: inviteId}, (err) -> if err? diff --git a/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee b/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee index 8d7814a4c9..61513ec8fa 100644 --- a/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee +++ b/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee @@ -19,7 +19,11 @@ describe "CollaboratorsInviteHandler", -> save: sinon.stub() @findOne: sinon.stub() @remove: sinon.stub() - @Project = {} + @Project = class Project + constructor: () -> + this + @findOne: sinon.stub() + @update: sinon.stub() @Crypto = Crypto @CollaboratorsInviteHandler = SandboxedModule.require modulePath, requires: 'settings-sharelatex': @settings = {} @@ -28,15 +32,27 @@ describe "CollaboratorsInviteHandler", -> '../Contacts/ContactManager': @ContactManager = {} '../../models/Project': {Project: @Project} '../../models/ProjectInvite': {ProjectInvite: @ProjectInvite} + "../Project/ProjectEntityHandler": @ProjectEntityHandler = {} 'crypto': @Crypto @projectId = ObjectId() @sendingUserId = ObjectId() @email = "user@example.com" @userId = ObjectId() + @user = + _id: @userId + email: 'someone@example.com' @inviteId = ObjectId() @token = 'hnhteaosuhtaeosuahs' @privileges = "readAndWrite" + @fakeInvite = + _id: @inviteId + email: @email + token: @token + sendingUserId: @sendingUserId + projectId: @projectId + privileges: @privileges + createdAt: new Date() describe 'inviteToProject', -> @@ -130,14 +146,6 @@ describe "CollaboratorsInviteHandler", -> describe 'getInviteByToken', -> beforeEach -> - @fakeInvite = - _id: @inviteId - email: @email - token: @token - sendingUserId: @sendingUserId - projectId: @projectId - privileges: @privileges - createdAt: new Date() @ProjectInvite.findOne.callsArgWith(1, null, @fakeInvite) @call = (callback) => @CollaboratorsInviteHandler.getInviteByToken @projectId, @token, callback @@ -189,3 +197,65 @@ describe "CollaboratorsInviteHandler", -> expect(invite).to.not.be.instanceof Error expect(invite).to.be.oneOf [null, undefined] done() + + describe 'acceptInvite', -> + + beforeEach -> + @fakeProject = + _id: @projectId + collaberator_refs: [] + readOnly_refs: [] + @Project.findOne.callsArgWith(1, null, @fakeProject) + @ProjectInvite.findOne.callsArgWith(1, null, @fakeInvite) + @ContactManager.addContact = sinon.stub() + @Project.update.callsArgWith(2, null) + @ProjectEntityHandler.flushProjectToThirdPartyDataStore = sinon.stub().callsArgWith(1, null) + @ProjectInvite.remove.callsArgWith(1, null) + @call = (callback) => + @CollaboratorsInviteHandler.acceptInvite @projectId, @inviteId, @token, @user, callback + + describe 'when all goes well', -> + + beforeEach -> + + it 'should not produce an error', (done) -> + @call (err) => + expect(err).to.not.be.instanceof Error + expect(err).to.be.oneOf [null, undefined] + done() + + it 'should have called Project.findOne', (done) -> + @call (err) => + @Project.findOne.callCount.should.equal 1 + @Project.findOne.calledWith({_id: @projectId}).should.equal true + done() + + it 'should have called ProjectInvite.findOne', (done) -> + @call (err) => + @ProjectInvite.findOne.callCount.should.equal 1 + @ProjectInvite.findOne.calledWith({_id: @inviteId, projectId: @projectId, token: @token}).should.equal true + done() + + it 'should have called ContactManager.addContact', (done) -> + @call (err) => + @ContactManager.addContact.callCount.should.equal 1 + @ContactManager.addContact.calledWith(@sendingUserId, @userId).should.equal true + done() + + it 'should have called Project.update, adding the user to callaberator_refs', (done) -> + @call (err) => + @Project.update.callCount.should.equal 1 + @Project.update.calledWith({_id: @projectId}, {$addToSet: {"collaberator_refs": @userId}}).should.equal true + done() + + it 'should have called ProjectEntityHandler.flushProjectToThirdPartyDataStore', (done) -> + @call (err) => + @ProjectEntityHandler.flushProjectToThirdPartyDataStore.callCount.should.equal 1 + @ProjectEntityHandler.flushProjectToThirdPartyDataStore.calledWith(@projectId).should.equal true + done() + + it 'should have called ProjectInvite.remove', (done) -> + @call (err) => + @ProjectInvite.remove.callCount.should.equal 1 + @ProjectInvite.remove.calledWith({_id: @inviteId}).should.equal true + done()