Files
overleaf-cep/services/web/test/unit/src/Subscription/FeaturesHelper.test.mjs
Andrew Rumble 93b7274ea6 Convert tests to ESM
GitOrigin-RevId: 03bd4db8cddc548706439edd7f6db0bc3e7ed9d3
2025-11-06 09:05:51 +00:00

154 lines
4.8 KiB
JavaScript

import { expect } from 'vitest'
const MODULE_PATH = '../../../../app/src/Features/Subscription/FeaturesHelper'
describe('FeaturesHelper', function () {
beforeEach(async function (ctx) {
ctx.FeaturesHelper = (await import(MODULE_PATH)).default
})
describe('mergeFeatures', function () {
it('should prefer priority over standard for compileGroup', function (ctx) {
expect(
ctx.FeaturesHelper.mergeFeatures(
{ compileGroup: 'priority' },
{ compileGroup: 'standard' }
)
).to.deep.equal({ compileGroup: 'priority' })
expect(
ctx.FeaturesHelper.mergeFeatures(
{ compileGroup: 'standard' },
{ compileGroup: 'priority' }
)
).to.deep.equal({ compileGroup: 'priority' })
expect(
ctx.FeaturesHelper.mergeFeatures(
{ compileGroup: 'priority' },
{ compileGroup: 'priority' }
)
).to.deep.equal({ compileGroup: 'priority' })
expect(
ctx.FeaturesHelper.mergeFeatures(
{ compileGroup: 'standard' },
{ compileGroup: 'standard' }
)
).to.deep.equal({ compileGroup: 'standard' })
})
it('should prefer -1 over any other for collaborators', function (ctx) {
expect(
ctx.FeaturesHelper.mergeFeatures(
{ collaborators: -1 },
{ collaborators: 10 }
)
).to.deep.equal({ collaborators: -1 })
expect(
ctx.FeaturesHelper.mergeFeatures(
{ collaborators: 10 },
{ collaborators: -1 }
)
).to.deep.equal({ collaborators: -1 })
expect(
ctx.FeaturesHelper.mergeFeatures(
{ collaborators: 4 },
{ collaborators: 10 }
)
).to.deep.equal({ collaborators: 10 })
})
it('should prefer the higher of compileTimeout', function (ctx) {
expect(
ctx.FeaturesHelper.mergeFeatures(
{ compileTimeout: 20 },
{ compileTimeout: 10 }
)
).to.deep.equal({ compileTimeout: 20 })
expect(
ctx.FeaturesHelper.mergeFeatures(
{ compileTimeout: 10 },
{ compileTimeout: 20 }
)
).to.deep.equal({ compileTimeout: 20 })
})
it('should prefer the true over false for other keys', function (ctx) {
expect(
ctx.FeaturesHelper.mergeFeatures({ github: true }, { github: false })
).to.deep.equal({ github: true })
expect(
ctx.FeaturesHelper.mergeFeatures({ github: false }, { github: true })
).to.deep.equal({ github: true })
expect(
ctx.FeaturesHelper.mergeFeatures({ github: true }, { github: true })
).to.deep.equal({ github: true })
expect(
ctx.FeaturesHelper.mergeFeatures({ github: false }, { github: false })
).to.deep.equal({ github: false })
})
})
describe('computeFeatureSet', function () {
it('should handle only one featureSet', function (ctx) {
expect(
ctx.FeaturesHelper.computeFeatureSet([
{ github: true, feat1: true, feat2: false },
])
).to.deep.equal({ github: true, feat1: true, feat2: false })
})
it('should handle an empty array of featureSets', function (ctx) {
expect(ctx.FeaturesHelper.computeFeatureSet([])).to.deep.equal({})
})
it('should handle 3+ featureSets', function (ctx) {
const featureSets = [
{ github: true, feat1: false, feat2: false },
{ github: false, feat1: true, feat2: false, feat3: false },
{ github: false, feat1: false, feat2: true, feat4: true },
]
expect(ctx.FeaturesHelper.computeFeatureSet(featureSets)).to.deep.equal({
github: true,
feat1: true,
feat2: true,
feat3: false,
feat4: true,
})
})
})
describe('isFeatureSetBetter', function () {
it('simple comparisons', function (ctx) {
const result1 = ctx.FeaturesHelper.isFeatureSetBetter(
{ dropbox: true },
{ dropbox: false }
)
expect(result1).to.be.true
const result2 = ctx.FeaturesHelper.isFeatureSetBetter(
{ dropbox: false },
{ dropbox: true }
)
expect(result2).to.be.false
})
it('compound comparisons with same features', function (ctx) {
const result1 = ctx.FeaturesHelper.isFeatureSetBetter(
{ collaborators: 9, dropbox: true },
{ collaborators: 10, dropbox: true }
)
expect(result1).to.be.false
const result2 = ctx.FeaturesHelper.isFeatureSetBetter(
{ collaborators: -1, dropbox: true },
{ collaborators: 10, dropbox: true }
)
expect(result2).to.be.true
const result3 = ctx.FeaturesHelper.isFeatureSetBetter(
{ collaborators: -1, compileTimeout: 60, dropbox: true },
{ collaborators: 10, compileTimeout: 60, dropbox: true }
)
expect(result3).to.be.true
})
})
})