RestoringFilesTest.coffee 6.4 KB

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