Settings.test.mjs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { expect } from 'vitest'
  2. import { createRequire } from 'node:module'
  3. const require = createRequire(import.meta.url)
  4. function clearSettingsCache() {
  5. const monorepoPath = require
  6. .resolve('../../../../config/settings.defaults.js')
  7. .replace(/\/services\/web\/config\/settings\.defaults\.js$/, '')
  8. const settingsDeps = Object.keys(require.cache).filter(
  9. x =>
  10. x.includes('/@overleaf/settings') ||
  11. x.includes(`${monorepoPath}/libraries/settings`) ||
  12. x.includes(`${monorepoPath}/services/web/config`)
  13. )
  14. settingsDeps.forEach(dep => delete require.cache[dep])
  15. }
  16. /**
  17. * @param {any} value
  18. * @returns {string} A string representation of the structure of the value
  19. */
  20. function serializeTypes(value) {
  21. if (typeof value === 'object') {
  22. const keys = Object.keys(value).sort()
  23. const types = keys.reduce((acc, key) => {
  24. acc[key] = serializeTypes(value[key])
  25. return acc
  26. }, {})
  27. return JSON.stringify(types)
  28. }
  29. if (Array.isArray(value)) {
  30. return JSON.stringify(value.map(serializeTypes))
  31. }
  32. return typeof value
  33. }
  34. /**
  35. * @param {any[]} objects
  36. * @returns {boolean} Whether all objects have the same structure
  37. */
  38. function haveSameStructure(objects) {
  39. if (!objects.length) return true
  40. const referenceStructure = serializeTypes(objects[0])
  41. return objects.every(obj => serializeTypes(obj) === referenceStructure)
  42. }
  43. describe('settings.defaults', function () {
  44. it('additional text extensions can be added via config', function () {
  45. clearSettingsCache()
  46. process.env.ADDITIONAL_TEXT_EXTENSIONS = 'abc, xyz'
  47. const settings = require('@overleaf/settings')
  48. expect(settings.textExtensions).to.include('tex') // from the default list
  49. expect(settings.textExtensions).to.include('abc')
  50. expect(settings.textExtensions).to.include('xyz')
  51. })
  52. it('generates pricings with same structures', function () {
  53. const settingsOverridesSaas = require('../../../../config/settings.overrides.saas.js')
  54. const { localizedPlanPricing } = settingsOverridesSaas
  55. const pricingCurrencies = Object.keys(localizedPlanPricing)
  56. expect(pricingCurrencies.sort()).to.eql([
  57. 'AUD',
  58. 'BRL',
  59. 'CAD',
  60. 'CHF',
  61. 'CLP',
  62. 'COP',
  63. 'DKK',
  64. 'EUR',
  65. 'GBP',
  66. 'INR',
  67. 'MXN',
  68. 'NOK',
  69. 'NZD',
  70. 'PEN',
  71. 'SEK',
  72. 'SGD',
  73. 'USD',
  74. ])
  75. const pricings = pricingCurrencies.map(
  76. currency => localizedPlanPricing[currency]
  77. )
  78. expect(haveSameStructure(pricings)).to.be.true
  79. })
  80. })