flagsmith-nodejs 3.3.3 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/publish.yml +2 -2
- package/.github/workflows/pull_request.yaml +7 -14
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/environments/models.d.ts +3 -3
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/environments/models.js +20 -13
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/environments/util.d.ts +1 -1
- package/build/cjs/flagsmith-engine/environments/util.js +23 -0
- package/build/cjs/flagsmith-engine/features/models.js +118 -0
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/features/util.d.ts +1 -1
- package/build/cjs/flagsmith-engine/features/util.js +27 -0
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/identities/models.d.ts +2 -2
- package/build/cjs/flagsmith-engine/identities/models.js +48 -0
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/identities/traits/models.js +5 -4
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/identities/util.d.ts +2 -2
- package/build/cjs/flagsmith-engine/identities/util.js +22 -0
- package/build/cjs/flagsmith-engine/index.d.ts +14 -0
- package/build/cjs/flagsmith-engine/index.js +75 -0
- package/build/cjs/flagsmith-engine/organisations/models.js +21 -0
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/organisations/util.d.ts +1 -1
- package/build/cjs/flagsmith-engine/organisations/util.js +8 -0
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/projects/models.d.ts +2 -2
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/projects/models.js +8 -5
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/projects/util.d.ts +1 -1
- package/build/cjs/flagsmith-engine/projects/util.js +15 -0
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/segments/evaluators.d.ts +4 -4
- package/build/cjs/flagsmith-engine/segments/evaluators.js +37 -0
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/segments/models.d.ts +1 -1
- package/build/cjs/flagsmith-engine/segments/models.js +111 -0
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/segments/util.d.ts +1 -1
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/segments/util.js +9 -11
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/utils/collections.d.ts +1 -1
- package/build/cjs/flagsmith-engine/utils/collections.js +6 -0
- package/build/cjs/flagsmith-engine/utils/errors.js +6 -0
- package/build/cjs/flagsmith-engine/utils/hashing/index.js +29 -0
- package/build/{flagsmith-engine → cjs/flagsmith-engine}/utils/index.js +5 -5
- package/build/{index.d.ts → cjs/index.d.ts} +3 -3
- package/build/cjs/index.js +18 -0
- package/build/cjs/package.json +1 -0
- package/build/{sdk → cjs/sdk}/analytics.d.ts +3 -0
- package/build/cjs/sdk/analytics.js +73 -0
- package/build/cjs/sdk/errors.js +9 -0
- package/build/{sdk → cjs/sdk}/index.d.ts +19 -18
- package/build/cjs/sdk/index.js +400 -0
- package/build/{sdk → cjs/sdk}/models.d.ts +2 -2
- package/build/cjs/sdk/models.js +101 -0
- package/build/{sdk → cjs/sdk}/offline_handlers.d.ts +1 -1
- package/build/cjs/sdk/offline_handlers.js +23 -0
- package/build/{sdk → cjs/sdk}/polling_manager.d.ts +1 -1
- package/build/cjs/sdk/polling_manager.js +29 -0
- package/build/{sdk → cjs/sdk}/types.d.ts +15 -7
- package/build/cjs/sdk/utils.d.ts +36 -0
- package/build/cjs/sdk/utils.js +63 -0
- package/build/esm/flagsmith-engine/environments/models.d.ts +22 -0
- package/build/esm/flagsmith-engine/environments/models.js +32 -0
- package/build/esm/flagsmith-engine/environments/util.d.ts +3 -0
- package/build/esm/flagsmith-engine/environments/util.js +18 -0
- package/build/esm/flagsmith-engine/features/constants.d.ts +4 -0
- package/build/esm/flagsmith-engine/features/constants.js +4 -0
- package/build/esm/flagsmith-engine/features/models.d.ts +37 -0
- package/build/esm/flagsmith-engine/features/models.js +110 -0
- package/build/esm/flagsmith-engine/features/util.d.ts +4 -0
- package/build/esm/flagsmith-engine/features/util.js +21 -0
- package/build/esm/flagsmith-engine/identities/models.d.ts +15 -0
- package/build/esm/flagsmith-engine/identities/models.js +44 -0
- package/build/esm/flagsmith-engine/identities/traits/models.d.ts +5 -0
- package/build/esm/flagsmith-engine/identities/traits/models.js +8 -0
- package/build/esm/flagsmith-engine/identities/util.d.ts +4 -0
- package/build/esm/flagsmith-engine/identities/util.js +17 -0
- package/build/esm/flagsmith-engine/index.d.ts +14 -0
- package/build/esm/flagsmith-engine/index.js +62 -0
- package/build/esm/flagsmith-engine/organisations/models.d.ts +9 -0
- package/build/esm/flagsmith-engine/organisations/models.js +17 -0
- package/build/esm/flagsmith-engine/organisations/util.d.ts +2 -0
- package/build/esm/flagsmith-engine/organisations/util.js +4 -0
- package/build/esm/flagsmith-engine/projects/models.d.ts +10 -0
- package/build/esm/flagsmith-engine/projects/models.js +13 -0
- package/build/esm/flagsmith-engine/projects/util.d.ts +2 -0
- package/build/esm/flagsmith-engine/projects/util.js +11 -0
- package/build/esm/flagsmith-engine/segments/constants.d.ts +34 -0
- package/build/esm/flagsmith-engine/segments/constants.js +36 -0
- package/build/esm/flagsmith-engine/segments/evaluators.d.ts +7 -0
- package/build/esm/flagsmith-engine/segments/evaluators.js +31 -0
- package/build/esm/flagsmith-engine/segments/models.d.ts +37 -0
- package/build/esm/flagsmith-engine/segments/models.js +102 -0
- package/build/esm/flagsmith-engine/segments/util.d.ts +6 -0
- package/build/esm/flagsmith-engine/segments/util.js +23 -0
- package/build/esm/flagsmith-engine/utils/collections.d.ts +3 -0
- package/build/esm/flagsmith-engine/utils/collections.js +2 -0
- package/build/esm/flagsmith-engine/utils/errors.d.ts +2 -0
- package/build/esm/flagsmith-engine/utils/errors.js +2 -0
- package/build/esm/flagsmith-engine/utils/hashing/index.d.ts +9 -0
- package/build/esm/flagsmith-engine/utils/hashing/index.js +25 -0
- package/build/esm/flagsmith-engine/utils/index.d.ts +1 -0
- package/build/esm/flagsmith-engine/utils/index.js +13 -0
- package/build/esm/index.d.ts +3 -0
- package/build/esm/index.js +2 -0
- package/build/esm/sdk/analytics.d.ts +35 -0
- package/build/esm/sdk/analytics.js +69 -0
- package/build/esm/sdk/errors.d.ts +4 -0
- package/build/esm/sdk/errors.js +4 -0
- package/build/esm/sdk/index.d.ts +131 -0
- package/build/esm/sdk/index.js +390 -0
- package/build/esm/sdk/models.d.ts +55 -0
- package/build/esm/sdk/models.js +94 -0
- package/build/esm/sdk/offline_handlers.d.ts +9 -0
- package/build/esm/sdk/offline_handlers.js +18 -0
- package/build/esm/sdk/polling_manager.d.ts +9 -0
- package/build/esm/sdk/polling_manager.js +25 -0
- package/build/esm/sdk/types.d.ts +38 -0
- package/build/esm/sdk/types.js +1 -0
- package/build/esm/sdk/utils.d.ts +36 -0
- package/build/esm/sdk/utils.js +56 -0
- package/flagsmith-engine/environments/models.ts +3 -3
- package/flagsmith-engine/environments/util.ts +4 -4
- package/flagsmith-engine/features/models.ts +2 -2
- package/flagsmith-engine/features/util.ts +1 -1
- package/flagsmith-engine/identities/models.ts +4 -5
- package/flagsmith-engine/identities/traits/models.ts +0 -1
- package/flagsmith-engine/identities/util.ts +4 -4
- package/flagsmith-engine/index.ts +13 -13
- package/flagsmith-engine/organisations/util.ts +1 -1
- package/flagsmith-engine/projects/models.ts +2 -2
- package/flagsmith-engine/projects/util.ts +4 -4
- package/flagsmith-engine/segments/evaluators.ts +6 -6
- package/flagsmith-engine/segments/models.ts +5 -5
- package/flagsmith-engine/segments/util.ts +3 -3
- package/flagsmith-engine/utils/collections.ts +1 -1
- package/flagsmith-engine/utils/hashing/index.ts +5 -29
- package/flagsmith-engine/utils/index.ts +1 -1
- package/index.ts +4 -8
- package/package.json +21 -16
- package/sdk/analytics.ts +7 -5
- package/sdk/index.ts +55 -46
- package/sdk/models.ts +2 -3
- package/sdk/offline_handlers.ts +2 -2
- package/sdk/polling_manager.ts +2 -3
- package/sdk/types.ts +35 -24
- package/sdk/utils.ts +49 -37
- package/tests/engine/e2e/engine.test.ts +8 -11
- package/tests/engine/unit/engine.test.ts +5 -5
- package/tests/engine/unit/segments/segment_evaluators.test.ts +9 -9
- package/tests/engine/unit/utils/utils.test.ts +2 -2
- package/tests/sdk/analytics.test.ts +8 -13
- package/tests/sdk/data/identity-with-transient-traits.json +41 -0
- package/tests/sdk/data/transient-identity.json +29 -0
- package/tests/sdk/flagsmith-cache.test.ts +16 -32
- package/tests/sdk/flagsmith-environment-flags.test.ts +21 -36
- package/tests/sdk/flagsmith-identity-flags.test.ts +83 -32
- package/tests/sdk/flagsmith.test.ts +67 -99
- package/tests/sdk/offline-handlers.test.ts +5 -6
- package/tests/sdk/polling.test.ts +6 -8
- package/tests/sdk/utils.ts +19 -15
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.esm.json +7 -0
- package/tsconfig.json +8 -4
- package/vitest.config.ts +17 -0
- package/build/flagsmith-engine/environments/util.js +0 -27
- package/build/flagsmith-engine/features/models.js +0 -132
- package/build/flagsmith-engine/features/util.js +0 -27
- package/build/flagsmith-engine/identities/models.js +0 -113
- package/build/flagsmith-engine/identities/util.js +0 -46
- package/build/flagsmith-engine/index.d.ts +0 -14
- package/build/flagsmith-engine/index.js +0 -127
- package/build/flagsmith-engine/organisations/models.js +0 -21
- package/build/flagsmith-engine/organisations/util.js +0 -8
- package/build/flagsmith-engine/projects/util.js +0 -15
- package/build/flagsmith-engine/segments/evaluators.js +0 -45
- package/build/flagsmith-engine/segments/models.js +0 -147
- package/build/flagsmith-engine/utils/collections.js +0 -26
- package/build/flagsmith-engine/utils/errors.js +0 -26
- package/build/flagsmith-engine/utils/hashing/index.js +0 -60
- package/build/index.js +0 -23
- package/build/sdk/analytics.js +0 -120
- package/build/sdk/errors.js +0 -34
- package/build/sdk/index.js +0 -594
- package/build/sdk/models.js +0 -149
- package/build/sdk/offline_handlers.js +0 -66
- package/build/sdk/polling_manager.js +0 -72
- package/build/sdk/utils.d.ts +0 -12
- package/build/sdk/utils.js +0 -107
- package/jest.config.js +0 -5
- package/tests/index.js +0 -0
- /package/build/{flagsmith-engine → cjs/flagsmith-engine}/features/constants.d.ts +0 -0
- /package/build/{flagsmith-engine → cjs/flagsmith-engine}/features/constants.js +0 -0
- /package/build/{flagsmith-engine → cjs/flagsmith-engine}/features/models.d.ts +0 -0
- /package/build/{flagsmith-engine → cjs/flagsmith-engine}/identities/traits/models.d.ts +0 -0
- /package/build/{flagsmith-engine → cjs/flagsmith-engine}/organisations/models.d.ts +0 -0
- /package/build/{flagsmith-engine → cjs/flagsmith-engine}/segments/constants.d.ts +0 -0
- /package/build/{flagsmith-engine → cjs/flagsmith-engine}/segments/constants.js +0 -0
- /package/build/{flagsmith-engine → cjs/flagsmith-engine}/utils/errors.d.ts +0 -0
- /package/build/{flagsmith-engine → cjs/flagsmith-engine}/utils/hashing/index.d.ts +0 -0
- /package/build/{flagsmith-engine → cjs/flagsmith-engine}/utils/index.d.ts +0 -0
- /package/build/{sdk → cjs/sdk}/errors.d.ts +0 -0
- /package/build/{sdk → cjs/sdk}/types.js +0 -0
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
import fetch,
|
|
2
|
-
import { environmentJSON, environmentModel, flagsJSON, flagsmith, identitiesJSON, TestCache } from './utils';
|
|
3
|
-
|
|
4
|
-
jest.mock('node-fetch');
|
|
5
|
-
jest.mock('../../sdk/polling_manager');
|
|
6
|
-
|
|
7
|
-
const { Response } = jest.requireActual('node-fetch');
|
|
1
|
+
import { fetch, environmentJSON, environmentModel, flagsJSON, flagsmith, identitiesJSON, TestCache } from './utils.js';
|
|
8
2
|
|
|
9
3
|
beforeEach(() => {
|
|
10
|
-
|
|
11
|
-
jest.clearAllMocks();
|
|
4
|
+
vi.clearAllMocks();
|
|
12
5
|
});
|
|
13
6
|
|
|
14
7
|
test('test_wrong_cache_interface_throws_an_error', async () => {
|
|
@@ -21,14 +14,13 @@ test('test_wrong_cache_interface_throws_an_error', async () => {
|
|
|
21
14
|
});
|
|
22
15
|
|
|
23
16
|
test('test_empty_cache_not_read_but_populated', async () => {
|
|
24
|
-
|
|
25
|
-
fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
|
|
17
|
+
fetch.mockResolvedValue(new Response(flagsJSON));
|
|
26
18
|
|
|
27
19
|
const cache = new TestCache();
|
|
28
|
-
const set =
|
|
20
|
+
const set = vi.spyOn(cache, 'set');
|
|
29
21
|
|
|
30
22
|
const flg = flagsmith({ cache });
|
|
31
|
-
const allFlags =
|
|
23
|
+
const allFlags = (await flg.getEnvironmentFlags()).allFlags();
|
|
32
24
|
|
|
33
25
|
expect(set).toBeCalled();
|
|
34
26
|
expect(await cache.has('flags')).toBe(true);
|
|
@@ -40,11 +32,10 @@ test('test_empty_cache_not_read_but_populated', async () => {
|
|
|
40
32
|
});
|
|
41
33
|
|
|
42
34
|
test('test_api_not_called_when_cache_present', async () => {
|
|
43
|
-
|
|
44
|
-
fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
|
|
35
|
+
fetch.mockResolvedValue(new Response(flagsJSON));
|
|
45
36
|
|
|
46
37
|
const cache = new TestCache();
|
|
47
|
-
const set =
|
|
38
|
+
const set = vi.spyOn(cache, 'set');
|
|
48
39
|
|
|
49
40
|
const flg = flagsmith({ cache });
|
|
50
41
|
await (await flg.getEnvironmentFlags()).allFlags();
|
|
@@ -60,13 +51,11 @@ test('test_api_not_called_when_cache_present', async () => {
|
|
|
60
51
|
});
|
|
61
52
|
|
|
62
53
|
test('test_api_called_twice_when_no_cache', async () => {
|
|
63
|
-
|
|
64
|
-
fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
|
|
54
|
+
fetch.mockImplementation(() => Promise.resolve(new Response(flagsJSON)));
|
|
65
55
|
|
|
66
56
|
const flg = flagsmith();
|
|
67
57
|
await (await flg.getEnvironmentFlags()).allFlags();
|
|
68
|
-
|
|
69
|
-
fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
|
|
58
|
+
|
|
70
59
|
const allFlags = await (await flg.getEnvironmentFlags()).allFlags();
|
|
71
60
|
|
|
72
61
|
expect(fetch).toBeCalledTimes(2);
|
|
@@ -76,14 +65,13 @@ test('test_api_called_twice_when_no_cache', async () => {
|
|
|
76
65
|
});
|
|
77
66
|
|
|
78
67
|
test('test_get_environment_flags_uses_local_environment_when_available', async () => {
|
|
79
|
-
|
|
80
|
-
fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
|
|
68
|
+
fetch.mockResolvedValue(new Response(flagsJSON));
|
|
81
69
|
|
|
82
70
|
const cache = new TestCache();
|
|
83
|
-
const set =
|
|
71
|
+
const set = vi.spyOn(cache, 'set');
|
|
84
72
|
|
|
85
73
|
const flg = flagsmith({ cache });
|
|
86
|
-
const model = environmentModel(JSON.parse(environmentJSON
|
|
74
|
+
const model = environmentModel(JSON.parse(environmentJSON));
|
|
87
75
|
flg.environment = model;
|
|
88
76
|
|
|
89
77
|
const allFlags = await (await flg.getEnvironmentFlags()).allFlags();
|
|
@@ -96,11 +84,10 @@ test('test_get_environment_flags_uses_local_environment_when_available', async (
|
|
|
96
84
|
});
|
|
97
85
|
|
|
98
86
|
test('test_cache_used_for_identity_flags', async () => {
|
|
99
|
-
|
|
100
|
-
fetch.mockReturnValue(Promise.resolve(new Response(identitiesJSON())));
|
|
87
|
+
fetch.mockResolvedValue(new Response(identitiesJSON));
|
|
101
88
|
|
|
102
89
|
const cache = new TestCache();
|
|
103
|
-
const set =
|
|
90
|
+
const set = vi.spyOn(cache, 'set');
|
|
104
91
|
|
|
105
92
|
const identifier = 'identifier';
|
|
106
93
|
const traits = { some_trait: 'some_value' };
|
|
@@ -120,11 +107,10 @@ test('test_cache_used_for_identity_flags', async () => {
|
|
|
120
107
|
});
|
|
121
108
|
|
|
122
109
|
test('test_cache_used_for_identity_flags_local_evaluation', async () => {
|
|
123
|
-
|
|
124
|
-
fetch.mockReturnValue(Promise.resolve(new Response(environmentJSON())));
|
|
110
|
+
fetch.mockResolvedValue(new Response(environmentJSON));
|
|
125
111
|
|
|
126
112
|
const cache = new TestCache();
|
|
127
|
-
const set =
|
|
113
|
+
const set = vi.spyOn(cache, 'set');
|
|
128
114
|
|
|
129
115
|
const identifier = 'identifier';
|
|
130
116
|
const traits = { some_trait: 'some_value' };
|
|
@@ -146,5 +132,3 @@ test('test_cache_used_for_identity_flags_local_evaluation', async () => {
|
|
|
146
132
|
expect(identityFlags[0].value).toBe('some-value');
|
|
147
133
|
expect(identityFlags[0].featureName).toBe('some_feature');
|
|
148
134
|
});
|
|
149
|
-
|
|
150
|
-
test('test_cache_used_for_all_flags', async () => { });
|
|
@@ -1,20 +1,15 @@
|
|
|
1
|
-
import Flagsmith from '../../sdk';
|
|
2
|
-
import fetch from '
|
|
3
|
-
import {
|
|
4
|
-
import { DefaultFlag } from '../../sdk/models';
|
|
1
|
+
import Flagsmith from '../../sdk/index.js';
|
|
2
|
+
import { environmentJSON, environmentModel, flagsJSON, flagsmith, fetch } from './utils.js';
|
|
3
|
+
import { DefaultFlag } from '../../sdk/models.js';
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
jest.mock('../../sdk/polling_manager');
|
|
8
|
-
const { Response } = jest.requireActual('node-fetch');
|
|
5
|
+
vi.mock('../../sdk/polling_manager');
|
|
9
6
|
|
|
10
7
|
beforeEach(() => {
|
|
11
|
-
|
|
12
|
-
jest.clearAllMocks();
|
|
8
|
+
vi.clearAllMocks();
|
|
13
9
|
});
|
|
14
10
|
|
|
15
11
|
test('test_get_environment_flags_calls_api_when_no_local_environment', async () => {
|
|
16
|
-
|
|
17
|
-
fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
|
|
12
|
+
fetch.mockResolvedValue(new Response(flagsJSON));
|
|
18
13
|
|
|
19
14
|
const flg = flagsmith();
|
|
20
15
|
const allFlags = await (await flg.getEnvironmentFlags()).allFlags();
|
|
@@ -26,11 +21,10 @@ test('test_get_environment_flags_calls_api_when_no_local_environment', async ()
|
|
|
26
21
|
});
|
|
27
22
|
|
|
28
23
|
test('test_get_environment_flags_uses_local_environment_when_available', async () => {
|
|
29
|
-
|
|
30
|
-
fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
|
|
24
|
+
fetch.mockResolvedValue(new Response(flagsJSON));
|
|
31
25
|
|
|
32
26
|
const flg = flagsmith();
|
|
33
|
-
const model = environmentModel(JSON.parse(environmentJSON
|
|
27
|
+
const model = environmentModel(JSON.parse(environmentJSON));
|
|
34
28
|
flg.environment = model;
|
|
35
29
|
|
|
36
30
|
const allFlags = await (await flg.getEnvironmentFlags()).allFlags();
|
|
@@ -41,8 +35,7 @@ test('test_get_environment_flags_uses_local_environment_when_available', async (
|
|
|
41
35
|
});
|
|
42
36
|
|
|
43
37
|
test('test_default_flag_is_used_when_no_environment_flags_returned', async () => {
|
|
44
|
-
|
|
45
|
-
fetch.mockReturnValue(Promise.resolve(new Response(JSON.stringify([]))));
|
|
38
|
+
fetch.mockResolvedValue(new Response(JSON.stringify([])));
|
|
46
39
|
|
|
47
40
|
const defaultFlag = new DefaultFlag('some-default-value', true);
|
|
48
41
|
|
|
@@ -64,14 +57,13 @@ test('test_default_flag_is_used_when_no_environment_flags_returned', async () =>
|
|
|
64
57
|
});
|
|
65
58
|
|
|
66
59
|
test('test_analytics_processor_tracks_flags', async () => {
|
|
67
|
-
|
|
68
|
-
fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
|
|
60
|
+
fetch.mockResolvedValue(new Response(flagsJSON));
|
|
69
61
|
|
|
70
62
|
const defaultFlag = new DefaultFlag('some-default-value', true);
|
|
71
63
|
|
|
72
64
|
const defaultFlagHandler = (featureName: string) => defaultFlag;
|
|
73
65
|
|
|
74
|
-
const flg =
|
|
66
|
+
const flg = flagsmith({
|
|
75
67
|
environmentKey: 'key',
|
|
76
68
|
defaultFlagHandler: defaultFlagHandler,
|
|
77
69
|
enableAnalytics: true,
|
|
@@ -86,14 +78,13 @@ test('test_analytics_processor_tracks_flags', async () => {
|
|
|
86
78
|
});
|
|
87
79
|
|
|
88
80
|
test('test_getFeatureValue', async () => {
|
|
89
|
-
|
|
90
|
-
fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
|
|
81
|
+
fetch.mockResolvedValue(new Response(flagsJSON));
|
|
91
82
|
|
|
92
83
|
const defaultFlag = new DefaultFlag('some-default-value', true);
|
|
93
84
|
|
|
94
85
|
const defaultFlagHandler = (featureName: string) => defaultFlag;
|
|
95
86
|
|
|
96
|
-
const flg =
|
|
87
|
+
const flg = flagsmith({
|
|
97
88
|
environmentKey: 'key',
|
|
98
89
|
defaultFlagHandler: defaultFlagHandler,
|
|
99
90
|
enableAnalytics: true,
|
|
@@ -106,11 +97,9 @@ test('test_getFeatureValue', async () => {
|
|
|
106
97
|
});
|
|
107
98
|
|
|
108
99
|
test('test_throws_when_no_default_flag_handler_after_multiple_API_errors', async () => {
|
|
109
|
-
fetch
|
|
110
|
-
// @ts-ignore
|
|
111
|
-
.mockRejectedValue(new Error('Error during fetching the API response'));
|
|
100
|
+
fetch.mockRejectedValue('Error during fetching the API response');
|
|
112
101
|
|
|
113
|
-
const flg =
|
|
102
|
+
const flg = flagsmith({
|
|
114
103
|
environmentKey: 'key',
|
|
115
104
|
});
|
|
116
105
|
|
|
@@ -124,8 +113,7 @@ test('test_non_200_response_raises_flagsmith_api_error', async () => {
|
|
|
124
113
|
const errorResponse403 = new Response('403 Forbidden', {
|
|
125
114
|
status: 403
|
|
126
115
|
});
|
|
127
|
-
|
|
128
|
-
fetch.mockReturnValue(Promise.resolve(errorResponse403));
|
|
116
|
+
fetch.mockResolvedValue(errorResponse403);
|
|
129
117
|
|
|
130
118
|
const flg = new Flagsmith({
|
|
131
119
|
environmentKey: 'some'
|
|
@@ -134,14 +122,13 @@ test('test_non_200_response_raises_flagsmith_api_error', async () => {
|
|
|
134
122
|
await expect(flg.getEnvironmentFlags()).rejects.toThrow();
|
|
135
123
|
});
|
|
136
124
|
test('test_default_flag_is_not_used_when_environment_flags_returned', async () => {
|
|
137
|
-
|
|
138
|
-
fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
|
|
125
|
+
fetch.mockResolvedValue(new Response(flagsJSON));
|
|
139
126
|
|
|
140
127
|
const defaultFlag = new DefaultFlag('some-default-value', true);
|
|
141
128
|
|
|
142
129
|
const defaultFlagHandler = (featureName: string) => defaultFlag;
|
|
143
130
|
|
|
144
|
-
const flg =
|
|
131
|
+
const flg = flagsmith({
|
|
145
132
|
environmentKey: 'key',
|
|
146
133
|
defaultFlagHandler: defaultFlagHandler
|
|
147
134
|
});
|
|
@@ -155,8 +142,7 @@ test('test_default_flag_is_not_used_when_environment_flags_returned', async () =
|
|
|
155
142
|
});
|
|
156
143
|
|
|
157
144
|
test('test_default_flag_is_used_when_bad_api_response_happens', async () => {
|
|
158
|
-
|
|
159
|
-
fetch.mockReturnValue(Promise.resolve(new Response('bad-data')));
|
|
145
|
+
fetch.mockResolvedValue(new Response('bad-data'));
|
|
160
146
|
|
|
161
147
|
const defaultFlag = new DefaultFlag('some-default-value', true);
|
|
162
148
|
|
|
@@ -175,14 +161,13 @@ test('test_default_flag_is_used_when_bad_api_response_happens', async () => {
|
|
|
175
161
|
});
|
|
176
162
|
|
|
177
163
|
test('test_local_evaluation', async () => {
|
|
178
|
-
|
|
179
|
-
fetch.mockReturnValue(Promise.resolve(new Response(environmentJSON())));
|
|
164
|
+
fetch.mockResolvedValue(new Response(environmentJSON));
|
|
180
165
|
|
|
181
166
|
const defaultFlag = new DefaultFlag('some-default-value', true);
|
|
182
167
|
|
|
183
168
|
const defaultFlagHandler = (featureName: string) => defaultFlag;
|
|
184
169
|
|
|
185
|
-
const flg =
|
|
170
|
+
const flg = flagsmith({
|
|
186
171
|
environmentKey: 'ser.key',
|
|
187
172
|
enableLocalEvaluation: true,
|
|
188
173
|
defaultFlagHandler: defaultFlagHandler
|
|
@@ -1,21 +1,16 @@
|
|
|
1
|
-
import Flagsmith from '../../sdk';
|
|
2
|
-
import fetch from '
|
|
3
|
-
import {
|
|
4
|
-
import { DefaultFlag } from '../../sdk/models';
|
|
1
|
+
import Flagsmith from '../../sdk/index.js';
|
|
2
|
+
import { fetch, environmentJSON, flagsmith, identitiesJSON, identityWithTransientTraitsJSON, transientIdentityJSON } from './utils.js';
|
|
3
|
+
import { DefaultFlag } from '../../sdk/models.js';
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
jest.mock('../../sdk/polling_manager');
|
|
8
|
-
const { Response } = jest.requireActual('node-fetch');
|
|
5
|
+
vi.mock('../../sdk/polling_manager');
|
|
9
6
|
|
|
10
7
|
beforeEach(() => {
|
|
11
|
-
|
|
12
|
-
jest.clearAllMocks();
|
|
8
|
+
vi.clearAllMocks();
|
|
13
9
|
});
|
|
14
10
|
|
|
15
11
|
|
|
16
12
|
test('test_get_identity_flags_calls_api_when_no_local_environment_no_traits', async () => {
|
|
17
|
-
|
|
18
|
-
fetch.mockReturnValue(Promise.resolve(new Response(identitiesJSON())));
|
|
13
|
+
fetch.mockResolvedValue(new Response(identitiesJSON));
|
|
19
14
|
const identifier = 'identifier';
|
|
20
15
|
|
|
21
16
|
const flg = flagsmith();
|
|
@@ -28,14 +23,12 @@ test('test_get_identity_flags_calls_api_when_no_local_environment_no_traits', as
|
|
|
28
23
|
});
|
|
29
24
|
|
|
30
25
|
test('test_get_identity_flags_uses_environment_when_local_environment_no_traits', async () => {
|
|
31
|
-
|
|
32
|
-
fetch.mockReturnValue(Promise.resolve(new Response(environmentJSON())));
|
|
26
|
+
fetch.mockResolvedValue(new Response(environmentJSON))
|
|
33
27
|
const identifier = 'identifier';
|
|
34
28
|
|
|
35
29
|
const flg = flagsmith({
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
environmentKey: 'ser.key',
|
|
31
|
+
enableLocalEvaluation: true,
|
|
39
32
|
});
|
|
40
33
|
|
|
41
34
|
|
|
@@ -47,8 +40,7 @@ test('test_get_identity_flags_uses_environment_when_local_environment_no_traits'
|
|
|
47
40
|
});
|
|
48
41
|
|
|
49
42
|
test('test_get_identity_flags_calls_api_when_no_local_environment_with_traits', async () => {
|
|
50
|
-
|
|
51
|
-
fetch.mockReturnValue(Promise.resolve(new Response(identitiesJSON())));
|
|
43
|
+
fetch.mockResolvedValue(new Response(identitiesJSON))
|
|
52
44
|
const identifier = 'identifier';
|
|
53
45
|
const traits = { some_trait: 'some_value' };
|
|
54
46
|
const flg = flagsmith();
|
|
@@ -61,14 +53,13 @@ test('test_get_identity_flags_calls_api_when_no_local_environment_with_traits',
|
|
|
61
53
|
});
|
|
62
54
|
|
|
63
55
|
test('test_default_flag_is_not_used_when_identity_flags_returned', async () => {
|
|
64
|
-
|
|
65
|
-
fetch.mockReturnValue(Promise.resolve(new Response(identitiesJSON())));
|
|
56
|
+
fetch.mockResolvedValue(new Response(identitiesJSON))
|
|
66
57
|
|
|
67
58
|
const defaultFlag = new DefaultFlag('some-default-value', true);
|
|
68
59
|
|
|
69
60
|
const defaultFlagHandler = (featureName: string) => defaultFlag;
|
|
70
61
|
|
|
71
|
-
const flg =
|
|
62
|
+
const flg = flagsmith({
|
|
72
63
|
environmentKey: 'key',
|
|
73
64
|
defaultFlagHandler: defaultFlagHandler
|
|
74
65
|
});
|
|
@@ -82,8 +73,7 @@ test('test_default_flag_is_not_used_when_identity_flags_returned', async () => {
|
|
|
82
73
|
});
|
|
83
74
|
|
|
84
75
|
test('test_default_flag_is_used_when_no_identity_flags_returned', async () => {
|
|
85
|
-
|
|
86
|
-
fetch.mockReturnValue(Promise.resolve(new Response(JSON.stringify({ flags: [], traits: [] }))));
|
|
76
|
+
fetch.mockResolvedValue(new Response(JSON.stringify({ flags: [], traits: [] })));
|
|
87
77
|
|
|
88
78
|
const defaultFlag = new DefaultFlag('some-default-value', true);
|
|
89
79
|
const defaultFlagHandler = (featureName: string) => defaultFlag;
|
|
@@ -102,8 +92,7 @@ test('test_default_flag_is_used_when_no_identity_flags_returned', async () => {
|
|
|
102
92
|
});
|
|
103
93
|
|
|
104
94
|
test('test_default_flag_is_used_when_no_identity_flags_returned_due_to_error', async () => {
|
|
105
|
-
|
|
106
|
-
fetch.mockReturnValue(Promise.resolve(new Response('bad data')));
|
|
95
|
+
fetch.mockResolvedValue(new Response('bad data'))
|
|
107
96
|
|
|
108
97
|
const defaultFlag = new DefaultFlag('some-default-value', true);
|
|
109
98
|
const defaultFlagHandler = (featureName: string) => defaultFlag;
|
|
@@ -122,12 +111,10 @@ test('test_default_flag_is_used_when_no_identity_flags_returned_due_to_error', a
|
|
|
122
111
|
});
|
|
123
112
|
|
|
124
113
|
test('test_default_flag_is_used_when_no_identity_flags_returned_and_no_custom_default_flag_handler', async () => {
|
|
125
|
-
|
|
126
|
-
fetch.mockReturnValue(Promise.resolve(new Response(JSON.stringify({ flags: [], traits: [] }))));
|
|
127
|
-
|
|
114
|
+
fetch.mockResolvedValue(new Response(JSON.stringify({ flags: [], traits: [] })))
|
|
128
115
|
|
|
129
|
-
const flg =
|
|
130
|
-
|
|
116
|
+
const flg = flagsmith({
|
|
117
|
+
environmentKey: 'key',
|
|
131
118
|
});
|
|
132
119
|
|
|
133
120
|
const flags = await flg.getIdentityFlags('identifier');
|
|
@@ -140,8 +127,7 @@ test('test_default_flag_is_used_when_no_identity_flags_returned_and_no_custom_de
|
|
|
140
127
|
|
|
141
128
|
|
|
142
129
|
test('test_get_identity_flags_multivariate_value_with_local_evaluation_enabled', async () => {
|
|
143
|
-
|
|
144
|
-
fetch.mockReturnValue(Promise.resolve(new Response(environmentJSON())));
|
|
130
|
+
fetch.mockResolvedValue(new Response(environmentJSON));
|
|
145
131
|
const identifier = 'identifier';
|
|
146
132
|
|
|
147
133
|
const flg = flagsmith({
|
|
@@ -155,3 +141,68 @@ test('test_get_identity_flags_multivariate_value_with_local_evaluation_enabled',
|
|
|
155
141
|
expect(identityFlags.getFeatureValue('mv_feature')).toBe('bar');
|
|
156
142
|
expect(identityFlags.isFeatureEnabled('mv_feature')).toBe(false);
|
|
157
143
|
});
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
test('test_transient_identity', async () => {
|
|
147
|
+
fetch.mockResolvedValue(new Response(transientIdentityJSON));
|
|
148
|
+
const identifier = 'transient_identifier';
|
|
149
|
+
const traits = { some_trait: 'some_value' };
|
|
150
|
+
const traitsInRequest = [{trait_key:Object.keys(traits)[0],trait_value:traits.some_trait}]
|
|
151
|
+
const transient = true;
|
|
152
|
+
const flg = flagsmith();
|
|
153
|
+
const identityFlags = (await flg.getIdentityFlags(identifier, traits, transient)).allFlags();
|
|
154
|
+
|
|
155
|
+
expect(fetch).toHaveBeenCalledWith(
|
|
156
|
+
`https://edge.api.flagsmith.com/api/v1/identities/`,
|
|
157
|
+
expect.objectContaining({
|
|
158
|
+
method: 'POST',
|
|
159
|
+
headers: { 'Content-Type': 'application/json', 'X-Environment-Key': 'sometestfakekey' },
|
|
160
|
+
body: JSON.stringify({identifier, traits: traitsInRequest, transient })
|
|
161
|
+
}
|
|
162
|
+
));
|
|
163
|
+
|
|
164
|
+
expect(identityFlags[0].enabled).toBe(false);
|
|
165
|
+
expect(identityFlags[0].value).toBe('some-transient-identity-value');
|
|
166
|
+
expect(identityFlags[0].featureName).toBe('some_feature');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
test('test_identity_with_transient_traits', async () => {
|
|
171
|
+
fetch.mockResolvedValue(new Response(identityWithTransientTraitsJSON));
|
|
172
|
+
const identifier = 'transient_trait_identifier';
|
|
173
|
+
const traits = {
|
|
174
|
+
some_trait: 'some_value',
|
|
175
|
+
another_trait: {value: 'another_value', transient: true},
|
|
176
|
+
explicitly_non_transient_trait: {value: 'non_transient_value', transient: false}
|
|
177
|
+
}
|
|
178
|
+
const traitsInRequest = [
|
|
179
|
+
{
|
|
180
|
+
trait_key:Object.keys(traits)[0],
|
|
181
|
+
trait_value:traits.some_trait,
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
trait_key:Object.keys(traits)[1],
|
|
185
|
+
trait_value:traits.another_trait.value,
|
|
186
|
+
transient: true,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
trait_key:Object.keys(traits)[2],
|
|
190
|
+
trait_value:traits.explicitly_non_transient_trait.value,
|
|
191
|
+
transient: false,
|
|
192
|
+
},
|
|
193
|
+
]
|
|
194
|
+
const flg = flagsmith();
|
|
195
|
+
|
|
196
|
+
const identityFlags = (await flg.getIdentityFlags(identifier, traits)).allFlags();
|
|
197
|
+
expect(fetch).toHaveBeenCalledWith(
|
|
198
|
+
`https://edge.api.flagsmith.com/api/v1/identities/`,
|
|
199
|
+
expect.objectContaining({
|
|
200
|
+
method: 'POST',
|
|
201
|
+
headers: { 'Content-Type': 'application/json', 'X-Environment-Key': 'sometestfakekey' },
|
|
202
|
+
body: JSON.stringify({identifier, traits: traitsInRequest})
|
|
203
|
+
})
|
|
204
|
+
);
|
|
205
|
+
expect(identityFlags[0].enabled).toBe(true);
|
|
206
|
+
expect(identityFlags[0].value).toBe('some-identity-with-transient-trait-value');
|
|
207
|
+
expect(identityFlags[0].featureName).toBe('some_feature');
|
|
208
|
+
});
|