TeamMembers.test.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import React from 'react';
  2. import { shallow } from 'enzyme';
  3. import { TeamMembers, Props, State } from './TeamMembers';
  4. import { TeamMember, TeamPermissionLevel } from '../../types';
  5. import { getMockTeamMember, getMockTeamMembers } from './__mocks__/teamMocks';
  6. import { SelectOptionItem } from '@grafana/ui';
  7. import { contextSrv } from 'app/core/services/context_srv';
  8. jest.mock('app/core/services/context_srv', () => ({
  9. contextSrv: {
  10. isGrafanaAdmin: false,
  11. hasRole: role => false,
  12. user: { id: 1 },
  13. },
  14. }));
  15. const originalContextSrv = contextSrv;
  16. interface SetupProps {
  17. propOverrides?: object;
  18. isGrafanaAdmin?: boolean;
  19. isOrgAdmin?: boolean;
  20. }
  21. const setup = (setupProps: SetupProps) => {
  22. const props: Props = {
  23. members: [] as TeamMember[],
  24. searchMemberQuery: '',
  25. setSearchMemberQuery: jest.fn(),
  26. loadTeamMembers: jest.fn(),
  27. addTeamMember: jest.fn(),
  28. removeTeamMember: jest.fn(),
  29. updateTeamMember: jest.fn(),
  30. syncEnabled: false,
  31. editorsCanAdmin: false,
  32. };
  33. contextSrv.isGrafanaAdmin = setupProps.isGrafanaAdmin || false;
  34. contextSrv.hasRole = role => setupProps.isOrgAdmin || false;
  35. Object.assign(props, setupProps.propOverrides);
  36. const wrapper = shallow(<TeamMembers {...props} />);
  37. const instance = wrapper.instance() as TeamMembers;
  38. return {
  39. wrapper,
  40. instance,
  41. };
  42. };
  43. describe('Render', () => {
  44. beforeEach(() => {
  45. contextSrv.isGrafanaAdmin = originalContextSrv.isGrafanaAdmin;
  46. contextSrv.hasRole = originalContextSrv.hasRole;
  47. });
  48. it('should render component', () => {
  49. const { wrapper } = setup({});
  50. expect(wrapper).toMatchSnapshot();
  51. });
  52. it('should render team members', () => {
  53. const { wrapper } = setup({
  54. propOverrides: {
  55. members: getMockTeamMembers(5),
  56. },
  57. });
  58. expect(wrapper).toMatchSnapshot();
  59. });
  60. it('should render team members when sync enabled', () => {
  61. const { wrapper } = setup({
  62. propOverrides: {
  63. members: getMockTeamMembers(5),
  64. syncEnabled: true,
  65. },
  66. });
  67. expect(wrapper).toMatchSnapshot();
  68. });
  69. describe('when feature toggle editorsCanAdmin is turned on', () => {
  70. it('should render permissions select if user is Grafana Admin', () => {
  71. const members = getMockTeamMembers(5);
  72. members[4].permission = TeamPermissionLevel.Admin;
  73. const { wrapper } = setup({
  74. propOverrides: { members, editorsCanAdmin: true },
  75. isGrafanaAdmin: true,
  76. isOrgAdmin: false,
  77. });
  78. expect(wrapper).toMatchSnapshot();
  79. });
  80. it('should render permissions select if user is Org Admin', () => {
  81. const members = getMockTeamMembers(5);
  82. members[4].permission = TeamPermissionLevel.Admin;
  83. const { wrapper } = setup({
  84. propOverrides: { members, editorsCanAdmin: true },
  85. isGrafanaAdmin: false,
  86. isOrgAdmin: true,
  87. });
  88. expect(wrapper).toMatchSnapshot();
  89. });
  90. it('should render permissions select if user is team admin', () => {
  91. const members = getMockTeamMembers(5);
  92. members[0].permission = TeamPermissionLevel.Admin;
  93. const { wrapper } = setup({
  94. propOverrides: { members, editorsCanAdmin: true },
  95. isGrafanaAdmin: false,
  96. isOrgAdmin: false,
  97. });
  98. expect(wrapper).toMatchSnapshot();
  99. });
  100. });
  101. });
  102. describe('Functions', () => {
  103. describe('on search member query change', () => {
  104. it('it should call setSearchMemberQuery', () => {
  105. const { instance } = setup({});
  106. instance.onSearchQueryChange('member');
  107. expect(instance.props.setSearchMemberQuery).toHaveBeenCalledWith('member');
  108. });
  109. });
  110. describe('on remove member', () => {
  111. const { instance } = setup({});
  112. const mockTeamMember = getMockTeamMember();
  113. instance.onRemoveMember(mockTeamMember);
  114. expect(instance.props.removeTeamMember).toHaveBeenCalledWith(1);
  115. });
  116. describe('on add user to team', () => {
  117. const { wrapper, instance } = setup({});
  118. const state = wrapper.state() as State;
  119. state.newTeamMember = {
  120. id: 1,
  121. label: '',
  122. avatarUrl: '',
  123. login: '',
  124. };
  125. instance.onAddUserToTeam();
  126. expect(instance.props.addTeamMember).toHaveBeenCalledWith(1);
  127. });
  128. describe('on update permision for user in team', () => {
  129. const { instance } = setup({});
  130. const permission = TeamPermissionLevel.Admin;
  131. const item: SelectOptionItem = { value: permission };
  132. const member: TeamMember = {
  133. userId: 3,
  134. teamId: 2,
  135. avatarUrl: '',
  136. email: 'user@user.org',
  137. labels: [],
  138. login: 'member',
  139. permission: TeamPermissionLevel.Member,
  140. };
  141. const expectedTeamMemeber = { ...member, permission };
  142. instance.onPermissionChange(item, member);
  143. expect(instance.props.updateTeamMember).toHaveBeenCalledWith(expectedTeamMemeber);
  144. });
  145. });