import {DataScrubbingRelayPiiConfigFixture} from 'sentry-fixture/dataScrubbingRelayPiiConfig';
import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
import {
makeClosableHeader,
makeCloseButton,
ModalBody,
ModalFooter,
} from 'sentry/components/globalModal/components';
import {convertRelayPiiConfig} from 'sentry/views/settings/components/dataScrubbing/convertRelayPiiConfig';
import Add from 'sentry/views/settings/components/dataScrubbing/modals/add';
import {MethodType, RuleType} from 'sentry/views/settings/components/dataScrubbing/types';
import {
getMethodLabel,
getRuleLabel,
} from 'sentry/views/settings/components/dataScrubbing/utils';
const relayPiiConfig = DataScrubbingRelayPiiConfigFixture();
const stringRelayPiiConfig = JSON.stringify(relayPiiConfig);
const organizationSlug = 'sentry';
const rules = convertRelayPiiConfig(stringRelayPiiConfig);
const successfullySaved = jest.fn();
const projectId = 'foo';
const endpoint = `/projects/${organizationSlug}/${projectId}/`;
const api = new MockApiClient();
describe('Add Modal', function () {
it('open Add Rule Modal', async function () {
const handleCloseModal = jest.fn();
render(
);
expect(
screen.getByRole('heading', {name: 'Add an advanced data scrubbing rule'})
).toBeInTheDocument();
// Method Field
expect(screen.getByText('Method')).toBeInTheDocument();
await userEvent.hover(screen.getAllByTestId('more-information')[0]);
expect(await screen.findByText('What to do')).toBeInTheDocument();
await userEvent.click(screen.getByText(getMethodLabel(MethodType.MASK).label));
Object.values(MethodType).forEach(method => {
if (method === MethodType.MASK) {
return;
}
expect(screen.getByText(getMethodLabel(method).label)).toBeInTheDocument();
});
// Type Field
expect(screen.getByText('Data Type')).toBeInTheDocument();
await userEvent.hover(screen.getAllByTestId('more-information')[1]);
expect(
await screen.findByText(
'What to look for. Use an existing pattern or define your own using regular expressions.'
)
).toBeInTheDocument();
await userEvent.click(screen.getByText(getRuleLabel(RuleType.CREDITCARD)));
Object.values(RuleType).forEach(rule => {
if (rule === RuleType.CREDITCARD) {
return;
}
expect(screen.getByText(getRuleLabel(rule))).toBeInTheDocument();
});
// Event ID
expect(
screen.getByRole('button', {name: 'Use event ID for auto-completion'})
).toBeInTheDocument();
// Source Field
screen.getByRole('textbox', {name: 'Source'});
await userEvent.hover(screen.getAllByTestId('more-information')[2]);
expect(
await screen.findByText(
'Where to look. In the simplest case this can be an attribute name.'
)
).toBeInTheDocument();
// Close Modal
await userEvent.click(screen.getByRole('button', {name: 'Cancel'}));
expect(handleCloseModal).toHaveBeenCalled();
});
it('Display placeholder field', async function () {
render(
);
expect(screen.queryByText('Custom Placeholder (Optional)')).not.toBeInTheDocument();
await userEvent.click(screen.getByText(getMethodLabel(MethodType.MASK).label));
await userEvent.keyboard('{arrowdown}{arrowdown}{enter}');
expect(screen.getByText('Custom Placeholder (Optional)')).toBeInTheDocument();
expect(screen.getByPlaceholderText('[Filtered]')).toBeInTheDocument();
await userEvent.hover(screen.getAllByTestId('more-information')[1]);
expect(
await screen.findByText('It will replace the default placeholder [Filtered]')
).toBeInTheDocument();
});
it('Display regex field', async function () {
render(
);
expect(screen.queryByText('Regex matches')).not.toBeInTheDocument();
await userEvent.click(screen.getByText(getRuleLabel(RuleType.CREDITCARD)));
await userEvent.keyboard(
'{arrowdown}{arrowdown}{arrowdown}{arrowdown}{arrowdown}{arrowdown}{enter}'
);
expect(screen.getAllByText('Regex matches')).toHaveLength(2);
expect(screen.getByPlaceholderText('[a-zA-Z0-9]+')).toBeInTheDocument();
await userEvent.hover(screen.getAllByTestId('more-information')[2]);
expect(
await screen.findByText('Custom regular expression (see documentation)')
).toBeInTheDocument();
});
it('Display Event Id', async function () {
const eventId = '12345678901234567890123456789012';
MockApiClient.addMockResponse({
url: `/organizations/${organizationSlug}/data-scrubbing-selector-suggestions/`,
body: {
suggestions: [
{type: 'value', examples: ['34359738368'], value: "extra.'system.cpu.memory'"},
{type: 'value', value: '$frame.abs_path'},
],
},
});
render(
);
await userEvent.click(
screen.getByRole('button', {name: 'Use event ID for auto-completion'})
);
await userEvent.click(screen.getByRole('textbox', {name: 'Source'}));
expect(screen.getAllByRole('listitem')).toHaveLength(18);
expect(screen.getByText('Event ID (Optional)')).toBeInTheDocument();
await userEvent.type(
screen.getByPlaceholderText('XXXXXXXXXXXXXX'),
`${eventId}{enter}`
);
expect(await screen.findByTestId('icon-check-mark')).toBeInTheDocument();
await userEvent.click(screen.getByRole('textbox', {name: 'Source'}));
expect(screen.getAllByRole('listitem')).toHaveLength(3);
});
});