import {
render,
renderGlobalModal,
screen,
userEvent,
waitFor,
} from 'sentry-test/reactTestingLibrary';
import AccountIdentities from 'sentry/views/settings/account/accountIdentities';
const ENDPOINT = '/users/me/user-identities/';
describe('AccountIdentities', function () {
beforeEach(function () {
MockApiClient.clearMockResponses();
});
it('renders empty', function () {
MockApiClient.addMockResponse({
url: ENDPOINT,
method: 'GET',
body: [],
});
render();
});
it('renders list', async function () {
MockApiClient.addMockResponse({
url: ENDPOINT,
method: 'GET',
body: [
{
category: 'social-identity',
id: '1',
provider: {
key: 'github',
name: 'GitHub',
},
status: 'can_disconnect',
organization: null,
},
{
category: 'org-identity',
id: '2',
provider: {
key: 'google',
name: 'Google',
},
status: 'needed_for_global_auth',
organization: null,
},
],
});
render();
await waitFor(() =>
expect(screen.queryByTestId('loading-indicator')).not.toBeInTheDocument()
);
expect(await screen.findByText('GitHub')).toBeInTheDocument();
expect(await screen.findByText('Google')).toBeInTheDocument();
});
it('renders loading error', async function () {
MockApiClient.addMockResponse({
url: ENDPOINT,
method: 'GET',
statusCode: 400,
body: {},
});
render();
expect(
await screen.findByText('There was an error loading data.')
).toBeInTheDocument();
});
it('disconnects identity', async function () {
MockApiClient.addMockResponse({
url: ENDPOINT,
method: 'GET',
body: [
{
category: 'social-identity',
id: '1',
provider: {
key: 'github',
name: 'GitHub',
},
status: 'can_disconnect',
organization: null,
},
],
});
render();
const disconnectRequest = {
url: `${ENDPOINT}social-identity/1/`,
method: 'DELETE',
};
const mock = MockApiClient.addMockResponse(disconnectRequest);
expect(mock).not.toHaveBeenCalled();
await userEvent.click(await screen.findByRole('button', {name: 'Disconnect'}));
renderGlobalModal();
await userEvent.click(screen.getByTestId('confirm-button'));
expect(
await screen.findByText(
'There are no organization identities associated with your Sentry account'
)
).toBeInTheDocument();
expect(mock).toHaveBeenCalledTimes(1);
expect(mock).toHaveBeenCalledWith(
`${ENDPOINT}social-identity/1/`,
expect.objectContaining({
method: 'DELETE',
})
);
});
});