SmokeTests.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /* eslint-disable
  2. max-len,
  3. no-unused-vars,
  4. no-useless-escape,
  5. */
  6. // TODO: This file was created by bulk-decaffeinate.
  7. // Fix any style issues and re-enable lint.
  8. /*
  9. * decaffeinate suggestions:
  10. * DS102: Remove unnecessary code created because of implicit returns
  11. * DS207: Consider shorter variations of null checks
  12. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  13. */
  14. const child = require('child_process')
  15. let fs = require('fs')
  16. const assert = require('assert')
  17. const chai = require('chai')
  18. if (Object.prototype.should == null) {
  19. chai.should()
  20. }
  21. const { expect } = chai
  22. const Settings = require('settings-sharelatex')
  23. let ownPort = Settings.internal.web.port || Settings.port || 3000
  24. const port = Settings.web.web_router_port || ownPort // send requests to web router if this is the api process
  25. const cookeFilePath = `/tmp/smoke-test-cookie-${ownPort}-to-${port}.txt`
  26. const buildUrl = path =>
  27. ` -b ${cookeFilePath} --resolve 'smoke${
  28. Settings.cookieDomain
  29. }:${port}:127.0.0.1' http://smoke${
  30. Settings.cookieDomain
  31. }:${port}/${path}?setLng=en`
  32. const logger = require('logger-sharelatex')
  33. const LoginRateLimiter = require('../../../app/src/Features/Security/LoginRateLimiter.js')
  34. const RateLimiter = require('../../../app/src/infrastructure/RateLimiter.js')
  35. // Change cookie to be non secure so curl will send it
  36. const convertCookieFile = function(callback) {
  37. fs = require('fs')
  38. return fs.readFile(cookeFilePath, 'utf8', function(err, data) {
  39. if (err) {
  40. return callback(err)
  41. }
  42. const firstTrue = data.indexOf('TRUE')
  43. const secondTrue = data.indexOf('TRUE', firstTrue + 4)
  44. const result =
  45. data.slice(0, secondTrue) + 'FALSE' + data.slice(secondTrue + 4)
  46. return fs.writeFile(cookeFilePath, result, 'utf8', function(err) {
  47. if (err) {
  48. return callback(err)
  49. }
  50. return callback()
  51. })
  52. })
  53. }
  54. describe('Opening', function() {
  55. before(function(done) {
  56. logger.log('smoke test: setup')
  57. LoginRateLimiter.recordSuccessfulLogin(Settings.smokeTest.user, function(
  58. err
  59. ) {
  60. if (err != null) {
  61. logger.err({ err }, 'smoke test: error recoring successful login')
  62. return done(err)
  63. }
  64. return RateLimiter.clearRateLimit(
  65. 'open-project',
  66. `${Settings.smokeTest.projectId}:${Settings.smokeTest.userId}`,
  67. function(err) {
  68. if (err != null) {
  69. logger.err(
  70. { err },
  71. 'smoke test: error clearing open-project rate limit'
  72. )
  73. return done(err)
  74. }
  75. return RateLimiter.clearRateLimit(
  76. 'overleaf-login',
  77. Settings.smokeTest.rateLimitSubject,
  78. function(err) {
  79. if (err != null) {
  80. logger.err(
  81. { err },
  82. 'smoke test: error clearing overleaf-login rate limit'
  83. )
  84. return done(err)
  85. }
  86. return done()
  87. }
  88. )
  89. }
  90. )
  91. })
  92. })
  93. before(function(done) {
  94. logger.log('smoke test: hitting dev/csrf')
  95. let command = `\
  96. curl -H "X-Forwarded-Proto: https" -c ${cookeFilePath} ${buildUrl('dev/csrf')}\
  97. `
  98. child.exec(command, function(err, stdout, stderr) {
  99. if (err != null) {
  100. done(err)
  101. }
  102. const csrf = stdout
  103. logger.log('smoke test: converting cookie file 1')
  104. return convertCookieFile(function(err) {
  105. if (err != null) {
  106. return done(err)
  107. }
  108. logger.log('smoke test: hitting /login with csrf')
  109. command = `\
  110. curl -c ${cookeFilePath} -H "Content-Type: application/json" -H "X-Forwarded-Proto: https" -d '{"_csrf":"${csrf}", "email":"${
  111. Settings.smokeTest.user
  112. }", "password":"${Settings.smokeTest.password}"}' ${buildUrl('login')}\
  113. `
  114. return child.exec(command, function(err) {
  115. if (err != null) {
  116. return done(err)
  117. }
  118. logger.log('smoke test: finishing setup')
  119. return convertCookieFile(done)
  120. })
  121. })
  122. })
  123. })
  124. after(function(done) {
  125. logger.log('smoke test: converting cookie file 2')
  126. convertCookieFile(function(err) {
  127. if (err != null) {
  128. return done(err)
  129. }
  130. logger.log('smoke test: cleaning up')
  131. let command = `\
  132. curl -H "X-Forwarded-Proto: https" -c ${cookeFilePath} ${buildUrl('dev/csrf')}\
  133. `
  134. return child.exec(command, function(err, stdout, stderr) {
  135. if (err != null) {
  136. done(err)
  137. }
  138. const csrf = stdout
  139. logger.log('smoke test: converting cookie file 3')
  140. return convertCookieFile(function(err) {
  141. if (err != null) {
  142. return done(err)
  143. }
  144. command = `\
  145. curl -H "Content-Type: application/json" -H "X-Forwarded-Proto: https" -d '{"_csrf":"${csrf}"}' -c ${cookeFilePath} ${buildUrl(
  146. 'logout'
  147. )}\
  148. `
  149. return child.exec(command, function(err, stdout, stderr) {
  150. if (err != null) {
  151. return done(err)
  152. }
  153. return fs.unlink(cookeFilePath, done)
  154. })
  155. })
  156. })
  157. })
  158. })
  159. it('a project', function(done) {
  160. logger.log('smoke test: Checking can load a project')
  161. this.timeout(4000)
  162. const command = `\
  163. curl -H "X-Forwarded-Proto: https" -v ${buildUrl(
  164. `project/${Settings.smokeTest.projectId}`
  165. )}\
  166. `
  167. return child.exec(command, function(error, stdout, stderr) {
  168. expect(error, 'smoke test: error in getting project').to.not.exist
  169. const statusCodeMatch = !!stderr.match('200 OK')
  170. expect(
  171. statusCodeMatch,
  172. 'smoke test: response code is not 200 getting project'
  173. ).to.equal(true)
  174. // Check that the project id is present in the javascript that loads up the project
  175. const match = !!stdout.match(
  176. `window.project_id = \"${Settings.smokeTest.projectId}\"`
  177. )
  178. expect(
  179. match,
  180. 'smoke test: project page html does not have project_id'
  181. ).to.equal(true)
  182. return done()
  183. })
  184. })
  185. it('the project list', function(done) {
  186. logger.log('smoke test: Checking can load project list')
  187. this.timeout(4000)
  188. const command = `\
  189. curl -H "X-Forwarded-Proto: https" -v ${buildUrl('project')}\
  190. `
  191. return child.exec(command, function(error, stdout, stderr) {
  192. expect(
  193. error,
  194. 'smoke test: error returned in getting project list'
  195. ).to.not.exist
  196. expect(
  197. !!stderr.match('200 OK'),
  198. 'smoke test: response code is not 200 getting project list'
  199. ).to.equal(true)
  200. expect(
  201. !!stdout.match(
  202. '<title>Your Projects - .*, Online LaTeX Editor</title>'
  203. ),
  204. 'smoke test: body does not have correct title'
  205. ).to.equal(true)
  206. expect(
  207. !!stdout.match('ProjectPageController'),
  208. 'smoke test: body does not have correct angular controller'
  209. ).to.equal(true)
  210. return done()
  211. })
  212. })
  213. })