import {initializeOrg} from 'sentry-test/initializeOrg';
import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
import selectEvent from 'sentry-test/selectEvent';
import {textWithMarkupMatcher} from 'sentry-test/utils';
import {INITIAL_DATA} from 'sentry/views/settings/projectMetrics/metricsExtractionRuleCreateModal';
import {MetricsExtractionRuleForm} from 'sentry/views/settings/projectMetrics/metricsExtractionRuleForm';
function renderMockRequests({orgSlug, projectId}: {orgSlug: string; projectId: string}) {
MockApiClient.addMockResponse({
url: `/organizations/${orgSlug}/spans/fields/`,
body: [],
});
MockApiClient.addMockResponse({
url: `/projects/${orgSlug}/${projectId}/metrics/extraction-rules/`,
method: 'GET',
body: [
{
aggregates: ['count'],
conditions: [{id: 102, value: '', mris: ['c:custom/span_attribute_102@none']}],
createdById: 3142223,
dateAdded: '2024-07-29T12:04:23.196785Z',
dateUpdated: '2024-07-29T12:04:23.197008Z',
projectId,
spanAttribute: 'A',
tags: ['release', 'environment'],
unit: 'none',
},
],
});
MockApiClient.addMockResponse({
url: `/organizations/${orgSlug}/spans/fields/environment/values/`,
body: [
{
key: 'prod',
name: 'prod',
},
{
key: 'dev',
name: 'dev',
},
],
});
MockApiClient.addMockResponse({
url: '/organizations/org-slug/recent-searches/',
method: 'POST',
body: [],
});
}
describe('Metrics Extraction Rule Form', function () {
it('by focusing on the "select span attribute" field, the UI shall display a hint about custom attribute', async function () {
const {project, organization} = initializeOrg();
renderMockRequests({orgSlug: organization.slug, projectId: project.id});
render(
);
await userEvent.click(screen.getByText('Select span attribute'));
expect(screen.getByText(/See how to instrument a custom attribute/)).toHaveAttribute(
'href',
'https://docs.sentry.io/product/explore/metrics/metrics-set-up/'
);
});
it('by focusing on the "group and filter by" field, the UI shall display a hint about custom attribute', async function () {
const {project, organization} = initializeOrg();
renderMockRequests({orgSlug: organization.slug, projectId: project.id});
render(
);
await userEvent.click(screen.getByLabelText('Select tags'));
expect(screen.getByText(/See how to instrument a custom tag/)).toHaveAttribute(
'href',
'https://docs.sentry.io/product/explore/metrics/metrics-set-up/'
);
});
it('When creating a new metric and selecting a custom attribute, an alert should prompt to remember to instrument it', async function () {
const {project, organization} = initializeOrg();
renderMockRequests({orgSlug: organization.slug, projectId: project.id});
render(
);
await userEvent.type(screen.getByText('Select span attribute'), 'new-metric');
await userEvent.click(
// the dom renders 2x of this text because of aria
screen.getAllByText(textWithMarkupMatcher('Create "new-metric"'))[1]
);
expect(screen.getByText(/You want to track a custom attribute/)).toBeInTheDocument();
await selectEvent.select(screen.getByText('new-metric'), 'browser.name');
expect(
screen.queryByText(/You want to track a custom attribute/)
).not.toBeInTheDocument();
});
it('When editing a metric and updating the form, an alert should prompt to remember it applies only for future data.', async function () {
const {project, organization} = initializeOrg();
renderMockRequests({orgSlug: organization.slug, projectId: project.id});
render(
);
await selectEvent.select(screen.getByText('none'), 'days');
expect(screen.getByText(/only be reflected on future data/)).toBeInTheDocument();
});
it('Do not allow duplicated filters', async function () {
const {project, organization} = initializeOrg();
renderMockRequests({orgSlug: organization.slug, projectId: project.id});
render(
);
await selectEvent.select(screen.getByText('Select span attribute'), 'user.id');
await userEvent.click(screen.getByText('Add Filter'));
await userEvent.click(screen.getByText('Save Changes'));
expect(screen.getByText(/duplicates are not allowed/)).toBeInTheDocument();
await userEvent.type(
screen.getAllByPlaceholderText('Add span attributes')[0],
'environment:prod{enter}'
);
await userEvent.type(
screen.getAllByPlaceholderText('Add span attributes')[1],
'environment:prod{enter}'
);
await userEvent.click(screen.getByText('Save Changes'));
expect(screen.getByText(/duplicates are not allowed/)).toBeInTheDocument();
await userEvent.type(
screen.getAllByPlaceholderText('Add span attributes')[1],
'environment:dev{enter}'
);
expect(screen.queryByText(/duplicates are not allowed/)).not.toBeInTheDocument();
});
});