LinkedFilesTests.coffee 5.6 KB

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