-
-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathanalytics.featureFlags.service.unit.tests.js
More file actions
126 lines (93 loc) · 4.18 KB
/
Copy pathanalytics.featureFlags.service.unit.tests.js
File metadata and controls
126 lines (93 loc) · 4.18 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
117
118
119
120
121
122
123
124
125
126
/**
* Module dependencies.
*/
import { jest, beforeEach, afterEach, describe, test, expect } from '@jest/globals';
/**
* Unit tests for analytics feature flags service
*/
describe('Analytics feature flags service unit tests:', () => {
let FeatureFlagsService;
let mockAnalyticsService;
beforeEach(async () => {
jest.resetModules();
mockAnalyticsService = {
isFeatureEnabled: jest.fn(),
getFeatureFlag: jest.fn(),
};
jest.unstable_mockModule('../services/analytics.service.js', () => ({
default: mockAnalyticsService,
}));
const mod = await import('../services/analytics.featureFlags.service.js');
FeatureFlagsService = mod.default;
});
afterEach(() => {
jest.restoreAllMocks();
});
describe('isEnabled', () => {
test('should return true when flag is enabled', async () => {
mockAnalyticsService.isFeatureEnabled.mockResolvedValue(true);
const result = await FeatureFlagsService.isEnabled('my-flag', 'user-1');
expect(result).toBe(true);
expect(mockAnalyticsService.isFeatureEnabled).toHaveBeenCalledWith('my-flag', 'user-1', {});
});
test('should return false when flag is disabled', async () => {
mockAnalyticsService.isFeatureEnabled.mockResolvedValue(false);
const result = await FeatureFlagsService.isEnabled('my-flag', 'user-1');
expect(result).toBe(false);
});
test('should return false when analytics is not configured (undefined)', async () => {
mockAnalyticsService.isFeatureEnabled.mockResolvedValue(undefined);
const result = await FeatureFlagsService.isEnabled('my-flag', 'user-1');
expect(result).toBe(false);
});
test('should pass personProperties and groups to analytics service', async () => {
mockAnalyticsService.isFeatureEnabled.mockResolvedValue(true);
await FeatureFlagsService.isEnabled('my-flag', 'user-1', {
personProperties: { plan: 'pro' },
groups: { company: 'org-1' },
groupProperties: { company: { plan: 'enterprise' } },
});
expect(mockAnalyticsService.isFeatureEnabled).toHaveBeenCalledWith('my-flag', 'user-1', {
personProperties: { plan: 'pro' },
groups: { company: 'org-1' },
groupProperties: { company: { plan: 'enterprise' } },
});
});
test('should omit undefined option keys from PostHog options', async () => {
mockAnalyticsService.isFeatureEnabled.mockResolvedValue(false);
await FeatureFlagsService.isEnabled('my-flag', 'user-1', {});
expect(mockAnalyticsService.isFeatureEnabled).toHaveBeenCalledWith('my-flag', 'user-1', {});
});
});
describe('getVariant', () => {
test('should return variant string when flag has multivariate value', async () => {
mockAnalyticsService.getFeatureFlag.mockResolvedValue('variant-a');
const result = await FeatureFlagsService.getVariant('my-flag', 'user-1');
expect(result).toBe('variant-a');
expect(mockAnalyticsService.getFeatureFlag).toHaveBeenCalledWith('my-flag', 'user-1', {});
});
test('should return boolean when flag is a simple toggle', async () => {
mockAnalyticsService.getFeatureFlag.mockResolvedValue(false);
const result = await FeatureFlagsService.getVariant('my-flag', 'user-1');
expect(result).toBe(false);
});
test('should return undefined when analytics is not configured', async () => {
mockAnalyticsService.getFeatureFlag.mockResolvedValue(undefined);
const result = await FeatureFlagsService.getVariant('my-flag', 'user-1');
expect(result).toBeUndefined();
});
test('should pass personProperties, groups, and groupProperties', async () => {
mockAnalyticsService.getFeatureFlag.mockResolvedValue('variant-b');
await FeatureFlagsService.getVariant('my-flag', 'user-1', {
personProperties: { email: 'a@b.com' },
groups: { company: 'org-1' },
groupProperties: { company: { name: 'Acme' } },
});
expect(mockAnalyticsService.getFeatureFlag).toHaveBeenCalledWith('my-flag', 'user-1', {
personProperties: { email: 'a@b.com' },
groups: { company: 'org-1' },
groupProperties: { company: { name: 'Acme' } },
});
});
});
});