LinkedFilesTests.coffee 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. async = require "async"
  2. expect = require("chai").expect
  3. _ = require 'underscore'
  4. mkdirp = require "mkdirp"
  5. Settings = require "settings-sharelatex"
  6. MockFileStoreApi = require './helpers/MockFileStoreApi'
  7. request = require "./helpers/request"
  8. User = require "./helpers/User"
  9. express = require("express")
  10. LinkedUrlProxy = express()
  11. LinkedUrlProxy.get "/", (req, res, next) =>
  12. if req.query.url == 'http://example.com/foo'
  13. res.send('foo foo foo')
  14. else if req.query.url == 'http://example.com/bar'
  15. res.send('bar bar bar')
  16. else
  17. res.sendStatus(404)
  18. describe "LinkedFiles", ->
  19. before (done) ->
  20. LinkedUrlProxy.listen 6543, (error) =>
  21. return done(error) if error?
  22. @owner = new User()
  23. @owner.login ->
  24. mkdirp Settings.path.dumpFolder, done
  25. describe "creating a project linked file", ->
  26. before (done) ->
  27. @source_doc_name = 'test.txt'
  28. async.series [
  29. (cb) =>
  30. @owner.createProject 'plf-test-one', {template: 'blank'}, (error, project_id) =>
  31. @project_one_id = project_id
  32. cb(error)
  33. (cb) =>
  34. @owner.getProject @project_one_id, (error, project) =>
  35. @project_one = project
  36. @project_one_root_folder_id = project.rootFolder[0]._id.toString()
  37. cb(error)
  38. (cb) =>
  39. @owner.createProject 'plf-test-two', {template: 'blank'}, (error, project_id) =>
  40. @project_two_id = project_id
  41. cb(error)
  42. (cb) =>
  43. @owner.getProject @project_two_id, (error, project) =>
  44. @project_two = project
  45. @project_two_root_folder_id = project.rootFolder[0]._id.toString()
  46. cb(error)
  47. (cb) =>
  48. @owner.createDocInProject @project_two_id,
  49. @project_two_root_folder_id,
  50. @source_doc_name,
  51. (error, doc_id) =>
  52. @source_doc_id = doc_id
  53. cb(error)
  54. ], done
  55. it 'should import a file from the source project', (done) ->
  56. @owner.request.post {
  57. url: "/project/#{@project_one_id}/linked_file",
  58. json:
  59. name: 'test-link.txt',
  60. parent_folder_id: @project_one_root_folder_id,
  61. provider: 'project_file',
  62. data:
  63. source_project_id: @project_two_id,
  64. source_entity_path: "/#{@source_doc_name}",
  65. source_project_display_name: "Project Two"
  66. }, (error, response, body) =>
  67. new_file_id = body.new_file_id
  68. @existing_file_id = new_file_id
  69. expect(new_file_id).to.exist
  70. @owner.getProject @project_one_id, (error, project) =>
  71. return done(error) if error?
  72. firstFile = project.rootFolder[0].fileRefs[0]
  73. expect(firstFile._id.toString()).to.equal(new_file_id.toString())
  74. expect(firstFile.name).to.equal('test-link.txt')
  75. done()
  76. it 'should refresh the file', (done) ->
  77. @owner.request.post {
  78. url: "/project/#{@project_one_id}/linked_file",
  79. json:
  80. name: 'test-link.txt',
  81. parent_folder_id: @project_one_root_folder_id,
  82. provider: 'project_file',
  83. data:
  84. source_project_id: @project_two_id,
  85. source_entity_path: "/#{@source_doc_name}",
  86. source_project_display_name: "Project Two"
  87. }, (error, response, body) =>
  88. new_file_id = body.new_file_id
  89. expect(new_file_id).to.exist
  90. expect(new_file_id).to.not.equal @existing_file_id
  91. @owner.getProject @project_one_id, (error, project) =>
  92. return done(error) if error?
  93. firstFile = project.rootFolder[0].fileRefs[0]
  94. expect(firstFile._id.toString()).to.equal(new_file_id.toString())
  95. expect(firstFile.name).to.equal('test-link.txt')
  96. done()
  97. describe "creating a URL based linked file", ->
  98. before (done) ->
  99. @owner.createProject "url-linked-files-project", {template: "blank"}, (error, project_id) =>
  100. throw error if error?
  101. @project_id = project_id
  102. @owner.getProject project_id, (error, project) =>
  103. throw error if error?
  104. @project = project
  105. @root_folder_id = project.rootFolder[0]._id.toString()
  106. done()
  107. it "should download the URL and create a file with the contents and linkedFileData", (done) ->
  108. @owner.request.post {
  109. url: "/project/#{@project_id}/linked_file",
  110. json:
  111. provider: 'url'
  112. data: {
  113. url: 'http://example.com/foo'
  114. }
  115. parent_folder_id: @root_folder_id
  116. name: 'url-test-file-1'
  117. }, (error, response, body) =>
  118. throw error if error?
  119. expect(response.statusCode).to.equal 200
  120. @owner.getProject @project_id, (error, project) =>
  121. throw error if error?
  122. file = project.rootFolder[0].fileRefs[0]
  123. expect(file.linkedFileData).to.deep.equal({
  124. provider: 'url'
  125. url: 'http://example.com/foo'
  126. })
  127. @owner.request.get "/project/#{@project_id}/file/#{file._id}", (error, response, body) ->
  128. throw error if error?
  129. expect(response.statusCode).to.equal 200
  130. expect(body).to.equal "foo foo foo"
  131. done()
  132. it "should replace and update a URL based linked file", (done) ->
  133. @owner.request.post {
  134. url: "/project/#{@project_id}/linked_file",
  135. json:
  136. provider: 'url'
  137. data: {
  138. url: 'http://example.com/foo'
  139. }
  140. parent_folder_id: @root_folder_id
  141. name: 'url-test-file-2'
  142. }, (error, response, body) =>
  143. throw error if error?
  144. expect(response.statusCode).to.equal 200
  145. @owner.request.post {
  146. url: "/project/#{@project_id}/linked_file",
  147. json:
  148. provider: 'url'
  149. data: {
  150. url: 'http://example.com/bar'
  151. }
  152. parent_folder_id: @root_folder_id
  153. name: 'url-test-file-2'
  154. }, (error, response, body) =>
  155. throw error if error?
  156. expect(response.statusCode).to.equal 200
  157. @owner.getProject @project_id, (error, project) =>
  158. throw error if error?
  159. file = project.rootFolder[0].fileRefs[1]
  160. expect(file.linkedFileData).to.deep.equal({
  161. provider: 'url'
  162. url: 'http://example.com/bar'
  163. })
  164. @owner.request.get "/project/#{@project_id}/file/#{file._id}", (error, response, body) ->
  165. throw error if error?
  166. expect(response.statusCode).to.equal 200
  167. expect(body).to.equal "bar bar bar"
  168. done()
  169. it "should return an error if the URL does not succeed", (done) ->
  170. @owner.request.post {
  171. url: "/project/#{@project_id}/linked_file",
  172. json:
  173. provider: 'url'
  174. data: {
  175. url: 'http://example.com/does-not-exist'
  176. }
  177. parent_folder_id: @root_folder_id
  178. name: 'url-test-file-3'
  179. }, (error, response, body) =>
  180. throw error if error?
  181. expect(response.statusCode).to.equal 422 # unprocessable
  182. expect(body).to.equal(
  183. "Your URL could not be reached (404 status code). Please check it and try again."
  184. )
  185. done()
  186. it "should return an error if the URL is invalid", (done) ->
  187. @owner.request.post {
  188. url: "/project/#{@project_id}/linked_file",
  189. json:
  190. provider: 'url'
  191. data: {
  192. url: "!^$%"
  193. }
  194. parent_folder_id: @root_folder_id
  195. name: 'url-test-file-4'
  196. }, (error, response, body) =>
  197. throw error if error?
  198. expect(response.statusCode).to.equal 422 # unprocessable
  199. expect(body).to.equal(
  200. "Your URL is not valid. Please check it and try again."
  201. )
  202. done()
  203. it "should return an error if the URL uses a non-http protocol", (done) ->
  204. @owner.request.post {
  205. url: "/project/#{@project_id}/linked_file",
  206. json:
  207. provider: 'url'
  208. data: {
  209. url: "ftp://localhost"
  210. }
  211. parent_folder_id: @root_folder_id
  212. name: 'url-test-file-5'
  213. }, (error, response, body) =>
  214. throw error if error?
  215. expect(response.statusCode).to.equal 422 # unprocessable
  216. expect(body).to.equal(
  217. "Your URL is not valid. Please check it and try again."
  218. )
  219. done()
  220. it "should accept a URL withuot a leading http://, and add it", (done) ->
  221. @owner.request.post {
  222. url: "/project/#{@project_id}/linked_file",
  223. json:
  224. provider: 'url'
  225. data: {
  226. url: 'example.com/foo'
  227. }
  228. parent_folder_id: @root_folder_id
  229. name: 'url-test-file-6'
  230. }, (error, response, body) =>
  231. throw error if error?
  232. expect(response.statusCode).to.equal 200
  233. @owner.getProject @project_id, (error, project) =>
  234. throw error if error?
  235. file = _.find project.rootFolder[0].fileRefs, (file) ->
  236. file.name == 'url-test-file-6'
  237. expect(file.linkedFileData).to.deep.equal({
  238. provider: 'url'
  239. url: 'http://example.com/foo'
  240. })
  241. @owner.request.get "/project/#{@project_id}/file/#{file._id}", (error, response, body) ->
  242. throw error if error?
  243. expect(response.statusCode).to.equal 200
  244. expect(body).to.equal "foo foo foo"
  245. done()
  246. # TODO: Add test for asking for host that return ENOTFOUND
  247. # (This will probably end up handled by the proxy)