FeaturesHelperTests.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. const SandboxedModule = require('sandboxed-module')
  2. const { expect } = require('chai')
  3. const MODULE_PATH = '../../../../app/src/Features/Subscription/FeaturesHelper'
  4. describe('FeaturesHelper', function () {
  5. beforeEach(function () {
  6. this.FeaturesHelper = SandboxedModule.require(MODULE_PATH)
  7. })
  8. describe('mergeFeatures', function () {
  9. it('should prefer priority over standard for compileGroup', function () {
  10. expect(
  11. this.FeaturesHelper.mergeFeatures(
  12. { compileGroup: 'priority' },
  13. { compileGroup: 'standard' }
  14. )
  15. ).to.deep.equal({ compileGroup: 'priority' })
  16. expect(
  17. this.FeaturesHelper.mergeFeatures(
  18. { compileGroup: 'standard' },
  19. { compileGroup: 'priority' }
  20. )
  21. ).to.deep.equal({ compileGroup: 'priority' })
  22. expect(
  23. this.FeaturesHelper.mergeFeatures(
  24. { compileGroup: 'priority' },
  25. { compileGroup: 'priority' }
  26. )
  27. ).to.deep.equal({ compileGroup: 'priority' })
  28. expect(
  29. this.FeaturesHelper.mergeFeatures(
  30. { compileGroup: 'standard' },
  31. { compileGroup: 'standard' }
  32. )
  33. ).to.deep.equal({ compileGroup: 'standard' })
  34. })
  35. it('should prefer -1 over any other for collaborators', function () {
  36. expect(
  37. this.FeaturesHelper.mergeFeatures(
  38. { collaborators: -1 },
  39. { collaborators: 10 }
  40. )
  41. ).to.deep.equal({ collaborators: -1 })
  42. expect(
  43. this.FeaturesHelper.mergeFeatures(
  44. { collaborators: 10 },
  45. { collaborators: -1 }
  46. )
  47. ).to.deep.equal({ collaborators: -1 })
  48. expect(
  49. this.FeaturesHelper.mergeFeatures(
  50. { collaborators: 4 },
  51. { collaborators: 10 }
  52. )
  53. ).to.deep.equal({ collaborators: 10 })
  54. })
  55. it('should prefer the higher of compileTimeout', function () {
  56. expect(
  57. this.FeaturesHelper.mergeFeatures(
  58. { compileTimeout: 20 },
  59. { compileTimeout: 10 }
  60. )
  61. ).to.deep.equal({ compileTimeout: 20 })
  62. expect(
  63. this.FeaturesHelper.mergeFeatures(
  64. { compileTimeout: 10 },
  65. { compileTimeout: 20 }
  66. )
  67. ).to.deep.equal({ compileTimeout: 20 })
  68. })
  69. it('should prefer the true over false for other keys', function () {
  70. expect(
  71. this.FeaturesHelper.mergeFeatures({ github: true }, { github: false })
  72. ).to.deep.equal({ github: true })
  73. expect(
  74. this.FeaturesHelper.mergeFeatures({ github: false }, { github: true })
  75. ).to.deep.equal({ github: true })
  76. expect(
  77. this.FeaturesHelper.mergeFeatures({ github: true }, { github: true })
  78. ).to.deep.equal({ github: true })
  79. expect(
  80. this.FeaturesHelper.mergeFeatures({ github: false }, { github: false })
  81. ).to.deep.equal({ github: false })
  82. })
  83. })
  84. describe('computeFeatureSet', function () {
  85. it('should handle only one featureSet', function () {
  86. expect(
  87. this.FeaturesHelper.computeFeatureSet([
  88. { github: true, feat1: true, feat2: false },
  89. ])
  90. ).to.deep.equal({ github: true, feat1: true, feat2: false })
  91. })
  92. it('should handle an empty array of featureSets', function () {
  93. expect(this.FeaturesHelper.computeFeatureSet([])).to.deep.equal({})
  94. })
  95. it('should handle 3+ featureSets', function () {
  96. const featureSets = [
  97. { github: true, feat1: false, feat2: false },
  98. { github: false, feat1: true, feat2: false, feat3: false },
  99. { github: false, feat1: false, feat2: true, feat4: true },
  100. ]
  101. expect(this.FeaturesHelper.computeFeatureSet(featureSets)).to.deep.equal({
  102. github: true,
  103. feat1: true,
  104. feat2: true,
  105. feat3: false,
  106. feat4: true,
  107. })
  108. })
  109. })
  110. describe('isFeatureSetBetter', function () {
  111. it('simple comparisons', function () {
  112. const result1 = this.FeaturesHelper.isFeatureSetBetter(
  113. { dropbox: true },
  114. { dropbox: false }
  115. )
  116. expect(result1).to.be.true
  117. const result2 = this.FeaturesHelper.isFeatureSetBetter(
  118. { dropbox: false },
  119. { dropbox: true }
  120. )
  121. expect(result2).to.be.false
  122. })
  123. it('compound comparisons with same features', function () {
  124. const result1 = this.FeaturesHelper.isFeatureSetBetter(
  125. { collaborators: 9, dropbox: true },
  126. { collaborators: 10, dropbox: true }
  127. )
  128. expect(result1).to.be.false
  129. const result2 = this.FeaturesHelper.isFeatureSetBetter(
  130. { collaborators: -1, dropbox: true },
  131. { collaborators: 10, dropbox: true }
  132. )
  133. expect(result2).to.be.true
  134. const result3 = this.FeaturesHelper.isFeatureSetBetter(
  135. { collaborators: -1, compileTimeout: 60, dropbox: true },
  136. { collaborators: 10, compileTimeout: 60, dropbox: true }
  137. )
  138. expect(result3).to.be.true
  139. })
  140. })
  141. })