TestHelper.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. const streamifier = require('streamifier')
  2. const fetch = require('node-fetch')
  3. const ObjectPersistor = require('@overleaf/object-persistor')
  4. const { expect } = require('chai')
  5. module.exports = {
  6. uploadStringToPersistor,
  7. getStringFromPersistor,
  8. expectPersistorToHaveFile,
  9. expectPersistorToHaveSomeFile,
  10. expectPersistorNotToHaveFile,
  11. streamToString,
  12. getMetric,
  13. }
  14. async function getMetric(filestoreUrl, metric) {
  15. const res = await fetch(`${filestoreUrl}/metrics`)
  16. expect(res.status).to.equal(200)
  17. const metricRegex = new RegExp(`^${metric}{[^}]+} ([0-9]+)$`, 'gm')
  18. const body = await res.text()
  19. let v = 0
  20. // Sum up size="lt-128KiB" and size="gte-128KiB"
  21. for (const [, found] of body.matchAll(metricRegex)) {
  22. v += parseInt(found, 10) || 0
  23. }
  24. return v
  25. }
  26. function streamToString(stream) {
  27. const chunks = []
  28. return new Promise((resolve, reject) => {
  29. stream.on('data', chunk => chunks.push(chunk))
  30. stream.on('error', reject)
  31. stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')))
  32. stream.resume()
  33. })
  34. }
  35. async function uploadStringToPersistor(persistor, bucket, key, content) {
  36. const fileStream = streamifier.createReadStream(content)
  37. await persistor.sendStream(bucket, key, fileStream)
  38. }
  39. async function getStringFromPersistor(persistor, bucket, key) {
  40. const stream = await persistor.getObjectStream(bucket, key, {})
  41. return await streamToString(stream)
  42. }
  43. async function expectPersistorToHaveFile(persistor, bucket, key, content) {
  44. const foundContent = await getStringFromPersistor(persistor, bucket, key)
  45. expect(foundContent).to.equal(content)
  46. }
  47. async function expectPersistorToHaveSomeFile(persistor, bucket, keys, content) {
  48. let foundContent
  49. for (const key of keys) {
  50. try {
  51. foundContent = await getStringFromPersistor(persistor, bucket, key)
  52. break
  53. } catch (err) {
  54. if (err instanceof ObjectPersistor.Errors.NotFoundError) {
  55. continue
  56. }
  57. throw err
  58. }
  59. }
  60. if (foundContent === undefined) {
  61. expect.fail(`Could not find any of the specified keys: ${keys}`)
  62. }
  63. expect(foundContent).to.equal(content)
  64. }
  65. async function expectPersistorNotToHaveFile(persistor, bucket, key) {
  66. await expect(
  67. getStringFromPersistor(persistor, bucket, key)
  68. ).to.eventually.have.been.rejected.with.property('name', 'NotFoundError')
  69. }