import {render, screen} from 'sentry-test/reactTestingLibrary';
import {Client} from 'sentry/api';
import DiscoverQuery from 'sentry/utils/discover/discoverQuery';
import EventView from 'sentry/utils/discover/eventView';
describe('DiscoverQuery', function () {
let location, api, eventView;
beforeEach(() => {
api = new Client();
location = {
pathname: '/events',
query: {},
};
eventView = EventView.fromSavedQuery({
id: '',
name: 'test query',
version: 2,
fields: ['transaction', 'count()'],
projects: [1],
environment: ['dev'],
});
});
describe('with eventsv2', function () {
it('fetches data on mount', async function () {
const getMock = MockApiClient.addMockResponse({
url: '/organizations/test-org/eventsv2/',
body: {
meta: {transaction: 'string', count: 'number'},
data: [{transaction: '/health', count: 1000}],
},
});
render(
{({tableData, isLoading}) => {
if (isLoading) {
return 'loading';
}
return {tableData.data[0].transaction}
;
}}
);
await tick();
// Children should be rendered, and API should be called.
expect(getMock).toHaveBeenCalledTimes(1);
expect(await screen.findByText('/health')).toBeInTheDocument();
});
it('applies limit and cursor props', async function () {
const getMock = MockApiClient.addMockResponse({
url: '/organizations/test-org/eventsv2/',
body: {
meta: {transaction: 'string', count: 'number'},
data: [{transaction: '/health', count: 1000}],
},
});
render(
{({tableData, isLoading}) => {
if (isLoading) {
return 'loading';
}
return {tableData.data[0].transaction}
;
}}
);
await tick();
expect(getMock).toHaveBeenCalledTimes(1);
expect(getMock).toHaveBeenCalledWith(
'/organizations/test-org/eventsv2/',
expect.objectContaining({
method: 'GET',
query: expect.objectContaining({
per_page: 3,
cursor: '1:0:1',
}),
})
);
});
it('parses string errors correctly', async function () {
MockApiClient.addMockResponse({
url: '/organizations/test-org/eventsv2/',
body: {
detail: 'Error Message',
},
statusCode: 400,
});
let errorValue;
render(
(errorValue = e)}
>
{({isLoading}) => {
if (isLoading) {
return 'loading';
}
return null;
}}
);
await tick();
expect(errorValue.message).toEqual('Error Message');
});
it('parses object errors correctly', async function () {
MockApiClient.addMockResponse({
url: '/organizations/test-org/eventsv2/',
body: {
detail: {
code: '?',
message: 'Object Error',
extra: {},
},
},
statusCode: 400,
});
let errorValue;
render(
(errorValue = e)}
>
{({isLoading}) => {
if (isLoading) {
return 'loading';
}
return null;
}}
);
await tick();
expect(errorValue.message).toEqual('Object Error');
});
});
describe('with events', function () {
it('fetches data on mount', async function () {
const getMock = MockApiClient.addMockResponse({
url: '/organizations/test-org/events/',
body: {
meta: {fields: {transaction: 'string', count: 'number'}},
data: [{transaction: '/health', count: 1000}],
},
});
render(
{({tableData, isLoading}) => {
if (isLoading) {
return 'loading';
}
return {tableData.data[0].transaction}
;
}}
);
await tick();
// Children should be rendered, and API should be called.
expect(getMock).toHaveBeenCalledTimes(1);
expect(await screen.findByText('/health')).toBeInTheDocument();
});
it('applies limit and cursor props', async function () {
const getMock = MockApiClient.addMockResponse({
url: '/organizations/test-org/events/',
body: {
meta: {fields: {transaction: 'string', count: 'number'}},
data: [{transaction: '/health', count: 1000}],
},
});
render(
{({tableData, isLoading}) => {
if (isLoading) {
return 'loading';
}
return {tableData.data[0].transaction}
;
}}
);
await tick();
expect(getMock).toHaveBeenCalledTimes(1);
expect(getMock).toHaveBeenCalledWith(
'/organizations/test-org/events/',
expect.objectContaining({
method: 'GET',
query: expect.objectContaining({
per_page: 3,
cursor: '1:0:1',
}),
})
);
});
it('parses string errors correctly', async function () {
MockApiClient.addMockResponse({
url: '/organizations/test-org/events/',
body: {
detail: 'Error Message',
},
statusCode: 400,
});
let errorValue;
render(
(errorValue = e)}
useEvents
>
{({isLoading}) => {
if (isLoading) {
return 'loading';
}
return null;
}}
);
await tick();
expect(errorValue.message).toEqual('Error Message');
});
it('parses object errors correctly', async function () {
MockApiClient.addMockResponse({
url: '/organizations/test-org/events/',
body: {
detail: {
code: '?',
message: 'Object Error',
extra: {},
},
},
statusCode: 400,
});
let errorValue;
render(
(errorValue = e)}
useEvents
>
{({isLoading}) => {
if (isLoading) {
return 'loading';
}
return null;
}}
);
await tick();
expect(errorValue.message).toEqual('Object Error');
});
});
});