import React from 'react'; import {mount} from 'enzyme'; import {Client} from 'app/api'; import {addQueryParamsToExistingUrl} from 'app/utils/queryString'; import SentryAppExternalIssueForm from 'app/components/group/sentryAppExternalIssueForm'; describe('SentryAppExternalIssueForm', () => { let wrapper; let group; let sentryApp; let sentryAppInstallation; let component; beforeEach(() => { group = TestStubs.Group({ title: 'ApiError: Broken', shortId: 'SEN123', permalink: 'https://sentry.io/organizations/sentry/issues/123/?project=1', }); component = TestStubs.SentryAppComponent(); sentryApp = TestStubs.SentryApp(); sentryAppInstallation = TestStubs.SentryAppInstallation({sentryApp}); }); describe('create', () => { beforeEach(() => { wrapper = mount( , TestStubs.routerContext() ); }); it('specifies the action', () => { expect(wrapper.find('HiddenField[name="action"]').prop('value')).toEqual('create'); }); it('specifies the group', () => { expect(wrapper.find('HiddenField[name="groupId"]').prop('value')).toEqual(group.id); }); it('specifies the uri', () => { expect(wrapper.find('HiddenField[name="uri"]').prop('value')).toEqual( component.schema.create.uri ); }); it('renders each required_fields field', () => { component.schema.create.required_fields.forEach(field => { expect(wrapper.exists(`#${field.name}`)).toBe(true); }); }); it('submits to the New External Issue endpoint', () => { const url = `/sentry-app-installations/${ sentryAppInstallation.uuid }/external-issues/`; expect(wrapper.find('Form').prop('apiEndpoint')).toEqual(url); expect(wrapper.find('Form').prop('apiMethod')).toEqual('POST'); }); it('renders prepopulated defaults', () => { const titleField = wrapper.find('Input#title'); const descriptionField = wrapper.find('TextArea#description'); const url = addQueryParamsToExistingUrl(group.permalink, { referrer: sentryApp.name, }); expect(titleField.prop('value')).toEqual(`${group.title}`); expect(descriptionField.prop('value')).toEqual( `Sentry Issue: [${group.shortId}](${url})` ); }); }); describe('link', () => { beforeEach(() => { wrapper = mount( , TestStubs.routerContext() ); }); it('specifies the action', () => { expect(wrapper.find('HiddenField[name="action"]').prop('value')).toEqual('link'); }); it('specifies the group', () => { expect(wrapper.find('HiddenField[name="groupId"]').prop('value')).toEqual(group.id); }); it('specifies the uri', () => { expect(wrapper.find('HiddenField[name="uri"]').prop('value')).toEqual( component.schema.link.uri ); }); it('renders each required_fields field', () => { component.schema.link.required_fields.forEach(field => { expect(wrapper.exists(`#${field.name}`)).toBe(true); }); }); it('submits to the New External Issue endpoint', () => { const url = `/sentry-app-installations/${ sentryAppInstallation.uuid }/external-issues/`; expect(wrapper.find('Form').prop('apiEndpoint')).toEqual(url); expect(wrapper.find('Form').prop('apiMethod')).toEqual('POST'); }); }); }); describe('SentryAppExternalIssueForm Async Field', () => { let wrapper; let group; let sentryApp; let sentryAppInstallation; const component = { uuid: 'ed517da4-a324-44c0-aeea-1894cd9923fb', type: 'issue-link', schema: { create: { required_fields: [ { type: 'select', name: 'numbers', label: 'Numbers', uri: '/sentry/numbers', url: '/sentry/numbers', async: true, }, ], }, link: { required_fields: [ { type: 'text', name: 'issue', label: 'Issue', }, ], }, }, sentryApp: { uuid: 'b468fed3-afba-4917-80d6-bdac99c1ec05', slug: 'foo', name: 'Foo', }, }; beforeEach(() => { group = TestStubs.Group({ title: 'ApiError: Broken', shortId: 'SEN123', permalink: 'https://sentry.io/organizations/sentry/issues/123/?project=1', }); sentryApp = TestStubs.SentryApp(); sentryAppInstallation = TestStubs.SentryAppInstallation({sentryApp}); }); afterEach(() => { Client.clearMockResponses(); }); describe('renders', () => { it('renders each required_fields field', async function() { Client.addMockResponse({ method: 'GET', url: '/sentry-app-installations/d950595e-cba2-46f6-8a94-b79e42806f98/external-requests/', body: { choices: [[1, 'Issue 1'], [2, 'Issue 2']], }, }); wrapper = mount( , TestStubs.routerContext() ); wrapper.find('input#numbers').simulate('change', {target: {value: 'I'}}); await tick(); wrapper.update(); const optionLabelSelector = label => { return `[aria-label="${label}"]`; }; expect(wrapper.find(optionLabelSelector('Issue 1')).exists()).toBe(true); expect(wrapper.find(optionLabelSelector('Issue 2')).exists()).toBe(true); }); }); });