import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
import SentryAppDetailsModal from 'sentry/components/modals/sentryAppDetailsModal';
function renderMockRequests({sentryAppSlug}: {sentryAppSlug: string}) {
const features = MockApiClient.addMockResponse({
url: `/sentry-apps/${sentryAppSlug}/features/`,
method: 'GET',
body: [],
});
const interaction = MockApiClient.addMockResponse({
url: `/sentry-apps/${sentryAppSlug}/interaction/`,
method: 'POST',
statusCode: 200,
body: {},
});
return {features, interaction};
}
describe('SentryAppDetailsModal', function () {
const sentryApp = TestStubs.SentryApp();
it('renders', function () {
renderMockRequests({sentryAppSlug: sentryApp.slug});
render(
);
expect(screen.getByText(sentryApp.name)).toBeInTheDocument();
});
it('records interaction request', function () {
const mockRequests = renderMockRequests({sentryAppSlug: sentryApp.slug});
render(
);
expect(mockRequests.interaction).toHaveBeenCalledWith(
`/sentry-apps/${sentryApp.slug}/interaction/`,
expect.objectContaining({
method: 'POST',
data: {
tsdbField: 'sentry_app_viewed',
},
})
);
});
it('displays the Integrations description', function () {
renderMockRequests({sentryAppSlug: sentryApp.slug});
render(
);
expect(screen.getByText(sentryApp.overview)).toBeInTheDocument();
});
it('closes when Cancel is clicked', async function () {
renderMockRequests({sentryAppSlug: sentryApp.slug});
const handleCloseModal = jest.fn();
render(
);
await userEvent.click(screen.getByText('Cancel'));
expect(handleCloseModal).toHaveBeenCalled();
});
it('installs the Integration when Install is clicked', async function () {
renderMockRequests({sentryAppSlug: sentryApp.slug});
const handleOnInstall = jest.fn();
render(
);
await userEvent.click(screen.getByRole('button', {name: 'Accept & Install'}));
expect(handleOnInstall).toHaveBeenCalled();
});
it('does not display the Install button, when the User does not have permission to install Integrations', function () {
renderMockRequests({sentryAppSlug: sentryApp.slug});
const noAccessOrg = TestStubs.Organization({access: []});
render(
,
{organization: noAccessOrg}
);
expect(
screen.queryByRole('button', {name: 'Accept & Install'})
).not.toBeInTheDocument();
});
it('render the Install button disabled, when the Integration is installed', function () {
renderMockRequests({sentryAppSlug: sentryApp.slug});
render(
);
expect(screen.getByRole('button', {name: 'Accept & Install'})).toBeDisabled();
});
it('does not render permissions, when the Integration requires no permissions', function () {
renderMockRequests({sentryAppSlug: sentryApp.slug});
render(
);
expect(screen.queryByText('Permissions')).not.toBeInTheDocument();
});
});