-
Notifications
You must be signed in to change notification settings - Fork 819
Expand file tree
/
Copy pathfeatureFlags.test.js
More file actions
116 lines (98 loc) · 4.26 KB
/
Copy pathfeatureFlags.test.js
File metadata and controls
116 lines (98 loc) · 4.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// test/featureFlags.test.js
// Tests for src/gep/featureFlags.js: persistent storage + read/write semantics,
// and the three-tier resolution in validator.isValidatorEnabled().
'use strict';
const { describe, it, beforeEach, afterEach } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('fs');
const os = require('os');
const path = require('path');
function freshRequire(id) {
delete require.cache[require.resolve(id)];
return require(id);
}
describe('featureFlags persistence', function () {
// #114: redirect ~/.evomap by setting EVOLVER_HOME instead of monkey-patching
// `os.homedir`. The global monkey-patch was fragile (parallel-test hostile;
// affected any module that read homedir during the patch window).
let tmpHome;
let originalEvolverHome;
beforeEach(() => {
tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'evomap-flags-'));
originalEvolverHome = process.env.EVOLVER_HOME;
process.env.EVOLVER_HOME = tmpHome;
});
afterEach(() => {
if (originalEvolverHome === undefined) delete process.env.EVOLVER_HOME;
else process.env.EVOLVER_HOME = originalEvolverHome;
try { fs.rmSync(tmpHome, { recursive: true, force: true }); } catch (_) {}
});
it('returns undefined for unset key', function () {
const ff = freshRequire('../src/gep/featureFlags');
assert.equal(ff.readFeatureFlag('validator_enabled'), undefined);
});
it('persists value across cache resets', function () {
const ff = freshRequire('../src/gep/featureFlags');
assert.equal(ff.writeFeatureFlag('validator_enabled', true, 'hub_mailbox'), true);
const ff2 = freshRequire('../src/gep/featureFlags');
assert.equal(ff2.readFeatureFlag('validator_enabled'), true);
const all = ff2.getAllFeatureFlags();
assert.equal(all.validator_enabled.value, true);
assert.equal(all.validator_enabled.source, 'hub_mailbox');
assert.ok(all.validator_enabled.updatedAt);
});
it('rejects empty / non-string keys', function () {
const ff = freshRequire('../src/gep/featureFlags');
assert.equal(ff.writeFeatureFlag('', true, 'src'), false);
assert.equal(ff.writeFeatureFlag(null, true, 'src'), false);
assert.equal(ff.readFeatureFlag(''), undefined);
});
});
describe('isValidatorEnabled three-tier resolution', function () {
let tmpHome;
const originalEnv = { ...process.env };
beforeEach(() => {
tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'evomap-flags-'));
process.env.EVOLVER_HOME = tmpHome;
delete process.env.EVOLVER_VALIDATOR_ENABLED;
});
afterEach(() => {
try { fs.rmSync(tmpHome, { recursive: true, force: true }); } catch (_) {}
for (const k of Object.keys(process.env)) {
if (!(k in originalEnv)) delete process.env[k];
}
Object.assign(process.env, originalEnv);
});
it('defaults to true when env unset and no persisted flag', function () {
freshRequire('../src/gep/featureFlags');
const v = freshRequire('../src/gep/validator');
assert.equal(v.isValidatorEnabled(), true);
});
it('env=0 wins over persisted flag=true', function () {
const ff = freshRequire('../src/gep/featureFlags');
ff.writeFeatureFlag('validator_enabled', true, 'hub_mailbox');
process.env.EVOLVER_VALIDATOR_ENABLED = '0';
const v = freshRequire('../src/gep/validator');
assert.equal(v.isValidatorEnabled(), false);
});
it('env=1 wins over persisted flag=false', function () {
const ff = freshRequire('../src/gep/featureFlags');
ff.writeFeatureFlag('validator_enabled', false, 'hub_mailbox');
process.env.EVOLVER_VALIDATOR_ENABLED = '1';
const v = freshRequire('../src/gep/validator');
assert.equal(v.isValidatorEnabled(), true);
});
it('persisted flag=false applied when env unset', function () {
const ff = freshRequire('../src/gep/featureFlags');
ff.writeFeatureFlag('validator_enabled', false, 'hub_mailbox');
const v = freshRequire('../src/gep/validator');
assert.equal(v.isValidatorEnabled(), false);
});
it('accepts off/false/no aliases for env opt-out', function () {
for (const val of ['off', 'false', 'no', 'OFF', 'False']) {
process.env.EVOLVER_VALIDATOR_ENABLED = val;
const v = freshRequire('../src/gep/validator');
assert.equal(v.isValidatorEnabled(), false, 'value=' + val);
}
});
});