flagsmith-nodejs
Version:
Flagsmith lets you manage features flags and remote config across web, mobile and server side applications. Deliver true Continuous Integration. Get builds out faster. Control who has access to new features.
183 lines (139 loc) • 5.88 kB
text/typescript
import Flagsmith from '../../sdk/index.js';
import { environmentJSON, environmentModel, flagsJSON, flagsmith, fetch } from './utils.js';
import { DefaultFlag } from '../../sdk/models.js';
import { getUserAgent } from '../../sdk/utils.js';
vi.mock('../../sdk/polling_manager');
test('test_get_environment_flags_calls_api_when_no_local_environment', async () => {
const flg = flagsmith();
const allFlags = await (await flg.getEnvironmentFlags()).allFlags();
expect(fetch).toBeCalledTimes(1);
expect(allFlags[0].enabled).toBe(true);
expect(allFlags[0].value).toBe('some-value');
expect(allFlags[0].featureName).toBe('some_feature');
});
test('test_default_flag_is_used_when_no_environment_flags_returned', async () => {
fetch.mockResolvedValue(new Response(JSON.stringify([])));
const defaultFlag = new DefaultFlag('some-default-value', true);
const defaultFlagHandler = (featureName: string) => defaultFlag;
const flg = new Flagsmith({
environmentKey: 'key',
defaultFlagHandler: defaultFlagHandler,
customHeaders: {
'X-Test-Header': '1'
}
});
const flags = await flg.getEnvironmentFlags();
const flag = flags.getFlag('some_feature');
expect(flag.isDefault).toBe(true);
expect(flag.enabled).toBe(defaultFlag.enabled);
expect(flag.value).toBe(defaultFlag.value);
});
test('test_analytics_processor_tracks_flags', async () => {
const defaultFlag = new DefaultFlag('some-default-value', true);
const defaultFlagHandler = (featureName: string) => defaultFlag;
const flg = flagsmith({
environmentKey: 'key',
defaultFlagHandler: defaultFlagHandler,
enableAnalytics: true
});
const flags = await flg.getEnvironmentFlags();
const flag = flags.getFlag('some_feature');
expect(flag.isDefault).toBe(false);
expect(flag.enabled).toBe(true);
expect(flag.value).toBe('some-value');
});
test('test_getFeatureValue', async () => {
const defaultFlag = new DefaultFlag('some-default-value', true);
const defaultFlagHandler = (featureName: string) => defaultFlag;
const flg = flagsmith({
environmentKey: 'key',
defaultFlagHandler: defaultFlagHandler,
enableAnalytics: true
});
const flags = await flg.getEnvironmentFlags();
const featureValue = flags.getFeatureValue('some_feature');
expect(featureValue).toBe('some-value');
});
test('test_user_agent_is_set_when_fetching_environment_flags', async () => {
const defaultFlag = new DefaultFlag('some-default-value', true);
const defaultFlagHandler = (featureName: string) => defaultFlag;
const flg = flagsmith({
environmentKey: 'key',
defaultFlagHandler: defaultFlagHandler,
enableAnalytics: true
});
const flags = await flg.getEnvironmentFlags();
const featureValue = flags.getFeatureValue('some_feature');
expect(featureValue).toBe('some-value');
expect(fetch).toHaveBeenCalledWith(
`https://edge.api.flagsmith.com/api/v1/flags/`,
expect.objectContaining({
method: 'GET',
headers: {
'Content-Type': 'application/json',
'X-Environment-Key': 'key',
'User-Agent': getUserAgent()
}
})
);
});
test('test_throws_when_no_default_flag_handler_after_multiple_API_errors', async () => {
fetch.mockRejectedValue('Error during fetching the API response');
const flg = flagsmith({
environmentKey: 'key'
});
await expect(async () => {
const flags = await flg.getEnvironmentFlags();
const flag = flags.getFlag('some_feature');
}).rejects.toThrow('getEnvironmentFlags failed and no default flag handler was provided');
});
test('test_non_200_response_raises_flagsmith_api_error', async () => {
const errorResponse403 = new Response('403 Forbidden', {
status: 403
});
fetch.mockResolvedValue(errorResponse403);
const flg = new Flagsmith({
environmentKey: 'some'
});
await expect(flg.getEnvironmentFlags()).rejects.toThrow();
});
test('test_default_flag_is_not_used_when_environment_flags_returned', async () => {
const defaultFlag = new DefaultFlag('some-default-value', true);
const defaultFlagHandler = (featureName: string) => defaultFlag;
const flg = flagsmith({
environmentKey: 'key',
defaultFlagHandler: defaultFlagHandler
});
const flags = await flg.getEnvironmentFlags();
const flag = flags.getFlag('some_feature');
expect(flag.isDefault).toBe(false);
expect(flag.value).not.toBe(defaultFlag.value);
expect(flag.value).toBe('some-value');
});
test('test_default_flag_is_used_when_bad_api_response_happens', async () => {
fetch.mockResolvedValue(new Response('bad-data'));
const defaultFlag = new DefaultFlag('some-default-value', true);
const defaultFlagHandler = (featureName: string) => defaultFlag;
const flg = new Flagsmith({
environmentKey: 'key',
defaultFlagHandler: defaultFlagHandler
});
const flags = await flg.getEnvironmentFlags();
const flag = flags.getFlag('some_feature');
expect(flag.isDefault).toBe(true);
expect(flag.value).toBe(defaultFlag.value);
});
test('test_local_evaluation', async () => {
const defaultFlag = new DefaultFlag('some-default-value', true);
const defaultFlagHandler = (featureName: string) => defaultFlag;
const flg = flagsmith({
environmentKey: 'ser.key',
enableLocalEvaluation: true,
defaultFlagHandler: defaultFlagHandler
});
const flags = await flg.getEnvironmentFlags();
const flag = flags.getFlag('some_feature');
expect(flag.isDefault).toBe(false);
expect(flag.value).not.toBe(defaultFlag.value);
expect(flag.value).toBe('some-value');
});