Settings.test.mjs 2.6 KB

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