import {initializeOrg} from 'sentry-test/initializeOrg';
import {render, screen} from 'sentry-test/reactTestingLibrary';
import {Organization} from 'sentry/types';
import {MetricsProvider} from 'sentry/utils/metrics/metricsProvider';
import {useMetricsContext} from 'sentry/utils/useMetricsContext';
function mockMetricsAndTags(orgSlug: Organization['slug']) {
const tagsMock = MockApiClient.addMockResponse({
url: `/organizations/${orgSlug}/metrics/tags/`,
body: [{key: 'environment'}, {key: 'release'}, {key: 'session.status'}],
});
const metasMock = MockApiClient.addMockResponse({
url: `/organizations/${orgSlug}/metrics/meta/`,
body: [
{
name: 'sentry.sessions.session',
type: 'counter',
operations: ['sum'],
},
{
name: 'sentry.sessions.session.error',
type: 'set',
operations: ['count_unique'],
},
],
});
return {tagsMock, metasMock};
}
function TestComponent({other}: {other: string}) {
const {tags, metas} = useMetricsContext();
return (
{other}
{tags && Object.entries(tags).map(([key, tag]) => {tag.key})}
{metas &&
Object.entries(metas).map(([key, meta]) => {meta.name})}
);
}
describe('useMetricsContext', function () {
const {organization, project} = initializeOrg();
it("fetches metrics and tags and save values in the context's state", async function () {
const {tagsMock, metasMock} = mockMetricsAndTags(organization.slug);
render(
);
// Should forward prop
expect(screen.getByText('value')).toBeInTheDocument();
expect(tagsMock).toHaveBeenCalledTimes(1);
expect(metasMock).toHaveBeenCalledTimes(1);
// includes metric tags
expect(await screen.findByText('session.status')).toBeInTheDocument();
// include metric metas
expect(screen.getByText('sentry.sessions.session')).toBeInTheDocument();
expect(screen.getByText('sentry.sessions.session.error')).toBeInTheDocument();
});
it('skip metrics and tags fetches', function () {
const {tagsMock, metasMock} = mockMetricsAndTags(organization.slug);
render(
);
// Should forward prop
expect(screen.getByText('value')).toBeInTheDocument();
expect(tagsMock).not.toHaveBeenCalled();
expect(metasMock).not.toHaveBeenCalled();
// does not include metrics tags
expect(screen.queryByText('session.status')).not.toBeInTheDocument();
// does not include metrics metas
expect(screen.queryByText('sentry.sessions.session')).not.toBeInTheDocument();
expect(screen.queryByText('sentry.sessions.session.error')).not.toBeInTheDocument();
});
it('throw when provider is not set', function () {
try {
render();
} catch (error) {
expect(error.message).toEqual(
'useMetricsContext was called outside of MetricsProvider'
);
}
});
});