SettingsTests.js 2.4 KB

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