import {browserHistory} from 'react-router'; import {mountWithTheme} from 'sentry-test/enzyme'; import {logout} from 'sentry/actionCreators/account'; import AcceptOrganizationInvite from 'sentry/views/acceptOrganizationInvite'; jest.mock('sentry/actionCreators/account'); const addMock = body => MockApiClient.addMockResponse({ url: '/accept-invite/1/abc/', method: 'GET', body, }); describe('AcceptOrganizationInvite', function () { it('can accept invitation', async function () { addMock({ orgSlug: 'test-org', needsAuthentication: false, needs2fa: false, hasAuthProvider: false, requireSso: false, existingMember: false, }); const wrapper = mountWithTheme( ); const joinButton = wrapper.find('Button[aria-label="join-organization"]'); expect(joinButton.exists()).toBe(true); expect(joinButton.text()).toBe('Join the test-org organization'); const acceptMock = MockApiClient.addMockResponse({ url: '/accept-invite/1/abc/', method: 'POST', }); joinButton.simulate('click'); expect(acceptMock).toHaveBeenCalled(); expect(wrapper.find('Button[aria-label="join-organization"]').props().disabled).toBe( true ); await tick(); expect(browserHistory.replace).toHaveBeenCalledWith('/test-org/'); }); it('requires authentication to join', function () { addMock({ orgSlug: 'test-org', needsAuthentication: true, needs2fa: false, hasAuthProvider: false, requireSso: false, existingMember: false, }); const wrapper = mountWithTheme( ); const joinButton = wrapper.find('Button[aria-label="join-organization"]'); expect(joinButton.exists()).toBe(false); expect(wrapper.find('[data-test-id="action-info-general"]').exists()).toBe(true); expect(wrapper.find('[data-test-id="action-info-sso"]').exists()).toBe(false); expect(wrapper.find('Button[aria-label="sso-login"]').exists()).toBe(false); expect(wrapper.find('Button[aria-label="create-account"]').exists()).toBe(true); expect(wrapper.find('[data-test-id="link-with-existing"]').exists()).toBe(true); }); it('suggests sso authentication to login', function () { addMock({ orgSlug: 'test-org', needsAuthentication: true, needs2fa: false, hasAuthProvider: true, requireSso: false, existingMember: false, }); const wrapper = mountWithTheme( ); const joinButton = wrapper.find('Button[aria-label="join-organization"]'); expect(joinButton.exists()).toBe(false); expect(wrapper.find('[data-test-id="action-info-general"]').exists()).toBe(true); expect(wrapper.find('[data-test-id="action-info-sso"]').exists()).toBe(true); expect(wrapper.find('Button[aria-label="sso-login"]').exists()).toBe(true); expect(wrapper.find('Button[aria-label="create-account"]').exists()).toBe(true); expect(wrapper.find('[data-test-id="link-with-existing"]').exists()).toBe(true); }); it('enforce required sso authentication', function () { addMock({ orgSlug: 'test-org', needsAuthentication: true, needs2fa: false, hasAuthProvider: true, requireSso: true, existingMember: false, }); const wrapper = mountWithTheme( ); const joinButton = wrapper.find('Button[aria-label="join-organization"]'); expect(joinButton.exists()).toBe(false); expect(wrapper.find('[data-test-id="action-info-general"]').exists()).toBe(false); expect(wrapper.find('[data-test-id="action-info-sso"]').exists()).toBe(true); expect(wrapper.find('Button[aria-label="sso-login"]').exists()).toBe(true); expect(wrapper.find('Button[aria-label="create-account"]').exists()).toBe(false); expect(wrapper.find('[data-test-id="link-with-existing"]').exists()).toBe(false); }); it('enforce required sso authentication for logged in users', function () { addMock({ orgSlug: 'test-org', needsAuthentication: false, needs2fa: false, hasAuthProvider: true, requireSso: true, existingMember: false, }); const wrapper = mountWithTheme( ); const joinButton = wrapper.find('Button[aria-label="join-organization"]'); expect(joinButton.exists()).toBe(false); expect(wrapper.find('[data-test-id="action-info-general"]').exists()).toBe(false); expect(wrapper.find('[data-test-id="action-info-sso"]').exists()).toBe(true); expect(wrapper.find('Button[aria-label="sso-login"]').exists()).toBe(true); expect(wrapper.find('Button[aria-label="create-account"]').exists()).toBe(false); expect(wrapper.find('[data-test-id="link-with-existing"]').exists()).toBe(false); }); it('show logout button for logged in users w/ sso and membership', async function () { addMock({ orgSlug: 'test-org', needsAuthentication: false, needs2fa: false, hasAuthProvider: true, requireSso: true, existingMember: true, }); const wrapper = mountWithTheme( ); const existingMember = wrapper.find('[data-test-id="existing-member"]'); expect(existingMember.exists()).toBe(true); const {replace} = window.location; window.location.replace = jest.fn(); existingMember .find('[data-test-id="existing-member-link"]') .hostNodes() .simulate('click'); expect(logout).toHaveBeenCalled(); await tick(); expect(window.location.replace).toHaveBeenCalled(); window.location.replace = replace; }); it('shows right options for logged in user and optional SSO', function () { addMock({ orgSlug: 'test-org', needsAuthentication: false, needs2fa: false, hasAuthProvider: true, requireSso: false, existingMember: false, }); const wrapper = mountWithTheme( ); const ssoLink = wrapper.find('[data-test-id="action-info-sso"]'); expect(ssoLink.exists()).toBe(true); const joinButton = wrapper.find('Button[aria-label="join-organization"]'); expect(joinButton.exists()).toBe(true); }); it('shows a logout button for existing members', async function () { addMock({ orgSlug: 'test-org', needsAuthentication: false, needs2fa: false, hasAuthProvider: false, requireSso: false, existingMember: true, }); const wrapper = mountWithTheme( ); const existingMember = wrapper.find('[data-test-id="existing-member"]'); expect(existingMember.exists()).toBe(true); const {replace} = window.location; window.location.replace = jest.fn(); existingMember .find('[data-test-id="existing-member-link"]') .hostNodes() .simulate('click'); expect(logout).toHaveBeenCalled(); await tick(); expect(window.location.replace).toHaveBeenCalled(); window.location.replace = replace; }); it('shows 2fa warning', function () { addMock({ orgSlug: 'test-org', needsAuthentication: false, needs2fa: true, hasAuthProvider: false, requireSso: false, existingMember: false, }); const wrapper = mountWithTheme( ); expect(wrapper.find('[data-test-id="2fa-warning"]').exists()).toBe(true); }); });