ProjectStructureTests.coffee 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. async = require "async"
  2. expect = require("chai").expect
  3. mkdirp = require "mkdirp"
  4. ObjectId = require("mongojs").ObjectId
  5. Path = require "path"
  6. fs = require "fs"
  7. Settings = require "settings-sharelatex"
  8. _ = require "underscore"
  9. ProjectGetter = require "../../../app/js/Features/Project/ProjectGetter.js"
  10. MockDocUpdaterApi = require './helpers/MockDocUpdaterApi'
  11. MockFileStoreApi = require './helpers/MockFileStoreApi'
  12. MockProjectHistoryApi = require './helpers/MockProjectHistoryApi'
  13. request = require "./helpers/request"
  14. User = require "./helpers/User"
  15. describe "ProjectStructureChanges", ->
  16. before (done) ->
  17. @owner = new User()
  18. @owner.login done
  19. describe "creating a project from the example template", ->
  20. before (done) ->
  21. MockDocUpdaterApi.clearProjectStructureUpdates()
  22. @owner.createProject "example-project", {template: "example"}, (error, project_id) =>
  23. throw error if error?
  24. @example_project_id = project_id
  25. done()
  26. it "should version creating a doc", ->
  27. updates = MockDocUpdaterApi.getProjectStructureUpdates(@example_project_id).docUpdates
  28. expect(updates.length).to.equal(2)
  29. _.each updates, (update) =>
  30. expect(update.userId).to.equal(@owner._id)
  31. expect(update.docLines).to.be.a('string')
  32. expect(_.where(updates, pathname: "/main.tex").length).to.equal 1
  33. expect(_.where(updates, pathname: "/references.bib").length).to.equal 1
  34. it "should version creating a file", ->
  35. updates = MockDocUpdaterApi.getProjectStructureUpdates(@example_project_id).fileUpdates
  36. expect(updates.length).to.equal(1)
  37. update = updates[0]
  38. expect(update.userId).to.equal(@owner._id)
  39. expect(update.pathname).to.equal("/universe.jpg")
  40. expect(update.url).to.be.a('string');
  41. describe "duplicating a project", ->
  42. before (done) ->
  43. MockDocUpdaterApi.clearProjectStructureUpdates()
  44. @owner.request.post {
  45. uri: "/Project/#{@example_project_id}/clone",
  46. json:
  47. projectName: 'new.tex'
  48. }, (error, res, body) =>
  49. throw error if error?
  50. if res.statusCode < 200 || res.statusCode >= 300
  51. throw new Error("failed to add doc #{res.statusCode}")
  52. @dup_project_id = body.project_id
  53. done()
  54. it "should version the dosc created", ->
  55. updates = MockDocUpdaterApi.getProjectStructureUpdates(@dup_project_id).docUpdates
  56. expect(updates.length).to.equal(2)
  57. _.each updates, (update) =>
  58. expect(update.userId).to.equal(@owner._id)
  59. expect(update.docLines).to.be.a('string')
  60. expect(_.where(updates, pathname: "/main.tex").length).to.equal(1)
  61. expect(_.where(updates, pathname: "/references.bib").length).to.equal(1)
  62. it "should version the files created", ->
  63. updates = MockDocUpdaterApi.getProjectStructureUpdates(@dup_project_id).fileUpdates
  64. expect(updates.length).to.equal(1)
  65. update = updates[0]
  66. expect(update.userId).to.equal(@owner._id)
  67. expect(update.pathname).to.equal("/universe.jpg")
  68. expect(update.url).to.be.a('string');
  69. describe "adding a doc", ->
  70. before (done) ->
  71. MockDocUpdaterApi.clearProjectStructureUpdates()
  72. ProjectGetter.getProject @example_project_id, (error, projects) =>
  73. throw error if error?
  74. @owner.request.post {
  75. uri: "project/#{@example_project_id}/doc",
  76. json:
  77. name: 'new.tex'
  78. parent_folder_id: projects[0].rootFolder[0]._id
  79. }, (error, res, body) =>
  80. throw error if error?
  81. if res.statusCode < 200 || res.statusCode >= 300
  82. throw new Error("failed to add doc #{res.statusCode}")
  83. done()
  84. it "should version the doc added", ->
  85. updates = MockDocUpdaterApi.getProjectStructureUpdates(@example_project_id).docUpdates
  86. expect(updates.length).to.equal(1)
  87. update = updates[0]
  88. expect(update.userId).to.equal(@owner._id)
  89. expect(update.pathname).to.equal("/new.tex")
  90. expect(update.docLines).to.be.a('string');
  91. describe "uploading a project", ->
  92. before (done) ->
  93. MockDocUpdaterApi.clearProjectStructureUpdates()
  94. zip_file = fs.createReadStream(Path.resolve(__dirname + '/../files/test_project.zip'))
  95. req = @owner.request.post {
  96. uri: "project/new/upload",
  97. formData:
  98. qqfile: zip_file
  99. }, (error, res, body) =>
  100. throw error if error?
  101. if res.statusCode < 200 || res.statusCode >= 300
  102. throw new Error("failed to upload project #{res.statusCode}")
  103. @uploaded_project_id = JSON.parse(body).project_id
  104. done()
  105. it "should version the dosc created", ->
  106. updates = MockDocUpdaterApi.getProjectStructureUpdates(@uploaded_project_id).docUpdates
  107. expect(updates.length).to.equal(1)
  108. update = updates[0]
  109. expect(update.userId).to.equal(@owner._id)
  110. expect(update.pathname).to.equal("/main.tex")
  111. expect(update.docLines).to.equal("Test")
  112. it "should version the files created", ->
  113. updates = MockDocUpdaterApi.getProjectStructureUpdates(@uploaded_project_id).fileUpdates
  114. expect(updates.length).to.equal(1)
  115. update = updates[0]
  116. expect(update.userId).to.equal(@owner._id)
  117. expect(update.pathname).to.equal("/1pixel.png")
  118. expect(update.url).to.be.a('string');
  119. describe "uploading a file", ->
  120. before (done) ->
  121. ProjectGetter.getProject @example_project_id, (error, projects) =>
  122. throw error if error?
  123. @root_folder_id = projects[0].rootFolder[0]._id.toString()
  124. done()
  125. beforeEach () ->
  126. MockDocUpdaterApi.clearProjectStructureUpdates()
  127. it "should version a newly uploaded file", (done) ->
  128. image_file = fs.createReadStream(Path.resolve(__dirname + '/../files/1pixel.png'))
  129. req = @owner.request.post {
  130. uri: "project/#{@example_project_id}/upload",
  131. qs:
  132. folder_id: @root_folder_id
  133. formData:
  134. qqfile:
  135. value: image_file
  136. options:
  137. filename: '1pixel.png',
  138. contentType: 'image/png'
  139. }, (error, res, body) =>
  140. throw error if error?
  141. if res.statusCode < 200 || res.statusCode >= 300
  142. throw new Error("failed to upload file #{res.statusCode}")
  143. updates = MockDocUpdaterApi.getProjectStructureUpdates(@example_project_id).fileUpdates
  144. expect(updates.length).to.equal(1)
  145. update = updates[0]
  146. expect(update.userId).to.equal(@owner._id)
  147. expect(update.pathname).to.equal("/1pixel.png")
  148. expect(update.url).to.be.a('string');
  149. @original_file_url = update.url
  150. done()
  151. it "should version a replacement file", (done) ->
  152. image_file = fs.createReadStream(Path.resolve(__dirname + '/../files/2pixel.png'))
  153. req = @owner.request.post {
  154. uri: "project/#{@example_project_id}/upload",
  155. qs:
  156. folder_id: @root_folder_id
  157. formData:
  158. qqfile:
  159. value: image_file
  160. options:
  161. filename: '1pixel.png',
  162. contentType: 'image/png'
  163. }, (error, res, body) =>
  164. throw error if error?
  165. if res.statusCode < 200 || res.statusCode >= 300
  166. throw new Error("failed to upload file #{res.statusCode}")
  167. updates = MockDocUpdaterApi.getProjectStructureUpdates(@example_project_id).fileUpdates
  168. expect(updates.length).to.equal(1)
  169. update = updates[0]
  170. expect(update.userId).to.equal(@owner._id)
  171. expect(update.pathname).to.equal("/1pixel.png")
  172. expect(update.url).to.be.a('string');
  173. done()
  174. describe "tpds", ->
  175. before (done) ->
  176. @tpds_project_name = "tpds-project-#{new ObjectId().toString()}"
  177. @owner.createProject @tpds_project_name, (error, project_id) =>
  178. throw error if error?
  179. @tpds_project_id = project_id
  180. mkdirp Settings.path.dumpFolder, done
  181. beforeEach () ->
  182. MockDocUpdaterApi.clearProjectStructureUpdates()
  183. it "should version adding a doc", (done) ->
  184. tex_file = fs.createReadStream(Path.resolve(__dirname + '/../files/test.tex'))
  185. req = @owner.request.post {
  186. uri: "/user/#{@owner._id}/update/#{@tpds_project_name}/test.tex",
  187. auth:
  188. user: _.keys(Settings.httpAuthUsers)[0]
  189. pass: _.values(Settings.httpAuthUsers)[0]
  190. sendImmediately: true
  191. }
  192. tex_file.on "error", (err) ->
  193. throw err
  194. req.on "error", (err) ->
  195. throw err
  196. req.on "response", (res) =>
  197. if res.statusCode < 200 || res.statusCode >= 300
  198. throw new Error("failed to upload file #{res.statusCode}")
  199. updates = MockDocUpdaterApi.getProjectStructureUpdates(@tpds_project_id).docUpdates
  200. expect(updates.length).to.equal(1)
  201. update = updates[0]
  202. expect(update.userId).to.equal(@owner._id)
  203. expect(update.pathname).to.equal("/test.tex")
  204. expect(update.docLines).to.equal("Test")
  205. done()
  206. tex_file.pipe(req)
  207. it "should version adding a new file", (done) ->
  208. image_file = fs.createReadStream(Path.resolve(__dirname + '/../files/1pixel.png'))
  209. req = @owner.request.post {
  210. uri: "/user/#{@owner._id}/update/#{@tpds_project_name}/1pixel.png",
  211. auth:
  212. user: _.keys(Settings.httpAuthUsers)[0]
  213. pass: _.values(Settings.httpAuthUsers)[0]
  214. sendImmediately: true
  215. }
  216. image_file.on "error", (err) ->
  217. throw err
  218. req.on "error", (err) ->
  219. throw err
  220. req.on "response", (res) =>
  221. if res.statusCode < 200 || res.statusCode >= 300
  222. throw new Error("failed to upload file #{res.statusCode}")
  223. updates = MockDocUpdaterApi.getProjectStructureUpdates(@tpds_project_id).fileUpdates
  224. expect(updates.length).to.equal(1)
  225. update = updates[0]
  226. expect(update.userId).to.equal(@owner._id)
  227. expect(update.pathname).to.equal("/1pixel.png")
  228. expect(update.url).to.be.a('string');
  229. done()
  230. image_file.pipe(req)
  231. it "should version replacing a file", (done) ->
  232. image_file = fs.createReadStream(Path.resolve(__dirname + '/../files/2pixel.png'))
  233. req = @owner.request.post {
  234. uri: "/user/#{@owner._id}/update/#{@tpds_project_name}/1pixel.png",
  235. auth:
  236. user: _.keys(Settings.httpAuthUsers)[0]
  237. pass: _.values(Settings.httpAuthUsers)[0]
  238. sendImmediately: true
  239. }
  240. image_file.on "error", (err) ->
  241. throw err
  242. req.on "error", (err) ->
  243. throw err
  244. req.on "response", (res) =>
  245. if res.statusCode < 200 || res.statusCode >= 300
  246. throw new Error("failed to upload file #{res.statusCode}")
  247. updates = MockDocUpdaterApi.getProjectStructureUpdates(@tpds_project_id).fileUpdates
  248. expect(updates.length).to.equal(1)
  249. update = updates[0]
  250. expect(update.userId).to.equal(@owner._id)
  251. expect(update.pathname).to.equal("/1pixel.png")
  252. expect(update.url).to.be.a('string');
  253. done()
  254. image_file.pipe(req)