LinkedFilesTests.coffee 5.7 KB

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