LinkedFilesTests.coffee 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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 URL based linked file", ->
  26. before (done) ->
  27. @owner.createProject "url-linked-files-project", {template: "blank"}, (error, project_id) =>
  28. throw error if error?
  29. @project_id = project_id
  30. @owner.getProject project_id, (error, project) =>
  31. throw error if error?
  32. @project = project
  33. @root_folder_id = project.rootFolder[0]._id.toString()
  34. done()
  35. it "should download the URL and create a file with the contents and linkedFileData", (done) ->
  36. @owner.request.post {
  37. url: "/project/#{@project_id}/linked_file",
  38. json:
  39. provider: 'url'
  40. data: {
  41. url: 'http://example.com/foo'
  42. }
  43. parent_folder_id: @root_folder_id
  44. name: 'url-test-file-1'
  45. }, (error, response, body) =>
  46. throw error if error?
  47. expect(response.statusCode).to.equal 204
  48. @owner.getProject @project_id, (error, project) =>
  49. throw error if error?
  50. file = project.rootFolder[0].fileRefs[0]
  51. expect(file.linkedFileData).to.deep.equal({
  52. provider: 'url'
  53. url: 'http://example.com/foo'
  54. })
  55. @owner.request.get "/project/#{@project_id}/file/#{file._id}", (error, response, body) ->
  56. throw error if error?
  57. expect(response.statusCode).to.equal 200
  58. expect(body).to.equal "foo foo foo"
  59. done()
  60. it "should replace and update a URL based linked file", (done) ->
  61. @owner.request.post {
  62. url: "/project/#{@project_id}/linked_file",
  63. json:
  64. provider: 'url'
  65. data: {
  66. url: 'http://example.com/foo'
  67. }
  68. parent_folder_id: @root_folder_id
  69. name: 'url-test-file-2'
  70. }, (error, response, body) =>
  71. throw error if error?
  72. expect(response.statusCode).to.equal 204
  73. @owner.request.post {
  74. url: "/project/#{@project_id}/linked_file",
  75. json:
  76. provider: 'url'
  77. data: {
  78. url: 'http://example.com/bar'
  79. }
  80. parent_folder_id: @root_folder_id
  81. name: 'url-test-file-2'
  82. }, (error, response, body) =>
  83. throw error if error?
  84. expect(response.statusCode).to.equal 204
  85. @owner.getProject @project_id, (error, project) =>
  86. throw error if error?
  87. file = project.rootFolder[0].fileRefs[1]
  88. expect(file.linkedFileData).to.deep.equal({
  89. provider: 'url'
  90. url: 'http://example.com/bar'
  91. })
  92. @owner.request.get "/project/#{@project_id}/file/#{file._id}", (error, response, body) ->
  93. throw error if error?
  94. expect(response.statusCode).to.equal 200
  95. expect(body).to.equal "bar bar bar"
  96. done()
  97. it "should return an error if the URL does not succeed", (done) ->
  98. @owner.request.post {
  99. url: "/project/#{@project_id}/linked_file",
  100. json:
  101. provider: 'url'
  102. data: {
  103. url: 'http://example.com/does-not-exist'
  104. }
  105. parent_folder_id: @root_folder_id
  106. name: 'url-test-file-3'
  107. }, (error, response, body) =>
  108. throw error if error?
  109. expect(response.statusCode).to.equal 422 # unprocessable
  110. expect(body).to.equal(
  111. "Your URL could not be reached (404 status code). Please check it and try again."
  112. )
  113. done()
  114. it "should return an error if the URL is invalid", (done) ->
  115. @owner.request.post {
  116. url: "/project/#{@project_id}/linked_file",
  117. json:
  118. provider: 'url'
  119. data: {
  120. url: "!^$%"
  121. }
  122. parent_folder_id: @root_folder_id
  123. name: 'url-test-file-4'
  124. }, (error, response, body) =>
  125. throw error if error?
  126. expect(response.statusCode).to.equal 422 # unprocessable
  127. expect(body).to.equal(
  128. "Your URL is not valid. Please check it and try again."
  129. )
  130. done()
  131. it "should return an error if the URL uses a non-http protocol", (done) ->
  132. @owner.request.post {
  133. url: "/project/#{@project_id}/linked_file",
  134. json:
  135. provider: 'url'
  136. data: {
  137. url: "ftp://localhost"
  138. }
  139. parent_folder_id: @root_folder_id
  140. name: 'url-test-file-5'
  141. }, (error, response, body) =>
  142. throw error if error?
  143. expect(response.statusCode).to.equal 422 # unprocessable
  144. expect(body).to.equal(
  145. "Your URL is not valid. Please check it and try again."
  146. )
  147. done()
  148. it "should accept a URL withuot a leading http://, and add it", (done) ->
  149. @owner.request.post {
  150. url: "/project/#{@project_id}/linked_file",
  151. json:
  152. provider: 'url'
  153. data: {
  154. url: 'example.com/foo'
  155. }
  156. parent_folder_id: @root_folder_id
  157. name: 'url-test-file-6'
  158. }, (error, response, body) =>
  159. throw error if error?
  160. expect(response.statusCode).to.equal 204
  161. @owner.getProject @project_id, (error, project) =>
  162. throw error if error?
  163. file = _.find project.rootFolder[0].fileRefs, (file) ->
  164. file.name == 'url-test-file-6'
  165. expect(file.linkedFileData).to.deep.equal({
  166. provider: 'url'
  167. url: 'http://example.com/foo'
  168. })
  169. @owner.request.get "/project/#{@project_id}/file/#{file._id}", (error, response, body) ->
  170. throw error if error?
  171. expect(response.statusCode).to.equal 200
  172. expect(body).to.equal "foo foo foo"
  173. done()
  174. # TODO: Add test for asking for host that return ENOTFOUND
  175. # (This will probably end up handled by the proxy)