import {RouteComponentPropsFixture} from 'sentry-fixture/routeComponentPropsFixture';
import {SentryAppFixture} from 'sentry-fixture/sentryApp';
import {SentryAppWebhookRequestFixture} from 'sentry-fixture/sentryAppWebhookRequest';
import {render, screen, within} from 'sentry-test/reactTestingLibrary';
import SentryApplicationDashboard from './index';
jest.mock('sentry/components/charts/baseChart', () => {
return jest.fn().mockImplementation(() =>
);
});
describe('Sentry Application Dashboard', function () {
const NUM_INSTALLS = 5;
const NUM_UNINSTALLS = 2;
let sentryApp;
let webhookRequest;
afterEach(() => {
MockApiClient.clearMockResponses();
});
describe('Viewing the Sentry App Dashboard for a published integration', () => {
beforeEach(() => {
sentryApp = SentryAppFixture({
status: 'published',
schema: {
elements: [
{type: 'stacktrace-link', uri: '/test', url: '/test'},
{
type: 'issue-link',
create: {uri: '/test', required_fields: []},
link: {uri: '/test', required_fields: []},
},
],
},
});
webhookRequest = SentryAppWebhookRequestFixture();
MockApiClient.addMockResponse({
url: `/sentry-apps/${sentryApp.slug}/stats/`,
body: {
totalInstalls: NUM_INSTALLS,
totalUninstalls: NUM_UNINSTALLS,
installStats: [[1569783600, NUM_INSTALLS]],
uninstallStats: [[1569783600, NUM_UNINSTALLS]],
},
});
MockApiClient.addMockResponse({
url: `/sentry-apps/${sentryApp.slug}/requests/`,
body: [webhookRequest],
});
MockApiClient.addMockResponse({
url: `/sentry-apps/${sentryApp.slug}/interaction/`,
body: {
componentInteractions: {
'stacktrace-link': [[1569783600, 1]],
'issue-link': [[1569783600, 1]],
},
views: [[1569783600, 1]],
},
});
MockApiClient.addMockResponse({
url: `/sentry-apps/${sentryApp.slug}/`,
body: sentryApp,
});
});
it('shows the total install/uninstall stats', async () => {
render(
);
expect(await screen.findByTestId('installs')).toHaveTextContent('Total installs5');
expect(screen.getByTestId('uninstalls')).toHaveTextContent('Total uninstalls2');
});
it('shows the request log', async () => {
render(
);
// The mock response has 1 request
expect(await screen.findByTestId('request-item')).toBeInTheDocument();
const requestLog = within(screen.getByTestId('request-item'));
// Make sure that all the info is displayed
expect(requestLog.getByText('https://example.com/webhook')).toBeInTheDocument();
expect(requestLog.getByText('400')).toBeInTheDocument();
expect(requestLog.getByText('issue.assigned')).toBeInTheDocument();
expect(requestLog.getByText('Test Org')).toBeInTheDocument();
});
it('shows an empty message if there are no requests', async () => {
MockApiClient.addMockResponse({
url: `/sentry-apps/${sentryApp.slug}/requests/`,
body: [],
});
render(
);
expect(
await screen.findByText('No requests found in the last 30 days.')
).toBeInTheDocument();
});
it('shows integration and interactions chart', async () => {
render(
);
expect(await screen.findAllByTestId('chart')).toHaveLength(3);
});
});
describe('Viewing the Sentry App Dashboard for an internal integration', () => {
beforeEach(() => {
sentryApp = SentryAppFixture({
status: 'internal',
schema: {
elements: [{type: 'stacktrace-link', uri: '/test', url: '/test'}],
},
});
webhookRequest = SentryAppWebhookRequestFixture();
MockApiClient.addMockResponse({
url: `/sentry-apps/${sentryApp.slug}/stats/`,
body: {
totalInstalls: 1,
totalUninstalls: 0,
installStats: [[1569783600, 1]],
uninstallStats: [[1569783600, 0]],
},
});
MockApiClient.addMockResponse({
url: `/sentry-apps/${sentryApp.slug}/requests/`,
body: [webhookRequest],
});
MockApiClient.addMockResponse({
url: `/sentry-apps/${sentryApp.slug}/interaction/`,
body: {
componentInteractions: {
'stacktrace-link': [[1569783600, 1]],
},
views: [[1569783600, 1]],
},
});
MockApiClient.addMockResponse({
url: `/sentry-apps/${sentryApp.slug}/`,
body: sentryApp,
});
});
it('shows the request log', async () => {
render(
);
// The mock response has 1 request
expect(await screen.findByTestId('request-item')).toBeInTheDocument();
const requestLog = within(screen.getByTestId('request-item'));
// Make sure that all the info is displayed
expect(requestLog.getByText('https://example.com/webhook')).toBeInTheDocument();
expect(requestLog.getByText('400')).toBeInTheDocument();
expect(requestLog.getByText('issue.assigned')).toBeInTheDocument();
// Does not show the integration views
expect(screen.queryByText('Integration Views')).not.toBeInTheDocument();
});
it('shows an empty message if there are no requests', async () => {
MockApiClient.addMockResponse({
url: `/sentry-apps/${sentryApp.slug}/requests/`,
body: [],
});
render(
);
expect(
await screen.findByText('No requests found in the last 30 days.')
).toBeInTheDocument();
});
it('shows the component interactions in a line chart', async () => {
render(
);
expect(await screen.findByTestId('chart')).toBeInTheDocument();
});
});
});