SmokeTests.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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', (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', 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, err => {
  58. if (err != null) {
  59. logger.err({ err }, 'smoke test: error recoring successful login')
  60. return done(err)
  61. }
  62. return RateLimiter.clearRateLimit(
  63. 'open-project',
  64. `${Settings.smokeTest.projectId}:${Settings.smokeTest.userId}`,
  65. err => {
  66. if (err != null) {
  67. logger.err(
  68. { err },
  69. 'smoke test: error clearing open-project rate limit'
  70. )
  71. return done(err)
  72. }
  73. return RateLimiter.clearRateLimit(
  74. 'overleaf-login',
  75. Settings.smokeTest.rateLimitSubject,
  76. err => {
  77. if (err != null) {
  78. logger.err(
  79. { err },
  80. 'smoke test: error clearing overleaf-login rate limit'
  81. )
  82. return done(err)
  83. }
  84. return done()
  85. }
  86. )
  87. }
  88. )
  89. })
  90. })
  91. before(function(done) {
  92. logger.log('smoke test: hitting dev/csrf')
  93. let command = `\
  94. curl -H "X-Forwarded-Proto: https" -c ${cookeFilePath} ${buildUrl('dev/csrf')}\
  95. `
  96. child.exec(command, (err, stdout, stderr) => {
  97. if (err != null) {
  98. done(err)
  99. }
  100. const csrf = stdout
  101. logger.log('smoke test: converting cookie file 1')
  102. return convertCookieFile(err => {
  103. if (err != null) {
  104. return done(err)
  105. }
  106. logger.log('smoke test: hitting /login with csrf')
  107. command = `\
  108. curl -c ${cookeFilePath} -H "Content-Type: application/json" -H "X-Forwarded-Proto: https" -d '{"_csrf":"${csrf}", "email":"${
  109. Settings.smokeTest.user
  110. }", "password":"${Settings.smokeTest.password}"}' ${buildUrl('login')}\
  111. `
  112. return child.exec(command, err => {
  113. if (err != null) {
  114. return done(err)
  115. }
  116. logger.log('smoke test: finishing setup')
  117. return convertCookieFile(done)
  118. })
  119. })
  120. })
  121. })
  122. after(function(done) {
  123. logger.log('smoke test: converting cookie file 2')
  124. convertCookieFile(err => {
  125. if (err != null) {
  126. return done(err)
  127. }
  128. logger.log('smoke test: cleaning up')
  129. let command = `\
  130. curl -H "X-Forwarded-Proto: https" -c ${cookeFilePath} ${buildUrl('dev/csrf')}\
  131. `
  132. return child.exec(command, (err, stdout, stderr) => {
  133. if (err != null) {
  134. done(err)
  135. }
  136. const csrf = stdout
  137. logger.log('smoke test: converting cookie file 3')
  138. return convertCookieFile(err => {
  139. if (err != null) {
  140. return done(err)
  141. }
  142. command = `\
  143. curl -H "Content-Type: application/json" -H "X-Forwarded-Proto: https" -d '{"_csrf":"${csrf}"}' -c ${cookeFilePath} ${buildUrl(
  144. 'logout'
  145. )}\
  146. `
  147. return child.exec(command, (err, stdout, stderr) => {
  148. if (err != null) {
  149. return done(err)
  150. }
  151. return fs.unlink(cookeFilePath, done)
  152. })
  153. })
  154. })
  155. })
  156. })
  157. it('a project', function(done) {
  158. logger.log('smoke test: Checking can load a project')
  159. this.timeout(4000)
  160. const command = `\
  161. curl -H "X-Forwarded-Proto: https" -v ${buildUrl(
  162. `project/${Settings.smokeTest.projectId}`
  163. )}\
  164. `
  165. return child.exec(command, (error, stdout, stderr) => {
  166. expect(error, 'smoke test: error in getting project').to.not.exist
  167. const statusCodeMatch = !!stderr.match('200 OK')
  168. expect(
  169. statusCodeMatch,
  170. 'smoke test: response code is not 200 getting project'
  171. ).to.equal(true)
  172. // Check that the project id is present in the javascript that loads up the project
  173. const match = !!stdout.match(
  174. `window.project_id = \"${Settings.smokeTest.projectId}\"`
  175. )
  176. expect(
  177. match,
  178. 'smoke test: project page html does not have project_id'
  179. ).to.equal(true)
  180. return done()
  181. })
  182. })
  183. it('the project list', function(done) {
  184. logger.log('smoke test: Checking can load project list')
  185. this.timeout(4000)
  186. const command = `\
  187. curl -H "X-Forwarded-Proto: https" -v ${buildUrl('project')}\
  188. `
  189. return child.exec(command, (error, stdout, stderr) => {
  190. expect(error, 'smoke test: error returned in getting project list').to.not
  191. .exist
  192. expect(
  193. !!stderr.match('200 OK'),
  194. 'smoke test: response code is not 200 getting project list'
  195. ).to.equal(true)
  196. expect(
  197. !!stdout.match(
  198. '<title>Your Projects - .*, Online LaTeX Editor</title>'
  199. ),
  200. 'smoke test: body does not have correct title'
  201. ).to.equal(true)
  202. expect(
  203. !!stdout.match('ProjectPageController'),
  204. 'smoke test: body does not have correct angular controller'
  205. ).to.equal(true)
  206. return done()
  207. })
  208. })
  209. })