ProjectInviteTests.coffee 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. expect = require("chai").expect
  2. Async = require("async")
  3. User = require "./helpers/User"
  4. request = require "./helpers/request"
  5. settings = require "settings-sharelatex"
  6. CollaboratorsEmailHandler = require "../../../app/js/Features/Collaborators/CollaboratorsEmailHandler"
  7. createInvite = (projectId, sendingUser, email, callback=(err, invite)->) ->
  8. sendingUser.getCsrfToken (err) ->
  9. return callback(err) if err
  10. sendingUser.request.post {
  11. url: "/project/#{projectId}/invite",
  12. json:
  13. email: email
  14. privileges: 'readAndWrite'
  15. }, (err, response, body) ->
  16. return callback(err) if err
  17. callback(err, body.invite)
  18. followInviteLink = (user, link, callback=(err, response, body)->) ->
  19. user.request.get {
  20. uri: link
  21. baseUrl: null
  22. }, callback
  23. acceptInvite = (user, invite, callback=(err, response, body)->) ->
  24. user.request.post {
  25. uri: "/project/#{invite.projectId}/invite/#{invite._id}/accept"
  26. json:
  27. token: invite.token
  28. }, callback
  29. describe "ProjectInviteTests", ->
  30. before (done) ->
  31. @timeout(20000)
  32. @sendingUser = new User()
  33. @user = new User()
  34. @site_admin = new User({email: "admin@example.com"})
  35. @email = 'smoketestuser@example.com'
  36. @projectName = 'sharing test'
  37. @projectId = null
  38. @fakeProject = null
  39. Async.series [
  40. (cb) => @user.login cb
  41. (cb) => @sendingUser.login cb
  42. (cb) => @sendingUser.createProject(@projectName, (err, projectId, project) =>
  43. throw err if err
  44. @projectId = projectId
  45. @fakeProject = {
  46. _id: projectId,
  47. name: @projectName,
  48. owner_ref: @sendingUser
  49. }
  50. cb()
  51. )
  52. ], done
  53. after (done) ->
  54. Async.series [
  55. (cb) => @sendingUser.deleteProject(@projectId, cb)
  56. ], done
  57. describe "user is logged in", ->
  58. beforeEach (done) ->
  59. @user.login (err) =>
  60. if err
  61. throw err
  62. done()
  63. describe 'user is not a member of the project', ->
  64. beforeEach (done) ->
  65. @invite = null
  66. @link = null
  67. createInvite @projectId, @sendingUser, @email, (err, invite) =>
  68. @invite = invite
  69. @link = CollaboratorsEmailHandler._buildInviteUrl(@fakeProject, @invite)
  70. done()
  71. it 'should not grant access if the user does not accept the invite', (done) ->
  72. Async.series(
  73. [
  74. # go to the invite page
  75. (cb) =>
  76. followInviteLink @user, @link, (err, response, body) =>
  77. expect(err).to.be.oneOf [null, undefined]
  78. expect(response.statusCode).to.equal 200
  79. expect(body).to.match new RegExp("<title>Project Invite - .*</title>")
  80. cb()
  81. # access the project page
  82. (cb) =>
  83. @user.openProject @invite.projectId, (err) =>
  84. expect(err).to.be.instanceof Error
  85. cb()
  86. ], done
  87. )
  88. it 'should allow the user to accept the invite and access the project', (done) ->
  89. Async.series(
  90. [
  91. # go to the invite page
  92. (cb) =>
  93. followInviteLink @user, @link, (err, response, body) =>
  94. expect(err).to.be.oneOf [null, undefined]
  95. expect(response.statusCode).to.equal 200
  96. expect(body).to.match new RegExp("<title>Project Invite - .*</title>")
  97. cb()
  98. # accept the invite
  99. (cb) =>
  100. acceptInvite @user, @invite, (err, response, body) =>
  101. expect(err).to.be.oneOf [null, undefined]
  102. expect(response.statusCode).to.equal 302
  103. expect(response.headers.location).to.equal "/project/#{@invite.projectId}"
  104. cb()
  105. # access the project page
  106. (cb) =>
  107. @user.openProject @invite.projectId, (err) =>
  108. expect(err).to.be.oneOf [null, undefined]
  109. cb()
  110. ], done
  111. )