/*global global*/
import {observable} from 'mobx';
import React from 'react';
import {Client} from 'app/api';
import {mount} from 'enzyme';
import SentryApplicationDetails from 'app/views/settings/organizationDeveloperSettings/sentryApplicationDetails';
import {selectByValue} from '../../../../helpers/select';
describe('Sentry Application Details', function() {
let org;
let orgId;
let sentryApp;
let wrapper;
let createAppRequest;
let editAppRequest;
beforeEach(() => {
Client.clearMockResponses();
org = TestStubs.Organization();
orgId = org.slug;
});
describe('new sentry application', () => {
beforeEach(() => {
createAppRequest = Client.addMockResponse({
url: '/sentry-apps/',
method: 'POST',
body: [],
});
wrapper = mount(
,
TestStubs.routerContext()
);
});
describe('renders()', () => {
it('it shows empty scopes and no credentials', function() {
expect(wrapper).toMatchSnapshot();
// new app starts off with no scopes selected
expect(wrapper.find('PermissionsObserver').prop('scopes')).toEqual([]);
expect(
wrapper.find('PanelHeader').findWhere(h => h.text() == 'Permissions')
).toBeDefined();
});
});
describe('saving new app', () => {
it('updates a SentryApp', function() {
wrapper
.find('Input[name="name"]')
.simulate('change', {target: {value: 'Test App'}});
wrapper
.find('Input[name="webhookUrl"]')
.simulate('change', {target: {value: 'https://webhook.com'}});
wrapper
.find('Input[name="redirectUrl"]')
.simulate('change', {target: {value: 'https://webhook.com/setup'}});
wrapper.find('Switch[name="isAlertable"]').simulate('click');
selectByValue(wrapper, 'admin', {name: 'Member--permission'});
selectByValue(wrapper, 'admin', {name: 'Event--permission'});
wrapper
.find('Checkbox')
.first()
.simulate('change', {target: {checked: true}});
wrapper.find('form').simulate('submit');
let data = {
name: 'Test App',
organization: org.slug,
redirectUrl: 'https://webhook.com/setup',
webhookUrl: 'https://webhook.com',
scopes: observable([
'member:read',
'member:admin',
'event:read',
'event:admin',
]),
events: observable(['issue']),
isAlertable: true,
};
expect(createAppRequest).toHaveBeenCalledWith(
'/sentry-apps/',
expect.objectContaining({
data,
method: 'POST',
})
);
});
});
});
describe('edit existing application', () => {
beforeEach(() => {
sentryApp = TestStubs.SentryApp();
const appSlug = sentryApp.slug;
Client.addMockResponse({
url: `/sentry-apps/${sentryApp.slug}/`,
body: sentryApp,
});
wrapper = mount(
,
TestStubs.routerContext()
);
});
describe('renders()', () => {
it('it shows application data and credentials', function() {
expect(wrapper).toMatchSnapshot();
// data should be filled out
expect(wrapper.find('PermissionsObserver').prop('scopes')).toEqual([
'project:read',
]);
// 'Credentials' should be last PanelHeader when editing an application.
expect(
wrapper
.find('PanelHeader')
.last()
.text()
).toBe('Credentials');
});
});
describe('saving edited app', () => {
beforeEach(() => {
sentryApp.events = ['issue'];
editAppRequest = Client.addMockResponse({
url: `/sentry-apps/${sentryApp.slug}/`,
method: 'PUT',
body: [],
});
});
it('it updates app with correct data', function() {
wrapper
.find('Input[name="redirectUrl"]')
.simulate('change', {target: {value: 'https://hello.com/'}});
wrapper
.find('Checkbox')
.first()
.simulate('change', {target: {checked: false}});
wrapper.find('form').simulate('submit');
expect(editAppRequest).toHaveBeenCalledWith(
`/sentry-apps/${sentryApp.slug}/`,
expect.objectContaining({
data: expect.objectContaining({
redirectUrl: 'https://hello.com/',
events: observable.array([]),
}),
method: 'PUT',
})
);
});
it('submits with no-access for event subscription when permission is revoked', () => {
wrapper
.find('Checkbox')
.first()
.simulate('change', {target: {checked: true}});
selectByValue(wrapper, 'no-access', {name: 'Event--permission'});
wrapper.find('form').simulate('submit');
expect(editAppRequest).toHaveBeenCalledWith(
`/sentry-apps/${sentryApp.slug}/`,
expect.objectContaining({
data: expect.objectContaining({
events: observable.array([]),
}),
method: 'PUT',
})
);
});
});
});
});