ProjectDetailsHandlerTests.coffee 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. should = require('chai').should()
  2. modulePath = "../../../../app/js/Features/Project/ProjectDetailsHandler"
  3. Errors = require "../../../../app/js/Features/Errors/Errors"
  4. SandboxedModule = require('sandboxed-module')
  5. sinon = require('sinon')
  6. assert = require("chai").assert
  7. expect = require("chai").expect
  8. require('chai').should()
  9. describe 'ProjectDetailsHandler', ->
  10. beforeEach ->
  11. @project_id = "321l3j1kjkjl"
  12. @user_id = "user-id-123"
  13. @project =
  14. name: "project"
  15. description: "this is a great project"
  16. something:"should not exist"
  17. compiler: "latexxxxxx"
  18. owner_ref: @user_id
  19. @user =
  20. features: "mock-features"
  21. @ProjectGetter =
  22. getProjectWithoutDocLines: sinon.stub().callsArgWith(1, null, @project)
  23. getProject: sinon.stub().callsArgWith(2, null, @project)
  24. @ProjectModel =
  25. update: sinon.stub()
  26. findOne: sinon.stub()
  27. @UserGetter =
  28. getUser: sinon.stub().callsArgWith(1, null, @user)
  29. @tpdsUpdateSender =
  30. moveEntity:sinon.stub().callsArgWith 1
  31. @handler = SandboxedModule.require modulePath, requires:
  32. "./ProjectGetter":@ProjectGetter
  33. '../../models/Project': Project:@ProjectModel
  34. "../User/UserGetter": @UserGetter
  35. '../ThirdPartyDataStore/TpdsUpdateSender':@tpdsUpdateSender
  36. 'logger-sharelatex':
  37. log:->
  38. err:->
  39. describe "getDetails", ->
  40. it "should find the project and owner", (done)->
  41. @handler.getDetails @project_id, (err, details)=>
  42. details.name.should.equal @project.name
  43. details.description.should.equal @project.description
  44. details.compiler.should.equal @project.compiler
  45. details.features.should.equal @user.features
  46. assert.equal(details.something, undefined)
  47. done()
  48. it "should find overleaf metadata if it exists", (done)->
  49. @project.overleaf = { id: 'id' }
  50. @handler.getDetails @project_id, (err, details)=>
  51. details.overleaf.should.equal @project.overleaf
  52. assert.equal(details.something, undefined)
  53. done()
  54. it "should return an error for a non-existent project", (done)->
  55. @ProjectGetter.getProject.callsArg(2, null, null)
  56. err = new Errors.NotFoundError("project not found")
  57. @handler.getDetails "0123456789012345678901234", (error, details) =>
  58. err.should.eql error
  59. done()
  60. it "should return the error", (done)->
  61. error = "some error"
  62. @ProjectGetter.getProject.callsArgWith(2, error)
  63. @handler.getDetails @project_id, (err)=>
  64. err.should.equal error
  65. done()
  66. describe "getProjectDescription", ->
  67. it "should make a call to mongo just for the description", (done)->
  68. @ProjectModel.findOne.callsArgWith(2)
  69. @handler.getProjectDescription @project_id, (err, description)=>
  70. @ProjectModel.findOne.calledWith({_id:@project_id}, "description").should.equal true
  71. done()
  72. it "should return what the mongo call returns", (done)->
  73. err = "error"
  74. description = "cool project"
  75. @ProjectModel.findOne.callsArgWith(2, err, {description:description})
  76. @handler.getProjectDescription @project_id, (returnedErr, returnedDescription)=>
  77. err.should.equal returnedErr
  78. description.should.equal returnedDescription
  79. done()
  80. describe "setProjectDescription", ->
  81. beforeEach ->
  82. @description = "updated teh description"
  83. it "should update the project detials", (done)->
  84. @ProjectModel.update.callsArgWith(2)
  85. @handler.setProjectDescription @project_id, @description, =>
  86. @ProjectModel.update.calledWith({_id:@project_id}, {description:@description}).should.equal true
  87. done()
  88. describe "renameProject", ->
  89. beforeEach ->
  90. @handler.validateProjectName = sinon.stub().yields()
  91. @ProjectModel.update.callsArgWith(2)
  92. @newName = "new name here"
  93. it "should update the project with the new name", (done)->
  94. newName = "new name here"
  95. @handler.renameProject @project_id, @newName, =>
  96. @ProjectModel.update.calledWith({_id: @project_id}, {name: @newName}).should.equal true
  97. done()
  98. it "should tell the tpdsUpdateSender", (done)->
  99. @handler.renameProject @project_id, @newName, =>
  100. @tpdsUpdateSender.moveEntity.calledWith({project_id:@project_id, project_name:@project.name, newProjectName:@newName}).should.equal true
  101. done()
  102. it "should not do anything with an invalid name", (done) ->
  103. @handler.validateProjectName = sinon.stub().yields(new Error("invalid name"))
  104. @handler.renameProject @project_id, @newName, =>
  105. @tpdsUpdateSender.moveEntity.called.should.equal false
  106. @ProjectModel.update.called.should.equal false
  107. done()
  108. describe "validateProjectName", ->
  109. it "should reject undefined names", (done) ->
  110. @handler.validateProjectName undefined, (error) ->
  111. expect(error).to.exist
  112. done()
  113. it "should reject empty names", (done) ->
  114. @handler.validateProjectName "", (error) ->
  115. expect(error).to.exist
  116. done()
  117. it "should reject empty names with /s", (done) ->
  118. @handler.validateProjectName "foo/bar", (error) ->
  119. expect(error).to.exist
  120. done()
  121. it "should reject long names", (done) ->
  122. @handler.validateProjectName new Array(1000).join("a"), (error) ->
  123. expect(error).to.exist
  124. done()
  125. it "should accept normal names", (done) ->
  126. @handler.validateProjectName "foobar", (error) ->
  127. expect(error).to.not.exist
  128. done()
  129. describe "setPublicAccessLevel", ->
  130. beforeEach ->
  131. @ProjectModel.update.callsArgWith(2)
  132. @accessLevel = "readOnly"
  133. it "should update the project with the new level", (done)->
  134. @handler.setPublicAccessLevel @project_id, @accessLevel, =>
  135. @ProjectModel.update.calledWith({_id: @project_id}, {publicAccesLevel: @accessLevel}).should.equal true
  136. done()