import {DataScrubbingRelayPiiConfigFixture} from 'sentry-fixture/dataScrubbingRelayPiiConfig'; import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import selectEvent from 'sentry-test/selectEvent'; import { makeClosableHeader, makeCloseButton, ModalBody, ModalFooter, } from 'sentry/components/globalModal/components'; import {convertRelayPiiConfig} from 'sentry/views/settings/components/dataScrubbing/convertRelayPiiConfig'; import Edit from 'sentry/views/settings/components/dataScrubbing/modals/edit'; import submitRules from 'sentry/views/settings/components/dataScrubbing/submitRules'; import {MethodType, RuleType} from 'sentry/views/settings/components/dataScrubbing/types'; import { getMethodLabel, getRuleLabel, valueSuggestions, } from 'sentry/views/settings/components/dataScrubbing/utils'; const relayPiiConfig = DataScrubbingRelayPiiConfigFixture(); const stringRelayPiiConfig = JSON.stringify(relayPiiConfig); const organizationSlug = 'sentry'; const convertedRules = convertRelayPiiConfig(stringRelayPiiConfig); const rules = convertedRules; const rule = rules[2]; const projectId = 'foo'; const endpoint = `/projects/${organizationSlug}/${projectId}/`; const api = new MockApiClient(); jest.mock('sentry/views/settings/components/dataScrubbing/submitRules'); describe('Edit Modal', function () { it('open Edit Rule Modal', async function () { const handleCloseModal = jest.fn(); render( ); expect( screen.getByRole('heading', {name: 'Edit 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('Replace')); Object.values(MethodType) .filter(method => method !== MethodType.REPLACE) .forEach(method => { expect(screen.getByText(getMethodLabel(method).label)).toBeInTheDocument(); }); // Placeholder Field expect(screen.getByText('Custom Placeholder (Optional)')).toBeInTheDocument(); await userEvent.hover(screen.getAllByTestId('more-information')[1]); expect( await screen.findByText('It will replace the default placeholder [Filtered]') ).toBeInTheDocument(); expect(screen.getByPlaceholderText('[Filtered]')).toBeInTheDocument(); // Type Field expect(screen.getByText('Data Type')).toBeInTheDocument(); await userEvent.hover(screen.getAllByTestId('more-information')[2]); expect( await screen.findByText( 'What to look for. Use an existing pattern or define your own using regular expressions.' ) ).toBeInTheDocument(); await userEvent.click(screen.getAllByText('Regex matches')[0]); Object.values(RuleType) .filter(ruleType => ruleType !== RuleType.PATTERN) .forEach(ruleType => { expect(screen.getByText(getRuleLabel(ruleType))).toBeInTheDocument(); }); await userEvent.click(screen.getAllByText('Regex matches')[0]); // Regex matches Field expect(screen.getAllByText('Regex matches')).toHaveLength(2); await userEvent.hover(screen.getAllByTestId('more-information')[3]); expect( await screen.findByText('Custom regular expression (see documentation)') ).toBeInTheDocument(); expect(screen.getByRole('textbox', {name: 'Regex matches'})).toHaveAttribute( 'placeholder', '[a-zA-Z0-9]+' ); // Event ID expect( screen.getByRole('button', {name: 'Use event ID for auto-completion'}) ).toBeInTheDocument(); // Source Field expect(screen.getByText('Source')).toBeInTheDocument(); await userEvent.hover(screen.getAllByTestId('more-information')[4]); expect( await screen.findByText( 'Where to look. In the simplest case this can be an attribute name.' ) ).toBeInTheDocument(); expect(screen.getByRole('textbox', {name: 'Source'})).toHaveAttribute( 'placeholder', 'Enter a custom attribute, variable or header name' ); // Close Modal await userEvent.click(screen.getByRole('button', {name: 'Cancel'})); expect(handleCloseModal).toHaveBeenCalled(); }); it('edit Rule Modal', async function () { render( ); // Method Field await selectEvent.select(screen.getByText('Replace'), 'Mask'); // Placeholder Field should be now hidden expect(screen.queryByText('Custom Placeholder (Optional)')).not.toBeInTheDocument(); // Type Field await selectEvent.select(screen.getAllByText('Regex matches')[0], 'Anything'); // Regex Field should be now hidden expect(screen.queryByText('Regex matches')).not.toBeInTheDocument(); // Source Field await userEvent.clear(screen.getByRole('textbox', {name: 'Source'})); await userEvent.type( screen.getByRole('textbox', {name: 'Source'}), valueSuggestions[2].value ); // Save rule await userEvent.click(screen.getByRole('button', {name: 'Save Rule'})); expect(submitRules).toHaveBeenCalledWith(api, endpoint, [ { id: 0, method: 'replace', type: 'password', source: 'password', placeholder: 'Scrubbed', }, {id: 1, method: 'mask', type: 'creditcard', source: '$message'}, { id: 2, method: 'mask', pattern: '', placeholder: '', type: 'anything', source: valueSuggestions[2].value, }, ]); }); });