From b201f1a37ab40d8edad69013a0b3d6a812b16a12 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 22 Jul 2016 14:21:34 +0100 Subject: [PATCH] Test getInviteByToken. --- .../CollaboratorsInviteController.coffee | 1 + .../CollaboratorsInviteHandler.coffee | 4 +- .../CollaboratorsInviteHandlerTests.coffee | 82 ++++++++++++++++++- 3 files changed, 84 insertions(+), 3 deletions(-) diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee index 1cc36d6e14..76657c1f60 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee @@ -47,6 +47,7 @@ module.exports = CollaboratorsInviteController = if err? logger.err {projectId, token}, "error getting invite by token" return next(err) + # TODO: should we render an expired view instead? if !invite logger.log {projectId, token}, "no invite found for token" return res.sendStatus(404) diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee index 9d23605ef8..9e92fce26c 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee @@ -44,7 +44,7 @@ module.exports = CollaboratorsInviteHandler = logger.log {projectId, tokenString}, "fetching invite by token" ProjectInvite.findOne {projectId: projectId, token: tokenString}, (err, invite) -> if err? - logger.err {err, projectId, inviteId}, "error fetching invite" + logger.err {err, projectId}, "error fetching invite" return callback(err) if !invite err = new Errors.NotFoundError("no invite found for token") @@ -53,7 +53,7 @@ module.exports = CollaboratorsInviteHandler = now = new Date() # TODO: re-assess whether we should return null or a notfounderror if invite.expiresAt < now - logger.log {projectId, inviteId, expiresAt: invite.expiresAt}, "invite expired" + logger.log {projectId, inviteId: invite._id, expiresAt: invite.expiresAt}, "invite expired" return callback(null, null) callback(null, invite) diff --git a/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee b/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee index e97b98dc3a..728a75894d 100644 --- a/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee +++ b/services/web/test/UnitTests/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee @@ -35,6 +35,7 @@ describe "CollaboratorsInviteHandler", -> @email = "user@example.com" @userId = ObjectId() @inviteId = ObjectId() + @token = 'hnhteaosuhtaeosuahs' @privileges = "readAndWrite" describe 'inviteToProject', -> @@ -56,6 +57,7 @@ describe "CollaboratorsInviteHandler", -> it 'should not produce an error', (done) -> @call (err, invite) => expect(err).to.not.be.instanceof Error + expect(err).to.be.oneOf [null, undefined] done() it 'should produce the invite object', (done) -> @@ -96,7 +98,6 @@ describe "CollaboratorsInviteHandler", -> beforeEach -> @ProjectInvite.remove.callsArgWith(1, null) - @CollaboratorsEmailHandler.notifyUserOfProjectInvite = sinon.stub() @call = (callback) => @CollaboratorsInviteHandler.revokeInvite @projectId, @inviteId, callback @@ -107,6 +108,7 @@ describe "CollaboratorsInviteHandler", -> 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 call ProjectInvite.remove', (done) -> @@ -124,3 +126,81 @@ describe "CollaboratorsInviteHandler", -> @call (err) => expect(err).to.be.instanceof Error done() + + describe 'getInviteByToken', -> + + beforeEach -> + @theDarkFuture = new Date() + @theDarkFuture.setYear(40000) + @fakeInvite = + _id: @inviteId + email: @email + token: @token + sendingUserId: @sendingUserId + projectId: @projectId + privileges: @privileges + createdAt: new Date() + expiresAt: @theDarkFuture + @ProjectInvite.findOne.callsArgWith(1, null, @fakeInvite) + @call = (callback) => + @CollaboratorsInviteHandler.getInviteByToken @projectId, @token, 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 produce the invite object', (done) -> + @call (err, invite) => + expect(invite).to.deep.equal @fakeInvite + done() + + it 'should call ProjectInvite.findOne', (done) -> + @call (err) => + @ProjectInvite.findOne.callCount.should.equal 1 + @ProjectInvite.findOne.calledWith({projectId: @projectId, token: @token}).should.equal true + done() + + describe 'when findOne produces an error', -> + + beforeEach -> + @ProjectInvite.findOne.callsArgWith(1, new Error('woops')) + + it 'should produce an error', (done) -> + @call (err) => + expect(err).to.be.instanceof Error + done() + + describe 'when findOne does not find an invite', -> + + beforeEach -> + @ProjectInvite.findOne.callsArgWith(1, null, null) + + it 'should produce an error', (done) -> + @call (err) => + expect(err).to.be.instanceof Error + done() + + describe 'when the invite is expired', -> + + beforeEach -> + @theDeepPast = new Date() + @theDeepPast.setYear(1977) + @fakeInvite.expiresAt = @theDeepPast + @ProjectInvite.findOne.callsArgWith(1, null, @fakeInvite) + + 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 not produce an invite object', (done) -> + @call (err, invite) => + expect(invite).to.be.oneOf [null, undefined] + done()