import {mountWithTheme} from 'sentry-test/enzyme'; import {saveOnBlurUndoMessage} from 'sentry/actionCreators/indicator'; import OrganizationSettingsForm from 'sentry/views/settings/organizationGeneralSettings/organizationSettingsForm'; jest.mock('sentry/actionCreators/indicator'); describe('OrganizationSettingsForm', function () { const organization = TestStubs.Organization(); let putMock; const onSave = jest.fn(); beforeEach(function () { MockApiClient.clearMockResponses(); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/auth-provider/`, method: 'GET', }); onSave.mockReset(); }); it('can change a form field', async function () { putMock = MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/`, method: 'PUT', data: { name: 'New Name', }, }); const wrapper = mountWithTheme( ); const input = wrapper.find('input[name="name"]'); expect(input).toHaveLength(1); input.simulate('change', {target: {value: 'New Name'}}); input.simulate('blur'); expect(putMock).toHaveBeenCalledWith( `/organizations/${organization.slug}/`, expect.objectContaining({ method: 'PUT', data: { name: 'New Name', }, }) ); await new Promise(resolve => { saveOnBlurUndoMessage.mockImplementationOnce(async function ( change, model, fieldName ) { expect(fieldName).toBe('name'); expect(change.old).toBe('Organization Name'); expect(change.new).toBe('New Name'); // Test "undo" call undo directly expect(model.getValue('name')).toBe('New Name'); model.undo(); expect(model.getValue('name')).toBe('Organization Name'); // `saveOnBlurUndoMessage` saves the new field, so reimplement this await model.saveField('name', 'Organization Name'); // Initial data should be updated to original name expect(model.initialData.name).toBe('Organization Name'); putMock.mockReset(); // Blurring the name field again should NOT trigger a save input.simulate('blur'); expect(putMock).not.toHaveBeenCalled(); resolve(); }); }); }); it('can change slug', function () { putMock = MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/`, method: 'PUT', }); const wrapper = mountWithTheme( ); wrapper .find('input[name="slug"]') .simulate('change', {target: {value: 'NEW SLUG'}}) .simulate('blur'); expect(putMock).not.toHaveBeenCalled(); wrapper.find('button[aria-label="Save"]').simulate('click'); expect(putMock).toHaveBeenCalledWith( '/organizations/org-slug/', expect.objectContaining({ data: { slug: 'new-slug', }, }) ); }); });