import {mountWithTheme} from 'sentry-test/enzyme';
import {mountGlobalModal} from 'sentry-test/modal';
import {act} from 'sentry-test/reactTestingLibrary';
import {selectByValue} from 'sentry-test/select-new';
import TeamStore from 'sentry/stores/teamStore';
import InviteRequestRow from 'sentry/views/settings/organizationMembers/inviteRequestRow';
const roles = [
{
id: 'admin',
name: 'Admin',
desc: 'This is the admin role',
allowed: true,
},
{
id: 'member',
name: 'Member',
desc: 'This is the member role',
allowed: true,
},
{
id: 'owner',
name: 'Owner',
desc: 'This is the owner role',
allowed: false,
},
];
describe('InviteRequestRow', function () {
const orgId = 'org-slug';
const orgWithoutAdminAccess = TestStubs.Organization({
access: [],
});
const orgWithAdminAccess = TestStubs.Organization({
access: ['member:admin'],
});
const inviteRequestBusy = new Map();
const inviteRequest = TestStubs.Member({
user: null,
inviterName: TestStubs.User().name,
inviterId: TestStubs.User().id,
inviteStatus: 'requested_to_be_invited',
role: 'member',
teams: ['myteam'],
});
const joinRequest = TestStubs.Member({
user: null,
inviteStatus: 'requested_to_join',
role: 'member',
teams: ['myteam'],
});
it('renders request to be invited', function () {
const wrapper = mountWithTheme(
);
expect(wrapper.find('UserName').text()).toBe(inviteRequest.email);
expect(wrapper.find('Description').text().includes(inviteRequest.inviterName)).toBe(
true
);
});
it('renders request to join', function () {
const wrapper = mountWithTheme(
);
expect(wrapper.find('UserName').text()).toBe(joinRequest.email);
expect(wrapper.find('JoinRequestIndicator').exists()).toBe(true);
});
it('admin can approve invite request', async function () {
const mockApprove = jest.fn();
const mockDeny = jest.fn();
const wrapper = mountWithTheme(
);
wrapper.find('button[aria-label="Approve"]').simulate('click');
const modal = await mountGlobalModal();
modal.find('button[aria-label="Confirm"]').simulate('click');
expect(mockApprove).toHaveBeenCalledWith(inviteRequest);
expect(mockDeny).not.toHaveBeenCalled();
});
it('admin can deny invite request', function () {
const mockApprove = jest.fn();
const mockDeny = jest.fn();
const wrapper = mountWithTheme(
);
wrapper.find('button[aria-label="Deny"]').simulate('click');
expect(mockDeny).toHaveBeenCalledWith(inviteRequest);
expect(mockApprove).not.toHaveBeenCalled();
});
it('non-admin can not approve or deny invite request', function () {
const wrapper = mountWithTheme(
{}}
onDeny={() => {}}
allRoles={roles}
/>
);
expect(wrapper.find('button[aria-label="Deny"]').prop('aria-disabled')).toBe(true);
expect(wrapper.find('button[aria-label="Approve"]').prop('aria-disabled')).toBe(true);
});
it('admin can change role and teams', function () {
const adminInviteRequest = TestStubs.Member({
user: null,
inviterName: TestStubs.User().name,
inviterId: TestStubs.User().id,
inviteStatus: 'requested_to_be_invited',
role: 'admin',
teams: ['myteam'],
});
act(
() =>
void TeamStore.loadInitialData([
{id: '1', slug: 'one'},
{id: '2', slug: 'two'},
])
);
const mockUpdate = jest.fn();
const wrapper = mountWithTheme(
);
selectByValue(wrapper, 'member', {name: 'role', control: true});
expect(mockUpdate).toHaveBeenCalledWith({role: 'member'});
selectByValue(wrapper, 'one', {name: 'teams', control: true});
expect(mockUpdate).toHaveBeenCalledWith({teams: ['one']});
TeamStore.reset();
});
it('cannot be approved when invitee role is not allowed', function () {
const ownerInviteRequest = TestStubs.Member({
user: null,
inviterName: TestStubs.User().name,
inviterId: TestStubs.User().id,
inviteStatus: 'requested_to_be_invited',
role: 'owner',
teams: ['myteam'],
});
const mockUpdate = jest.fn();
const wrapper = mountWithTheme(
);
expect(wrapper.find('button[aria-label="Approve"]').props()['aria-disabled']).toBe(
true
);
});
});