RestoringFilesTest.coffee 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. async = require "async"
  2. expect = require("chai").expect
  3. _ = require 'underscore'
  4. fs = require 'fs'
  5. Path = require 'path'
  6. ProjectGetter = require "../../../app/js/Features/Project/ProjectGetter.js"
  7. User = require "./helpers/User"
  8. MockProjectHistoryApi = require "./helpers/MockProjectHistoryApi"
  9. MockDocstoreApi = require "./helpers/MockDocstoreApi"
  10. MockFileStoreApi = require "./helpers/MockFileStoreApi"
  11. describe "RestoringFiles", ->
  12. before (done) ->
  13. @owner = new User()
  14. @owner.login (error) =>
  15. throw error if error?
  16. @owner.createProject "example-project", {template: "example"}, (error, @project_id) =>
  17. throw error if error?
  18. done()
  19. describe "restoring a deleted doc", ->
  20. beforeEach (done) ->
  21. @owner.getProject @project_id, (error, project) =>
  22. throw error if error?
  23. @doc = _.find project.rootFolder[0].docs, (doc) ->
  24. doc.name == 'main.tex'
  25. @owner.request {
  26. method: "DELETE",
  27. url: "/project/#{@project_id}/doc/#{@doc._id}",
  28. }, (error, response, body) =>
  29. throw error if error?
  30. expect(response.statusCode).to.equal 204
  31. @owner.request {
  32. method: "POST",
  33. url: "/project/#{@project_id}/doc/#{@doc._id}/restore"
  34. json:
  35. name: "main.tex"
  36. }, (error, response, body) =>
  37. throw error if error?
  38. expect(response.statusCode).to.equal 200
  39. expect(body.doc_id).to.exist
  40. @restored_doc_id = body.doc_id
  41. done()
  42. it 'should have restored the doc', (done) ->
  43. @owner.getProject @project_id, (error, project) =>
  44. throw error if error?
  45. restored_doc = _.find project.rootFolder[0].docs, (doc) ->
  46. doc.name == 'main.tex'
  47. expect(restored_doc._id.toString()).to.equal @restored_doc_id
  48. expect(@doc._id).to.not.equal @restored_doc_id
  49. # console.log @doc_id, @restored_doc_id, MockDocstoreApi.docs[@project_id]
  50. expect(MockDocstoreApi.docs[@project_id][@restored_doc_id].lines).to.deep.equal(
  51. MockDocstoreApi.docs[@project_id][@doc._id].lines
  52. )
  53. done()
  54. describe "restoring from v2 history", ->
  55. describe "restoring a text file", ->
  56. beforeEach (done) ->
  57. MockProjectHistoryApi.addOldFile(@project_id, 42, "foo.tex", "hello world, this is foo.tex!")
  58. @owner.request {
  59. method: "POST",
  60. url: "/project/#{@project_id}/restore_file",
  61. json:
  62. pathname: "foo.tex"
  63. version: 42
  64. }, (error, response, body) ->
  65. throw error if error?
  66. expect(response.statusCode).to.equal 200
  67. done()
  68. it "should have created a doc", (done) ->
  69. @owner.getProject @project_id, (error, project) =>
  70. throw error if error?
  71. doc = _.find project.rootFolder[0].docs, (doc) ->
  72. doc.name == 'foo.tex'
  73. doc = MockDocstoreApi.docs[@project_id][doc._id]
  74. expect(doc.lines).to.deep.equal [
  75. "hello world, this is foo.tex!"
  76. ]
  77. done()
  78. describe "restoring a binary file", ->
  79. beforeEach (done) ->
  80. @pngData = fs.readFileSync(Path.resolve(__dirname, '../files/1pixel.png'), 'binary')
  81. MockProjectHistoryApi.addOldFile(@project_id, 42, "image.png", @pngData)
  82. @owner.request {
  83. method: "POST",
  84. url: "/project/#{@project_id}/restore_file",
  85. json:
  86. pathname: "image.png"
  87. version: 42
  88. }, (error, response, body) ->
  89. throw error if error?
  90. expect(response.statusCode).to.equal 200
  91. done()
  92. it "should have created a file", (done) ->
  93. @owner.getProject @project_id, (error, project) =>
  94. throw error if error?
  95. file = _.find project.rootFolder[0].fileRefs, (file) ->
  96. file.name == 'image.png'
  97. file = MockFileStoreApi.files[@project_id][file._id]
  98. expect(file.content).to.equal @pngData
  99. done()
  100. describe "restoring to a directory that exists", ->
  101. beforeEach (done) ->
  102. MockProjectHistoryApi.addOldFile(@project_id, 42, "foldername/foo2.tex", "hello world, this is foo-2.tex!")
  103. @owner.request.post {
  104. uri: "project/#{@project_id}/folder",
  105. json:
  106. name: 'foldername'
  107. }, (error, response, body) =>
  108. throw error if error?
  109. expect(response.statusCode).to.equal 200
  110. @owner.request {
  111. method: "POST",
  112. url: "/project/#{@project_id}/restore_file",
  113. json:
  114. pathname: "foldername/foo2.tex"
  115. version: 42
  116. }, (error, response, body) ->
  117. throw error if error?
  118. expect(response.statusCode).to.equal 200
  119. done()
  120. it "should have created the doc in the named folder", (done) ->
  121. @owner.getProject @project_id, (error, project) =>
  122. throw error if error?
  123. folder = _.find project.rootFolder[0].folders, (folder) ->
  124. folder.name == 'foldername'
  125. doc = _.find folder.docs, (doc) ->
  126. doc.name == 'foo2.tex'
  127. doc = MockDocstoreApi.docs[@project_id][doc._id]
  128. expect(doc.lines).to.deep.equal [
  129. "hello world, this is foo-2.tex!"
  130. ]
  131. done()
  132. describe "restoring to a directory that no longer exists", ->
  133. beforeEach (done) ->
  134. MockProjectHistoryApi.addOldFile(@project_id, 42, "nothere/foo3.tex", "hello world, this is foo-3.tex!")
  135. @owner.request {
  136. method: "POST",
  137. url: "/project/#{@project_id}/restore_file",
  138. json:
  139. pathname: "nothere/foo3.tex"
  140. version: 42
  141. }, (error, response, body) ->
  142. throw error if error?
  143. expect(response.statusCode).to.equal 200
  144. done()
  145. it "should have created the folder and restored the doc to it", (done) ->
  146. @owner.getProject @project_id, (error, project) =>
  147. throw error if error?
  148. folder = _.find project.rootFolder[0].folders, (folder) ->
  149. folder.name == 'nothere'
  150. expect(folder).to.exist
  151. doc = _.find folder.docs, (doc) ->
  152. doc.name == 'foo3.tex'
  153. doc = MockDocstoreApi.docs[@project_id][doc._id]
  154. expect(doc.lines).to.deep.equal [
  155. "hello world, this is foo-3.tex!"
  156. ]
  157. done()
  158. describe "restoring to a filename that already exists", ->
  159. beforeEach (done) ->
  160. MockProjectHistoryApi.addOldFile(@project_id, 42, "main.tex", "hello world, this is main.tex!")
  161. @owner.request {
  162. method: "POST",
  163. url: "/project/#{@project_id}/restore_file",
  164. json:
  165. pathname: "main.tex"
  166. version: 42
  167. }, (error, response, body) ->
  168. throw error if error?
  169. expect(response.statusCode).to.equal 200
  170. done()
  171. it "should have created the doc in the root folder", (done) ->
  172. @owner.getProject @project_id, (error, project) =>
  173. throw error if error?
  174. doc = _.find project.rootFolder[0].docs, (doc) ->
  175. doc.name.match(/main \(Restored on/)
  176. expect(doc).to.exist
  177. doc = MockDocstoreApi.docs[@project_id][doc._id]
  178. expect(doc.lines).to.deep.equal [
  179. "hello world, this is main.tex!"
  180. ]
  181. done()