UserThirdPartyIdentityTests.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /* eslint-disable
  2. handle-callback-err,
  3. max-len,
  4. no-unused-vars,
  5. */
  6. // TODO: This file was created by bulk-decaffeinate.
  7. // Fix any style issues and re-enable lint.
  8. /*
  9. * decaffeinate suggestions:
  10. * DS102: Remove unnecessary code created because of implicit returns
  11. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  12. */
  13. const Errors = require('../../../app/src/Features/Errors/Errors')
  14. const Settings = require('settings-sharelatex')
  15. const User = require('./helpers/User')
  16. const ThirdPartyIdentityManager = require('../../../app/src/Features/User/ThirdPartyIdentityManager')
  17. const chai = require('chai')
  18. const { expect } = chai
  19. describe('ThirdPartyIdentityManager', function() {
  20. beforeEach(function(done) {
  21. this.provider = 'provider'
  22. this.externalUserId = 'external-user-id'
  23. this.externalData = { test: 'data' }
  24. this.user = new User()
  25. return this.user.ensureUserExists(done)
  26. })
  27. afterEach(function(done) {
  28. return this.user.full_delete_user(this.user.email, done)
  29. })
  30. describe('login', function() {
  31. describe('when third party identity exists', function() {
  32. beforeEach(function(done) {
  33. return ThirdPartyIdentityManager.link(
  34. this.user.id,
  35. this.provider,
  36. this.externalUserId,
  37. this.externalData,
  38. done
  39. )
  40. })
  41. it('should return user', function(done) {
  42. ThirdPartyIdentityManager.login(
  43. this.provider,
  44. this.externalUserId,
  45. this.externalData,
  46. (err, user) => {
  47. expect(err).to.be.null
  48. expect(user._id.toString()).to.equal(this.user.id)
  49. return done()
  50. }
  51. )
  52. })
  53. return it('should merge external data', function(done) {
  54. this.externalData = {
  55. test: 'different',
  56. another: 'key'
  57. }
  58. ThirdPartyIdentityManager.login(
  59. this.provider,
  60. this.externalUserId,
  61. this.externalData,
  62. (err, user) => {
  63. expect(err).to.be.null
  64. expect(user.thirdPartyIdentifiers[0].externalData).to.deep.equal(
  65. this.externalData
  66. )
  67. return done()
  68. }
  69. )
  70. })
  71. })
  72. return describe('when third party identity does not exists', () =>
  73. it('should return error', function(done) {
  74. ThirdPartyIdentityManager.login(
  75. this.provider,
  76. this.externalUserId,
  77. this.externalData,
  78. (err, user) => {
  79. expect(err.name).to.equal('ThirdPartyUserNotFoundError')
  80. return done()
  81. }
  82. )
  83. }))
  84. })
  85. describe('link', function() {
  86. describe('when provider not already linked', () =>
  87. it('should link provider to user', function(done) {
  88. return ThirdPartyIdentityManager.link(
  89. this.user.id,
  90. this.provider,
  91. this.externalUserId,
  92. this.externalData,
  93. function(err, res) {
  94. expect(res.nModified).to.equal(1)
  95. return done()
  96. }
  97. )
  98. }))
  99. return describe('when provider is already linked', function() {
  100. beforeEach(function(done) {
  101. return ThirdPartyIdentityManager.link(
  102. this.user.id,
  103. this.provider,
  104. this.externalUserId,
  105. this.externalData,
  106. done
  107. )
  108. })
  109. it('should link provider to user', function(done) {
  110. return ThirdPartyIdentityManager.link(
  111. this.user.id,
  112. this.provider,
  113. this.externalUserId,
  114. this.externalData,
  115. function(err, res) {
  116. expect(res.nModified).to.equal(1)
  117. return done()
  118. }
  119. )
  120. })
  121. it('should not create duplicate thirdPartyIdentifiers', function(done) {
  122. return ThirdPartyIdentityManager.link(
  123. this.user.id,
  124. this.provider,
  125. this.externalUserId,
  126. this.externalData,
  127. (err, res) => {
  128. return this.user.get(function(err, user) {
  129. expect(user.thirdPartyIdentifiers.length).to.equal(1)
  130. return done()
  131. })
  132. }
  133. )
  134. })
  135. return it('should replace existing data', function(done) {
  136. this.externalData = { replace: 'data' }
  137. return ThirdPartyIdentityManager.link(
  138. this.user.id,
  139. this.provider,
  140. this.externalUserId,
  141. this.externalData,
  142. (err, res) => {
  143. return this.user.get((err, user) => {
  144. expect(user.thirdPartyIdentifiers[0].externalData).to.deep.equal(
  145. this.externalData
  146. )
  147. return done()
  148. })
  149. }
  150. )
  151. })
  152. })
  153. })
  154. return describe('unlink', function() {
  155. describe('when provider not already linked', () =>
  156. it('should succeed', function(done) {
  157. return ThirdPartyIdentityManager.unlink(
  158. this.user.id,
  159. this.provider,
  160. function(err, res) {
  161. expect(err).to.be.null
  162. expect(res.nModified).to.equal(0)
  163. return done()
  164. }
  165. )
  166. }))
  167. return describe('when provider is already linked', function() {
  168. beforeEach(function(done) {
  169. return ThirdPartyIdentityManager.link(
  170. this.user.id,
  171. this.provider,
  172. this.externalUserId,
  173. this.externalData,
  174. done
  175. )
  176. })
  177. return it('should remove thirdPartyIdentifiers entry', function(done) {
  178. return ThirdPartyIdentityManager.unlink(
  179. this.user.id,
  180. this.provider,
  181. (err, res) => {
  182. return this.user.get(function(err, user) {
  183. expect(user.thirdPartyIdentifiers.length).to.equal(0)
  184. return done()
  185. })
  186. }
  187. )
  188. })
  189. })
  190. })
  191. })