import {mountWithTheme} from 'sentry-test/enzyme';
import {initializeOrg} from 'sentry-test/initializeOrg';
import IssueAlertOptions from 'sentry/views/projectInstall/issueAlertOptions';
describe('IssueAlertOptions', function () {
const {organization, routerContext} = initializeOrg();
const URL = `/projects/${organization.slug}/rule-conditions/`;
let props;
const baseProps = {
onChange: _ => {},
};
beforeEach(() => {
MockApiClient.clearMockResponses();
MockApiClient.addMockResponse({
url: `/projects/${organization.slug}/rule-conditions/`,
body: TestStubs.MOCK_RESP_VERBOSE,
});
props = {...baseProps};
});
const selectControlVerifier = async (wrapper, dataTestId, optionsText) => {
wrapper
.find(`[data-test-id="${dataTestId}"] input[id*="react-select"]`)
.last()
.simulate('focus');
await tick();
wrapper.update();
expect(
wrapper.find(`InlineSelectControl[data-test-id="${dataTestId}"] Option`)
).toHaveLength(optionsText.length);
optionsText.forEach((metricText, idx) =>
expect(
wrapper
.find(`InlineSelectControl[data-test-id="${dataTestId}"] Option`)
.at(idx)
.text()
).toBe(metricText)
);
};
it('should render only the `Default Rule` and `Create Later` option on empty response:[]', () => {
MockApiClient.addMockResponse({
url: URL,
body: [],
});
const wrapper = mountWithTheme(, routerContext);
expect(wrapper.find('RadioLineItem')).toHaveLength(2);
});
it('should render only the `Default Rule` and `Create Later` option on empty response:{}', () => {
MockApiClient.addMockResponse({
url: URL,
body: {},
});
const wrapper = mountWithTheme(, routerContext);
expect(wrapper.find('RadioLineItem')).toHaveLength(2);
});
it('should render only the `Default Rule` and `Create Later` option on responses with different allowable intervals', () => {
MockApiClient.addMockResponse({
url: URL,
body: TestStubs.MOCK_RESP_INCONSISTENT_INTERVALS,
});
const wrapper = mountWithTheme(, routerContext);
expect(wrapper.find('RadioLineItem')).toHaveLength(2);
});
it('should render all(three) options on responses with different placeholder values', () => {
MockApiClient.addMockResponse({
url: URL,
body: TestStubs.MOCK_RESP_INCONSISTENT_PLACEHOLDERS,
});
const wrapper = mountWithTheme(, routerContext);
expect(wrapper.find('RadioLineItem')).toHaveLength(3);
});
it('should ignore conditions that are not `sentry.rules.conditions.event_frequency.EventFrequencyCondition` and `sentry.rules.conditions.event_frequency.EventUniqueUserFrequencyCondition`', () => {
MockApiClient.addMockResponse({
url: URL,
body: TestStubs.MOCK_RESP_ONLY_IGNORED_CONDITIONS_INVALID,
});
const wrapper = mountWithTheme(, routerContext);
expect(wrapper.find('RadioLineItem')).toHaveLength(3);
selectControlVerifier(wrapper, 'metric-select-control', ['users affected by']);
});
it('should render all(three) options on a valid response', () => {
MockApiClient.addMockResponse({
url: URL,
body: TestStubs.MOCK_RESP_VERBOSE,
});
const wrapper = mountWithTheme(, routerContext);
expect(wrapper.find('RadioLineItem')).toHaveLength(3);
});
it('should pre-populate fields from server response', () => {
MockApiClient.addMockResponse({
url: URL,
body: TestStubs.MOCK_RESP_VERBOSE,
});
const wrapper = mountWithTheme(, routerContext);
[
['metric-select-control', ['occurrences of', 'users affected by']],
[
'interval-select-control',
['one minute', 'one hour', 'one day', 'one week', '30 days'],
],
].forEach(([dataTestId, options]) =>
selectControlVerifier(wrapper, dataTestId, options)
);
});
it('should not pre-fill threshold value after a valid server response', () => {
MockApiClient.addMockResponse({
url: URL,
body: TestStubs.MOCK_RESP_VERBOSE,
});
const wrapper = mountWithTheme(, routerContext);
expect(wrapper.find('input[data-test-id="range-input"]').props().value).toBe('');
});
});