DropboxWebhookHandlerTests.coffee 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. SandboxedModule = require('sandboxed-module')
  2. assert = require('assert')
  3. require('chai').should()
  4. expect = require("chai").expect
  5. sinon = require('sinon')
  6. modulePath = require('path').join __dirname, '../../../../app/js/Features/Dropbox/DropboxWebhookHandler.js'
  7. describe 'DropboxWebhookHandler', ->
  8. beforeEach ->
  9. @DropboxWebhookHandler = SandboxedModule.require modulePath, requires:
  10. "../../models/User": User: @User = {}
  11. "../ThirdPartyDataStore/TpdsUpdateSender": @TpdsUpdateSender = {}
  12. "redis":
  13. createClient: () => @rclient =
  14. auth: sinon.stub()
  15. 'settings-sharelatex': redis: web: {}
  16. 'logger-sharelatex':
  17. log:->
  18. err:->
  19. @callback = sinon.stub()
  20. describe "pollDropboxUids", ->
  21. beforeEach (done) ->
  22. @dropbox_uids = [
  23. "123456",
  24. "789123"
  25. ]
  26. @DropboxWebhookHandler.pollDropboxUid = sinon.stub().callsArg(1)
  27. @DropboxWebhookHandler.pollDropboxUids @dropbox_uids, done
  28. it "should call pollDropboxUid for each uid", ->
  29. for uid in @dropbox_uids
  30. @DropboxWebhookHandler.pollDropboxUid
  31. .calledWith(uid)
  32. .should.equal true
  33. describe "pollDropboxUid", ->
  34. beforeEach ->
  35. @dropbox_uid = "dropbox-123456"
  36. @user_id = "sharelatex-user-id"
  37. @User.find = sinon.stub().callsArgWith(1, null, [ _id: @user_id ])
  38. @TpdsUpdateSender.pollDropboxForUser = sinon.stub().callsArg(1)
  39. describe "when there is already a poll in progress", () ->
  40. beforeEach ->
  41. @DropboxWebhookHandler._delayAndBatchPoll = sinon.stub().callsArgWith(1, null, false)
  42. @DropboxWebhookHandler.pollDropboxUid @dropbox_uid, @callback
  43. it "should not go ahead with the poll", ->
  44. @TpdsUpdateSender.pollDropboxForUser.called.should.equal false
  45. describe "when we are the one to do the delayed poll", () ->
  46. beforeEach ->
  47. @DropboxWebhookHandler._delayAndBatchPoll = sinon.stub().callsArgWith(1, null, true)
  48. @DropboxWebhookHandler.pollDropboxUid @dropbox_uid, @callback
  49. it "should look up the user", ->
  50. @User.find
  51. .calledWith({ "dropbox.access_token.uid": @dropbox_uid, "features.dropbox": true })
  52. .should.equal true
  53. it "should poll the user's Dropbox", ->
  54. @TpdsUpdateSender.pollDropboxForUser
  55. .calledWith(@user_id)
  56. .should.equal true
  57. it "should call the callback", ->
  58. @callback.called.should.equal true
  59. describe "_delayAndBatchPoll", () ->
  60. beforeEach ->
  61. @dropbox_uid = "dropbox-uid-123"
  62. @DropboxWebhookHandler.POLL_DELAY_IN_MS = 100
  63. describe "when no one else is polling yet", ->
  64. beforeEach (done) ->
  65. @rclient.set = sinon.stub().callsArgWith(5, null, "OK")
  66. @start = Date.now()
  67. @DropboxWebhookHandler._delayAndBatchPoll @dropbox_uid, (error, @shouldPoll) =>
  68. @end = Date.now()
  69. done()
  70. it "should set the lock", ->
  71. @rclient.set
  72. .calledWith("dropbox-poll-lock:#{@dropbox_uid}", "LOCK", "PX", @DropboxWebhookHandler.POLL_DELAY_IN_MS, "NX")
  73. .should.equal true
  74. it "should return the callback after the delay with shouldPoll=true", ->
  75. @shouldPoll.should.equal true
  76. expect(@end - @start).to.be.at.least(@DropboxWebhookHandler.POLL_DELAY_IN_MS)
  77. describe "when someone else is already polling", ->
  78. beforeEach ->
  79. @rclient.set = sinon.stub().callsArgWith(5, null, null)
  80. @DropboxWebhookHandler._delayAndBatchPoll @dropbox_uid, @callback
  81. it "should return the callback immediately with shouldPoll=false", ->
  82. @callback.calledWith(null, false).should.equal true