TpdsUpdateSenderTests.coffee 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. SandboxedModule = require('sandboxed-module')
  2. assert = require('assert')
  3. require('chai').should()
  4. modulePath = require('path').join __dirname, '../../../../app/js/Features/ThirdPartyDataStore/TpdsUpdateSender.js'
  5. sinon = require('sinon')
  6. ath = require('path')
  7. project_id = "project_id_here"
  8. user_id = "user_id_here"
  9. read_only_ref_1 = "read_only_ref_1_id_here"
  10. collaberator_ref_1 = "collaberator_ref_1_here"
  11. project_name = "project_name_here"
  12. thirdPartyDataStoreApiUrl = "http://third-party-json-store.herokuapp.com"
  13. httpUsername = "user"
  14. httpPass = "pass"
  15. siteUrl = "http://www.localhost:3000"
  16. httpAuthSiteUrl = "http://#{httpUsername}:#{httpPass}@www.localhost:3000"
  17. filestoreUrl = "filestore.sharelatex.com"
  18. describe 'TpdsUpdateSender', ->
  19. beforeEach ->
  20. @requestQueuer = (queue, meth, opts, callback)->
  21. project = {owner_ref:user_id}
  22. member_ids = [collaberator_ref_1, read_only_ref_1, user_id]
  23. @CollaboratorsHandler =
  24. getMemberIds: sinon.stub().yields(null, member_ids)
  25. @Project = findById:sinon.stub().callsArgWith(2, null, project)
  26. @docstoreUrl = "docstore.sharelatex.env"
  27. @request = sinon.stub().returns(pipe:->)
  28. @settings =
  29. siteUrl:siteUrl
  30. httpAuthSiteUrl:httpAuthSiteUrl,
  31. apis:
  32. thirdPartyDataStore: {url: thirdPartyDataStoreApiUrl}
  33. filestore:
  34. url: filestoreUrl
  35. docstore:
  36. pubUrl: @docstoreUrl
  37. @updateSender = SandboxedModule.require modulePath, requires:
  38. "settings-sharelatex": @settings
  39. "logger-sharelatex":{log:->}
  40. '../../models/Project': Project:@Project
  41. 'request':@request
  42. '../Collaborators/CollaboratorsHandler': @CollaboratorsHandler
  43. "../../infrastructure/Metrics":
  44. inc:->
  45. describe "_enqueue", ->
  46. it "should not call request if there is no tpdsworker url", (done)->
  47. @updateSender._enqueue null, null, null, (err)=>
  48. @request.called.should.equal false
  49. done()
  50. it "should post the message to the tpdsworker", (done)->
  51. @settings.apis.tpdsworker = url:"www.tpdsworker.env"
  52. group = "myproject"
  53. method = "somemethod"
  54. job = "do something"
  55. @request.callsArgWith(1)
  56. @updateSender._enqueue group, method, job, (err)=>
  57. args = @request.args[0][0]
  58. args.json.group.should.equal group
  59. args.json.job.should.equal job
  60. args.json.method.should.equal method
  61. args.uri.should.equal "www.tpdsworker.env/enqueue/web_to_tpds_http_requests"
  62. done()
  63. describe 'sending updates', ->
  64. it 'queues a post the file with user and file id', (done)->
  65. file_id = '4545345'
  66. path = '/some/path/here.jpg'
  67. @updateSender._enqueue = (uid, method, job, callback)->
  68. uid.should.equal project_id
  69. job.method.should.equal "post"
  70. job.streamOrigin.should.equal "#{filestoreUrl}/project/#{project_id}/file/#{file_id}"
  71. expectedUrl = "#{thirdPartyDataStoreApiUrl}/user/#{user_id}/entity/#{encodeURIComponent(project_name)}#{encodeURIComponent(path)}"
  72. job.uri.should.equal expectedUrl
  73. job.headers.sl_all_user_ids.should.eql(JSON.stringify([collaberator_ref_1, read_only_ref_1, user_id]))
  74. done()
  75. @updateSender.addFile {project_id:project_id, file_id:file_id, path:path, project_name:project_name}, ->
  76. it 'post doc with stream origin of docstore', (done)->
  77. doc_id = "4545345"
  78. path = "/some/path/here.tex"
  79. lines = ["line1", "line2", "line3"]
  80. @updateSender._enqueue = (uid, method, job, callback)=>
  81. uid.should.equal project_id
  82. job.method.should.equal "post"
  83. expectedUrl = "#{thirdPartyDataStoreApiUrl}/user/#{user_id}/entity/#{encodeURIComponent(project_name)}#{encodeURIComponent(path)}"
  84. job.uri.should.equal expectedUrl
  85. job.streamOrigin.should.equal "#{@docstoreUrl}/project/#{project_id}/doc/#{doc_id}/raw"
  86. job.headers.sl_all_user_ids.should.eql(JSON.stringify([collaberator_ref_1, read_only_ref_1, user_id]))
  87. done()
  88. @updateSender.addDoc {project_id:project_id, doc_id:doc_id, path:path, docLines:lines,project_name:project_name}
  89. it 'deleting entity', (done)->
  90. path = "/path/here/t.tex"
  91. @updateSender._enqueue = (uid, method, job, callback)->
  92. uid.should.equal project_id
  93. job.method.should.equal "DELETE"
  94. expectedUrl = "#{thirdPartyDataStoreApiUrl}/user/#{user_id}/entity/#{encodeURIComponent(project_name)}#{encodeURIComponent(path)}"
  95. job.headers.sl_all_user_ids.should.eql(JSON.stringify([collaberator_ref_1, read_only_ref_1, user_id]))
  96. job.uri.should.equal expectedUrl
  97. done()
  98. @updateSender.deleteEntity {project_id:project_id, path:path, project_name:project_name}
  99. it 'moving entity', (done)->
  100. startPath = "staring/here/file.tex"
  101. endPath = "ending/here/file.tex"
  102. @updateSender._enqueue = (uid, method, job, callback)->
  103. uid.should.equal project_id
  104. job.method.should.equal "put"
  105. job.uri.should.equal "#{thirdPartyDataStoreApiUrl}/user/#{user_id}/entity"
  106. job.json.startPath.should.equal "/#{project_name}/#{startPath}"
  107. job.json.endPath.should.equal "/#{project_name}/#{endPath}"
  108. job.headers.sl_all_user_ids.should.eql(JSON.stringify([collaberator_ref_1, read_only_ref_1, user_id]))
  109. done()
  110. @updateSender.moveEntity {project_id:project_id, startPath:startPath, endPath:endPath, project_name:project_name}
  111. it 'should be able to rename a project using the move entity func', (done)->
  112. oldProjectName = "/oldProjectName/"
  113. newProjectName = "/newProjectName/"
  114. @updateSender._enqueue = (uid, method, job, callback)->
  115. uid.should.equal project_id
  116. job.method.should.equal "put"
  117. job.uri.should.equal "#{thirdPartyDataStoreApiUrl}/user/#{user_id}/entity"
  118. job.json.startPath.should.equal oldProjectName
  119. job.json.endPath.should.equal newProjectName
  120. job.headers.sl_all_user_ids.should.eql(JSON.stringify([collaberator_ref_1, read_only_ref_1, user_id]))
  121. done()
  122. @updateSender.moveEntity {project_id:project_id, project_name:oldProjectName, newProjectName:newProjectName}
  123. it "pollDropboxForUser", (done) ->
  124. @updateSender._enqueue = sinon.stub().callsArg(3)
  125. @updateSender.pollDropboxForUser user_id, (error) =>
  126. @updateSender._enqueue
  127. .calledWith(
  128. "poll-dropbox:#{user_id}",
  129. "standardHttpRequest",
  130. {
  131. method: "POST"
  132. uri: "#{thirdPartyDataStoreApiUrl}/user/poll"
  133. json:
  134. user_ids: [user_id]
  135. }
  136. )
  137. .should.equal true
  138. done()