TestHelper.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import streamifier from 'streamifier'
  2. import fetch from 'node-fetch'
  3. import ObjectPersistor from '@overleaf/object-persistor'
  4. import { expect } from 'chai'
  5. export default {
  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. }