import {fireEvent, render, screen} from 'sentry-test/reactTestingLibrary';
import ConfigStore from 'sentry/stores/configStore';
import {logExperiment} from 'sentry/utils/analytics';
import withExperiment from 'sentry/utils/withExperiment';
jest.mock('sentry/utils/analytics', () => ({
logExperiment: jest.fn(),
}));
jest.mock('sentry/data/experimentConfig', () => ({
experimentConfig: {
orgExperiment: {
key: 'orgExperiment',
type: 'organization',
parameter: 'exposed',
assignments: [1, 0, -1],
},
userExperiment: {
key: 'userExperiment',
type: 'user',
parameter: 'exposed',
assignments: [1, 0, -1],
},
},
}));
describe('withConfig HoC', function () {
beforeEach(function () {
jest.clearAllMocks();
});
const organization = {
id: 1,
experiments: {orgExperiment: 1},
};
function MyComponent(props) {
return {props.experimentAssignment};
}
function TriggerComponent(props) {
return ;
}
it('injects org experiment assignment', function () {
const Container = withExperiment(MyComponent, {experiment: 'orgExperiment'});
render();
expect(screen.getByText('1')).toBeInTheDocument();
});
it('injects user experiment assignment', function () {
ConfigStore.set('user', {id: 123, experiments: {userExperiment: 2}});
const Container = withExperiment(MyComponent, {experiment: 'userExperiment'});
render();
expect(screen.getByText('2')).toBeInTheDocument();
});
it('logs experiment assignment', function () {
const Container = withExperiment(MyComponent, {experiment: 'orgExperiment'});
render();
expect(logExperiment).toHaveBeenCalledWith({key: 'orgExperiment', organization});
});
it('defers logging when injectLogExperiment is true', function () {
const Container = withExperiment(TriggerComponent, {
experiment: 'orgExperiment',
injectLogExperiment: true,
});
render();
expect(logExperiment).not.toHaveBeenCalled();
// Call log experiment and verify it was called
fireEvent.click(screen.getByRole('button'));
expect(logExperiment).toHaveBeenCalledWith({key: 'orgExperiment', organization});
});
});