|
@@ -1,25 +1,33 @@
|
|
|
import {OrganizationFixture} from 'sentry-fixture/organization';
|
|
|
+import {ProjectFixture} from 'sentry-fixture/project';
|
|
|
|
|
|
+import type {Organization} from 'sentry/types/organization';
|
|
|
+import type {Project} from 'sentry/types/project';
|
|
|
import FeatureObserver from 'sentry/utils/featureObserver';
|
|
|
|
|
|
describe('FeatureObserver', () => {
|
|
|
- let organization;
|
|
|
+ let organization: Organization;
|
|
|
+ let project: Project;
|
|
|
+
|
|
|
beforeEach(() => {
|
|
|
organization = OrganizationFixture({
|
|
|
features: ['enable-issues', 'enable-profiling', 'enable-replay'],
|
|
|
});
|
|
|
+ project = ProjectFixture({
|
|
|
+ features: ['enable-proj-flag', 'enable-performance'],
|
|
|
+ });
|
|
|
});
|
|
|
|
|
|
- describe('observeFlags', () => {
|
|
|
- it('should add recently evaluated flags to the flag queue', () => {
|
|
|
- const inst = new FeatureObserver();
|
|
|
+ describe('observeOrganizationFlags', () => {
|
|
|
+ it('should add recently evaluated org flags to the flag queue', () => {
|
|
|
+ const inst = new FeatureObserver({bufferSize: 3});
|
|
|
expect(organization.features).toEqual([
|
|
|
'enable-issues',
|
|
|
'enable-profiling',
|
|
|
'enable-replay',
|
|
|
]);
|
|
|
|
|
|
- inst.observeFlags({organization, bufferSize: 3});
|
|
|
+ inst.observeOrganizationFlags({organization});
|
|
|
expect(inst.getFeatureFlags().values).toEqual([]);
|
|
|
|
|
|
organization.features.includes('enable-issues');
|
|
@@ -41,8 +49,8 @@ describe('FeatureObserver', () => {
|
|
|
});
|
|
|
|
|
|
it('should remove duplicate flags with a full queue', () => {
|
|
|
- const inst = new FeatureObserver();
|
|
|
- inst.observeFlags({organization, bufferSize: 3});
|
|
|
+ const inst = new FeatureObserver({bufferSize: 3});
|
|
|
+ inst.observeOrganizationFlags({organization});
|
|
|
expect(inst.getFeatureFlags().values).toEqual([]);
|
|
|
|
|
|
organization.features.includes('enable-issues');
|
|
@@ -81,8 +89,8 @@ describe('FeatureObserver', () => {
|
|
|
});
|
|
|
|
|
|
it('should remove duplicate flags with an unfilled queue', () => {
|
|
|
- const inst = new FeatureObserver();
|
|
|
- inst.observeFlags({organization, bufferSize: 3});
|
|
|
+ const inst = new FeatureObserver({bufferSize: 3});
|
|
|
+ inst.observeOrganizationFlags({organization});
|
|
|
expect(inst.getFeatureFlags().values).toEqual([]);
|
|
|
|
|
|
organization.features.includes('enable-issues');
|
|
@@ -110,8 +118,8 @@ describe('FeatureObserver', () => {
|
|
|
});
|
|
|
|
|
|
it('should not change the functionality of `includes`', () => {
|
|
|
- const inst = new FeatureObserver();
|
|
|
- inst.observeFlags({organization, bufferSize: 3});
|
|
|
+ const inst = new FeatureObserver({bufferSize: 3});
|
|
|
+ inst.observeOrganizationFlags({organization});
|
|
|
expect(inst.getFeatureFlags().values).toEqual([]);
|
|
|
|
|
|
organization.features.includes('enable-issues');
|
|
@@ -125,4 +133,119 @@ describe('FeatureObserver', () => {
|
|
|
expect(organization.features.includes('replay-mobile-ui')).toBe(false);
|
|
|
});
|
|
|
});
|
|
|
+
|
|
|
+ describe('observeProjectFlags', () => {
|
|
|
+ it('should add recently evaluated proj flags to the flag queue', () => {
|
|
|
+ const inst = new FeatureObserver({bufferSize: 3});
|
|
|
+ expect(project.features).toEqual(['enable-proj-flag', 'enable-performance']);
|
|
|
+
|
|
|
+ inst.observeProjectFlags({project});
|
|
|
+ expect(inst.getFeatureFlags().values).toEqual([]);
|
|
|
+
|
|
|
+ project.features.includes('enable-proj-flag');
|
|
|
+ project.features.includes('replay-mobile-ui');
|
|
|
+ expect(inst.getFeatureFlags().values).toEqual([
|
|
|
+ {flag: 'feature.projects:enable-proj-flag', result: true},
|
|
|
+ {flag: 'feature.projects:replay-mobile-ui', result: false},
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // do more evaluations to fill up and overflow the buffer
|
|
|
+ project.features.includes('enable-performance');
|
|
|
+ project.features.includes('autofix-ui');
|
|
|
+ project.features.includes('new-issue-details');
|
|
|
+ expect(inst.getFeatureFlags().values).toEqual([
|
|
|
+ {flag: 'feature.projects:enable-performance', result: true},
|
|
|
+ {flag: 'feature.projects:autofix-ui', result: false},
|
|
|
+ {flag: 'feature.projects:new-issue-details', result: false},
|
|
|
+ ]);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('should not change the functionality of `includes`', () => {
|
|
|
+ const inst = new FeatureObserver({bufferSize: 3});
|
|
|
+ inst.observeProjectFlags({project});
|
|
|
+ expect(inst.getFeatureFlags().values).toEqual([]);
|
|
|
+
|
|
|
+ project.features.includes('enable-proj-flag');
|
|
|
+ project.features.includes('replay-mobile-ui');
|
|
|
+ expect(inst.getFeatureFlags().values).toEqual([
|
|
|
+ {flag: 'feature.projects:enable-proj-flag', result: true},
|
|
|
+ {flag: 'feature.projects:replay-mobile-ui', result: false},
|
|
|
+ ]);
|
|
|
+
|
|
|
+ expect(project.features.includes('enable-proj-flag')).toBe(true);
|
|
|
+ expect(project.features.includes('replay-mobile-ui')).toBe(false);
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('observeProjectFlags and observeOrganizationFlags', () => {
|
|
|
+ it('should add recently evaluated org and proj flags to the flag queue', () => {
|
|
|
+ const inst = new FeatureObserver({bufferSize: 3});
|
|
|
+ expect(project.features).toEqual(['enable-proj-flag', 'enable-performance']);
|
|
|
+ expect(organization.features).toEqual([
|
|
|
+ 'enable-issues',
|
|
|
+ 'enable-profiling',
|
|
|
+ 'enable-replay',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ inst.observeProjectFlags({project});
|
|
|
+ inst.observeOrganizationFlags({organization});
|
|
|
+ expect(inst.getFeatureFlags().values).toEqual([]);
|
|
|
+
|
|
|
+ project.features.includes('enable-proj-flag');
|
|
|
+ project.features.includes('enable-replay');
|
|
|
+ organization.features.includes('enable-issues');
|
|
|
+ expect(inst.getFeatureFlags().values).toEqual([
|
|
|
+ {flag: 'feature.projects:enable-proj-flag', result: true},
|
|
|
+ {flag: 'feature.projects:enable-replay', result: false},
|
|
|
+ {flag: 'feature.organizations:enable-issues', result: true},
|
|
|
+ ]);
|
|
|
+
|
|
|
+ organization.features.includes('enable-replay');
|
|
|
+ expect(inst.getFeatureFlags().values).toEqual([
|
|
|
+ {flag: 'feature.projects:enable-replay', result: false},
|
|
|
+ {flag: 'feature.organizations:enable-issues', result: true},
|
|
|
+ {flag: 'feature.organizations:enable-replay', result: true},
|
|
|
+ ]);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('should keep the same queue if the project changes', () => {
|
|
|
+ const inst = new FeatureObserver({bufferSize: 3});
|
|
|
+ expect(project.features).toEqual(['enable-proj-flag', 'enable-performance']);
|
|
|
+ expect(organization.features).toEqual([
|
|
|
+ 'enable-issues',
|
|
|
+ 'enable-profiling',
|
|
|
+ 'enable-replay',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ inst.observeProjectFlags({project});
|
|
|
+ inst.observeOrganizationFlags({organization});
|
|
|
+ expect(inst.getFeatureFlags().values).toEqual([]);
|
|
|
+
|
|
|
+ project.features.includes('enable-proj-flag');
|
|
|
+ project.features.includes('enable-replay');
|
|
|
+ organization.features.includes('enable-issues');
|
|
|
+ expect(inst.getFeatureFlags().values).toEqual([
|
|
|
+ {flag: 'feature.projects:enable-proj-flag', result: true},
|
|
|
+ {flag: 'feature.projects:enable-replay', result: false},
|
|
|
+ {flag: 'feature.organizations:enable-issues', result: true},
|
|
|
+ ]);
|
|
|
+
|
|
|
+ project = ProjectFixture({
|
|
|
+ features: ['enable-new-flag'],
|
|
|
+ });
|
|
|
+ inst.observeProjectFlags({project});
|
|
|
+ expect(inst.getFeatureFlags().values).toEqual([
|
|
|
+ {flag: 'feature.projects:enable-proj-flag', result: true},
|
|
|
+ {flag: 'feature.projects:enable-replay', result: false},
|
|
|
+ {flag: 'feature.organizations:enable-issues', result: true},
|
|
|
+ ]);
|
|
|
+
|
|
|
+ project.features.includes('enable-new-flag');
|
|
|
+ expect(inst.getFeatureFlags().values).toEqual([
|
|
|
+ {flag: 'feature.projects:enable-replay', result: false},
|
|
|
+ {flag: 'feature.organizations:enable-issues', result: true},
|
|
|
+ {flag: 'feature.projects:enable-new-flag', result: true},
|
|
|
+ ]);
|
|
|
+ });
|
|
|
+ });
|
|
|
});
|