ProjectEditorHandlerTests.coffee 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. chai = require('chai')
  2. expect = chai.expect
  3. should = chai.should()
  4. modulePath = "../../../../app/js/Features/Project/ProjectEditorHandler"
  5. SandboxedModule = require('sandboxed-module')
  6. describe "ProjectEditorHandler", ->
  7. beforeEach ->
  8. @project =
  9. _id : "project-id"
  10. name : "Project Name"
  11. rootDoc_id : "file-id"
  12. publicAccesLevel : "private"
  13. deletedByExternalDataSource: false
  14. rootFolder : [{
  15. _id : "root-folder-id"
  16. name : ""
  17. docs : []
  18. fileRefs : []
  19. folders : [{
  20. _id : "sub-folder-id"
  21. name : "folder"
  22. docs : [{
  23. _id : "doc-id"
  24. name : "main.tex"
  25. lines : @lines = [
  26. "line 1"
  27. "line 2"
  28. "line 3"
  29. ]
  30. }]
  31. fileRefs : [{
  32. _id : "file-id"
  33. name : "image.png"
  34. created : new Date()
  35. size : 1234
  36. }]
  37. folders : []
  38. }]
  39. }]
  40. deletedDocs: [{
  41. _id: "deleted-doc-id"
  42. name: "main.tex"
  43. }]
  44. @members = [{
  45. user: @owner = {
  46. _id: "owner-id"
  47. first_name : "Owner"
  48. last_name : "ShareLaTeX"
  49. email : "owner@sharelatex.com"
  50. },
  51. privilegeLevel: "owner"
  52. },{
  53. user: {
  54. _id: "read-only-id"
  55. first_name : "Read"
  56. last_name : "Only"
  57. email : "read-only@sharelatex.com"
  58. },
  59. privilegeLevel: "readOnly"
  60. },{
  61. user: {
  62. _id: "read-write-id"
  63. first_name : "Read"
  64. last_name : "Write"
  65. email : "read-write@sharelatex.com"
  66. },
  67. privilegeLevel: "readAndWrite"
  68. }]
  69. @tokenMembers = [{
  70. user: {
  71. _id: "token-read-only-id"
  72. first_name : "TRead"
  73. last_name : "TOnly"
  74. email : "token-read-only@sharelatex.com"
  75. },
  76. privilegeLevel: "readOnly"
  77. }]
  78. @invites = [
  79. {_id: "invite_one", email: "user-one@example.com", privileges: "readOnly", projectId: @project._id}
  80. {_id: "invite_two", email: "user-two@example.com", privileges: "readOnly", projectId: @project._id}
  81. ]
  82. @handler = SandboxedModule.require modulePath
  83. describe "buildProjectModelView", ->
  84. describe "with owner and members included", ->
  85. beforeEach ->
  86. @result = @handler.buildProjectModelView @project, @members, @invites, @tokenMembers
  87. it "should include the id", ->
  88. should.exist @result._id
  89. @result._id.should.equal "project-id"
  90. it "should include the name", ->
  91. should.exist @result.name
  92. @result.name.should.equal "Project Name"
  93. it "should include the root doc id", ->
  94. should.exist @result.rootDoc_id
  95. @result.rootDoc_id.should.equal "file-id"
  96. it "should include the public access level", ->
  97. should.exist @result.publicAccesLevel
  98. @result.publicAccesLevel.should.equal "private"
  99. it "should include the owner", ->
  100. should.exist @result.owner
  101. @result.owner._id.should.equal "owner-id"
  102. @result.owner.email.should.equal "owner@sharelatex.com"
  103. @result.owner.first_name.should.equal "Owner"
  104. @result.owner.last_name.should.equal "ShareLaTeX"
  105. @result.owner.privileges.should.equal "owner"
  106. it "should include the deletedDocs", ->
  107. should.exist @result.deletedDocs
  108. @result.deletedDocs.should.equal @project.deletedDocs
  109. it "should gather readOnly_refs and collaberators_refs into a list of members", ->
  110. findMember = (id) =>
  111. for member in @result.members
  112. return member if member._id == id
  113. return null
  114. @result.members.length.should.equal 2
  115. should.exist findMember("read-only-id")
  116. findMember("read-only-id").privileges.should.equal "readOnly"
  117. findMember("read-only-id").first_name.should.equal "Read"
  118. findMember("read-only-id").last_name.should.equal "Only"
  119. findMember("read-only-id").email.should.equal "read-only@sharelatex.com"
  120. should.exist findMember("read-write-id")
  121. findMember("read-write-id").privileges.should.equal "readAndWrite"
  122. findMember("read-write-id").first_name.should.equal "Read"
  123. findMember("read-write-id").last_name.should.equal "Write"
  124. findMember("read-write-id").email.should.equal "read-write@sharelatex.com"
  125. it 'should include a list of tokenMembers', ->
  126. @result.tokenMembers.length.should.equal 1
  127. @result.tokenMembers[0]._id.should.equal @tokenMembers[0].user._id
  128. it "should include folders in the project", ->
  129. @result.rootFolder[0]._id.should.equal "root-folder-id"
  130. @result.rootFolder[0].name.should.equal ""
  131. @result.rootFolder[0].folders[0]._id.should.equal "sub-folder-id"
  132. @result.rootFolder[0].folders[0].name.should.equal "folder"
  133. it "should not duplicate folder contents", ->
  134. @result.rootFolder[0].docs.length.should.equal 0
  135. @result.rootFolder[0].fileRefs.length.should.equal 0
  136. it "should include files in the project", ->
  137. @result.rootFolder[0].folders[0].fileRefs[0]._id.should.equal "file-id"
  138. @result.rootFolder[0].folders[0].fileRefs[0].name.should.equal "image.png"
  139. should.not.exist @result.rootFolder[0].folders[0].fileRefs[0].created
  140. should.not.exist @result.rootFolder[0].folders[0].fileRefs[0].size
  141. it "should include docs in the project but not the lines", ->
  142. @result.rootFolder[0].folders[0].docs[0]._id.should.equal "doc-id"
  143. @result.rootFolder[0].folders[0].docs[0].name.should.equal "main.tex"
  144. should.not.exist @result.rootFolder[0].folders[0].docs[0].lines
  145. it 'should include invites', ->
  146. should.exist @result.invites
  147. @result.invites.should.deep.equal @invites
  148. describe "deletedByExternalDataSource", ->
  149. it "should set the deletedByExternalDataSource flag to false when it is not there", ->
  150. delete @project.deletedByExternalDataSource
  151. result = @handler.buildProjectModelView @project, @members, [], []
  152. result.deletedByExternalDataSource.should.equal false
  153. it "should set the deletedByExternalDataSource flag to false when it is false", ->
  154. result = @handler.buildProjectModelView @project, @members, [], []
  155. result.deletedByExternalDataSource.should.equal false
  156. it "should set the deletedByExternalDataSource flag to true when it is true", ->
  157. @project.deletedByExternalDataSource = true
  158. result = @handler.buildProjectModelView @project, @members, [], []
  159. result.deletedByExternalDataSource.should.equal true
  160. describe "features", ->
  161. beforeEach ->
  162. @owner.features =
  163. versioning: true
  164. collaborators: 3
  165. compileGroup:"priority"
  166. compileTimeout: 96
  167. @result = @handler.buildProjectModelView @project, @members, [], []
  168. it "should copy the owner features to the project", ->
  169. @result.features.versioning.should.equal @owner.features.versioning
  170. @result.features.collaborators.should.equal @owner.features.collaborators
  171. @result.features.compileGroup.should.equal @owner.features.compileGroup
  172. @result.features.compileTimeout.should.equal @owner.features.compileTimeout
  173. describe 'buildOwnerAndMembersViews', ->
  174. beforeEach ->
  175. @owner.features =
  176. versioning: true
  177. collaborators: 3
  178. compileGroup:"priority"
  179. compileTimeout: 22
  180. @result = @handler.buildOwnerAndMembersViews @members, @tokenMembers
  181. it 'should produce an object with the right keys', ->
  182. expect(@result).to.have.all.keys ['owner', 'ownerFeatures', 'members', 'tokenMembers']
  183. it 'should separate the owner from the members', ->
  184. @result.members.length.should.equal(@members.length-1)
  185. expect(@result.owner._id).to.equal @owner._id
  186. expect(@result.owner.email).to.equal @owner.email
  187. expect(@result.members.filter((m) => m._id == @owner._id).length).to.equal 0
  188. it 'should include a list of tokenMembers', ->
  189. @result.tokenMembers.length.should.equal 1
  190. @result.tokenMembers[0]._id.should.equal @tokenMembers[0].user._id
  191. it 'should extract the ownerFeatures from the owner object', ->
  192. expect(@result.ownerFeatures).to.deep.equal @owner.features
  193. describe 'when there is no owner', ->
  194. beforeEach ->
  195. # remove the owner from members list
  196. @membersWithoutOwner = @members.filter((m) => m.user._id != @owner._id)
  197. @result = @handler.buildOwnerAndMembersViews @membersWithoutOwner, @tokenMembers
  198. it 'should produce an object with the right keys', ->
  199. expect(@result).to.have.all.keys ['owner', 'ownerFeatures', 'members', 'tokenMembers']
  200. it 'should not separate out an owner', ->
  201. @result.members.length.should.equal @membersWithoutOwner.length
  202. expect(@result.owner).to.equal null
  203. it 'should not extract the ownerFeatures from the owner object', ->
  204. expect(@result.ownerFeatures).to.equal null