From bfbe856319fb29188f2749b834f2a6ddd3edf3a4 Mon Sep 17 00:00:00 2001 From: Alex Khomenko Date: Tue, 31 May 2022 11:33:27 +0300 Subject: [PATCH] TeamMemberRow: Convert tests to RTL (#49875) * TeamMemberRow: Remove legacy select * TeamMemberRow: Update attributes * TeamMemberRow: Refactor tests to RTL --- .betterer.results | 3 - .../app/features/teams/TeamMemberRow.test.tsx | 82 ++--- public/app/features/teams/TeamMemberRow.tsx | 32 +- .../__snapshots__/TeamMemberRow.test.tsx.snap | 294 ------------------ 4 files changed, 48 insertions(+), 363 deletions(-) delete mode 100644 public/app/features/teams/__snapshots__/TeamMemberRow.test.tsx.snap diff --git a/.betterer.results b/.betterer.results index 7e4d9cdd1b3..99f04a4c775 100644 --- a/.betterer.results +++ b/.betterer.results @@ -170,9 +170,6 @@ exports[`no enzyme tests`] = { "public/app/features/org/OrgProfile.test.tsx:623809345": [ [0, 19, 13, "RegExp match", "2409514259"] ], - "public/app/features/teams/TeamMemberRow.test.tsx:1649328210": [ - [0, 19, 13, "RegExp match", "2409514259"] - ], "public/app/features/teams/TeamMembers.test.tsx:4089428239": [ [0, 19, 13, "RegExp match", "2409514259"] ], diff --git a/public/app/features/teams/TeamMemberRow.test.tsx b/public/app/features/teams/TeamMemberRow.test.tsx index c2318e946fd..77724589c7d 100644 --- a/public/app/features/teams/TeamMemberRow.test.tsx +++ b/public/app/features/teams/TeamMemberRow.test.tsx @@ -1,9 +1,8 @@ -import { shallow } from 'enzyme'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import React from 'react'; -import { SelectableValue } from '@grafana/data'; - -import { TeamMember, TeamPermissionLevel } from '../../types'; +import { TeamPermissionLevel } from '../../types'; import { TeamMemberRow, Props } from './TeamMemberRow'; import { getMockTeamMember } from './__mocks__/teamMocks'; @@ -20,75 +19,60 @@ const setup = (propOverrides?: object) => { Object.assign(props, propOverrides); - const wrapper = shallow(); - const instance = wrapper.instance() as TeamMemberRow; - - return { - wrapper, - instance, - }; + render( + + + + +
+ ); }; describe('Render', () => { - it('should render team members when sync enabled', () => { + it('should render team member labels when sync enabled', () => { const member = getMockTeamMember(); member.labels = ['LDAP']; - const { wrapper } = setup({ member, syncEnabled: true }); - - expect(wrapper).toMatchSnapshot(); + setup({ member, syncEnabled: true }); + expect(screen.getByText('LDAP')).toBeInTheDocument(); }); describe('when feature toggle editorsCanAdmin is turned on', () => { it('should render permissions select if user is team admin', () => { - const { wrapper } = setup({ editorsCanAdmin: true, signedInUserIsTeamAdmin: true }); - - expect(wrapper).toMatchSnapshot(); - }); - - it('should render span and disable buttons if user is team member', () => { - const { wrapper } = setup({ editorsCanAdmin: true, signedInUserIsTeamAdmin: false }); - - expect(wrapper).toMatchSnapshot(); + const member = getMockTeamMember(); + setup({ editorsCanAdmin: true, signedInUserIsTeamAdmin: true, member }); + expect(screen.getByLabelText(`Select member's ${member.name} permission level`)).toBeInTheDocument(); }); }); describe('when feature toggle editorsCanAdmin is turned off', () => { it('should not render permissions', () => { - const { wrapper } = setup({ editorsCanAdmin: false, signedInUserIsTeamAdmin: true }); - - expect(wrapper).toMatchSnapshot(); + const member = getMockTeamMember(); + setup({ editorsCanAdmin: false, signedInUserIsTeamAdmin: true, member }); + expect(screen.queryByLabelText(`Select member's ${member.name} permission level`)).not.toBeInTheDocument(); }); }); }); describe('Functions', () => { - describe('on remove member', () => { + it('should remove member on remove button click', async () => { const member = getMockTeamMember(); - const { instance } = setup({ member }); + const mockRemove = jest.fn(); + setup({ member, removeTeamMember: mockRemove, editorsCanAdmin: true, signedInUserIsTeamAdmin: true }); + await userEvent.click(screen.getByRole('button', { name: `Remove team member ${member.name}` })); + await userEvent.click(screen.getByRole('button', { name: 'Delete' })); - instance.onRemoveMember(member); - - expect(instance.props.removeTeamMember).toHaveBeenCalledWith(1); + expect(mockRemove).toHaveBeenCalledWith(member.userId); }); - describe('on update permision for user in team', () => { - const member: TeamMember = { - userId: 3, - teamId: 2, - avatarUrl: '', - email: 'user@user.org', - login: 'member', - name: 'member', - labels: [], - permission: TeamPermissionLevel.Member, - }; - const { instance } = setup({ member }); + it('should update permission for user in team', async () => { + const member = getMockTeamMember(); + const mockUpdate = jest.fn(); + setup({ member, editorsCanAdmin: true, signedInUserIsTeamAdmin: true, updateTeamMember: mockUpdate }); const permission = TeamPermissionLevel.Admin; - const item: SelectableValue = { value: permission }; - const expectedTeamMemeber = { ...member, permission }; + const expectedTeamMember = { ...member, permission }; + await userEvent.click(screen.getByLabelText(`Select member's ${member.name} permission level`)); + await userEvent.click(screen.getByText('Admin')); - instance.onPermissionChange(item, member); - - expect(instance.props.updateTeamMember).toHaveBeenCalledWith(expectedTeamMemeber); + expect(mockUpdate).toHaveBeenCalledWith(expectedTeamMember); }); }); diff --git a/public/app/features/teams/TeamMemberRow.tsx b/public/app/features/teams/TeamMemberRow.tsx index 7c65e9e1150..86fb06f39b8 100644 --- a/public/app/features/teams/TeamMemberRow.tsx +++ b/public/app/features/teams/TeamMemberRow.tsx @@ -2,15 +2,13 @@ import React, { PureComponent } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import { SelectableValue } from '@grafana/data'; -import { LegacyForms, DeleteButton } from '@grafana/ui'; +import { Select, DeleteButton } from '@grafana/ui'; import { TagBadge } from 'app/core/components/TagFilter/TagBadge'; import { WithFeatureToggle } from 'app/core/components/WithFeatureToggle'; import { TeamMember, teamsPermissionLevels, TeamPermissionLevel } from 'app/types'; import { updateTeamMember, removeTeamMember } from './state/actions'; -const { Select } = LegacyForms; - const mapDispatchToProps = { removeTeamMember, updateTeamMember, @@ -54,18 +52,18 @@ export class TeamMemberRow extends PureComponent { return ( -
- {signedInUserIsTeamAdmin && ( - this.onPermissionChange(item, member)} + value={value} + width={32} + aria-label={`Select member's ${member.name} permission level`} + /> + ) : ( + {value.label} + )} ); @@ -91,7 +89,7 @@ export class TeamMemberRow extends PureComponent { {`Avatar @@ -103,7 +101,7 @@ export class TeamMemberRow extends PureComponent { {syncEnabled && this.renderLabels(member.labels)} this.onRemoveMember(member)} diff --git a/public/app/features/teams/__snapshots__/TeamMemberRow.test.tsx.snap b/public/app/features/teams/__snapshots__/TeamMemberRow.test.tsx.snap deleted file mode 100644 index 84467bdfb36..00000000000 --- a/public/app/features/teams/__snapshots__/TeamMemberRow.test.tsx.snap +++ /dev/null @@ -1,294 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Render should render team members when sync enabled 1`] = ` - - - - - - testUser - - - test@test.com - - - testName - - - -
- - Member - -
- -
- - - - - - - -`; - -exports[`Render when feature toggle editorsCanAdmin is turned off should not render permissions 1`] = ` - - - - - - testUser - - - test@test.com - - - testName - - - -
- -
- -
- - - - -`; - -exports[`Render when feature toggle editorsCanAdmin is turned on should render span and disable buttons if user is team member 1`] = ` - - - - - - testUser - - - test@test.com - - - testName - - - -
- - Member - -
- -
- - - - -`;