From 79396f9c8a29116f4bfc7281c152b24026d7bc93 Mon Sep 17 00:00:00 2001 From: Jenny <32821331+jenny-s51@users.noreply.github.com> Date: Tue, 29 Aug 2023 14:04:11 -0400 Subject: [PATCH 1/7] chore(ChipGroup): test revamp --- .../Chip/__tests__/ChipGroup.test.tsx | 102 +++--- .../__snapshots__/ChipGroup.test.tsx.snap | 340 ------------------ 2 files changed, 50 insertions(+), 392 deletions(-) delete mode 100644 packages/react-core/src/components/Chip/__tests__/__snapshots__/ChipGroup.test.tsx.snap diff --git a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx index 69055dcc3ef..77170c9da70 100644 --- a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx +++ b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx @@ -6,65 +6,63 @@ import userEvent from '@testing-library/user-event'; import { ChipGroup } from '../index'; import { Chip } from '../../Chip'; -describe('ChipGroup', () => { - test('chip group default', () => { - const { asFragment } = render( - - 1.1 - - ); +test('chip group default', () => { + render( + + 1.1 + + ); - expect(asFragment()).toMatchSnapshot(); - }); + expect(screen.getByRole('group')).toHaveClass(''); +}); - test('chip group with category', () => { - const { asFragment } = render( - - 1.1 - - ); - expect(asFragment()).toMatchSnapshot(); - }); +test('chip group with category', () => { + render( + + 1.1 + + ); + expect(screen.getByText('category')).toBeVisible(); +}); - test('chip group with closable category', () => { - const { asFragment } = render( - - 1.1 - - ); - expect(asFragment()).toMatchSnapshot(); - }); +test('chip group with closable category', () => { + render( + + 1.1 + + ); + expect(screen.getByLabelText('Close chip group').closest('div')).toHaveClass('pf-v5-c-chip-group__close'); +}); - test('chip group expanded', async () => { - const user = userEvent.setup(); +test('chip group expanded', async () => { + const user = userEvent.setup(); - render( - - 1 - 2 - 3 - 4 - - ); + render( + + 1 + 2 + 3 + 4 + + ); - const moreText = screen.getByText('1 more'); - expect(moreText).toBeInTheDocument(); + const moreText = screen.getByText('1 more'); + expect(moreText).toBeInTheDocument(); - await user.click(moreText); - expect(screen.getByText('Show Less')).toBeInTheDocument(); - }); + await user.click(moreText); + expect(screen.getByText('Show Less')).toBeInTheDocument(); +}); - test('chip group will not render if no children passed', () => { - render(); - expect(screen.queryByRole('group')).toBeNull(); - }); +test('chip group will not render if no children passed', () => { + render(); + expect(screen.queryByRole('group')).toBeNull(); +}); - test('chip group with category and tooltip', () => { - const { asFragment } = render( - - 1.1 - - ); - expect(asFragment()).toMatchSnapshot(); - }); +test('chip group with category and tooltip', () => { + render( + + 1.1 + + ); + expect(screen.getByText('A very long category name')).toBeVisible(); }); diff --git a/packages/react-core/src/components/Chip/__tests__/__snapshots__/ChipGroup.test.tsx.snap b/packages/react-core/src/components/Chip/__tests__/__snapshots__/ChipGroup.test.tsx.snap deleted file mode 100644 index 0b8e5375434..00000000000 --- a/packages/react-core/src/components/Chip/__tests__/__snapshots__/ChipGroup.test.tsx.snap +++ /dev/null @@ -1,340 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ChipGroup chip group default 1`] = ` - -
-
-
    -
  • -
    - - - 1.1 - - - - - -
    -
  • -
-
-
-
-`; - -exports[`ChipGroup chip group with category 1`] = ` - -
-
- - category - -
    -
  • -
    - - - 1.1 - - - - - -
    -
  • -
-
-
-
-`; - -exports[`ChipGroup chip group with category and tooltip 1`] = ` - -
-
- - A very long category name - -
    -
  • -
    - - - 1.1 - - - - - -
    -
  • -
-
-
-
-`; - -exports[`ChipGroup chip group with closable category 1`] = ` - -
-
- - category - -
    -
  • -
    - - - 1.1 - - - - - -
    -
  • -
-
-
- -
-
-
-`; From 0409b128aaf1dcaaa76d9317423e2174a08005ad Mon Sep 17 00:00:00 2001 From: Jenny <32821331+jenny-s51@users.noreply.github.com> Date: Tue, 29 Aug 2023 14:08:32 -0400 Subject: [PATCH 2/7] add className --- .../react-core/src/components/Chip/__tests__/ChipGroup.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx index 77170c9da70..0c4c43381da 100644 --- a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx +++ b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx @@ -13,7 +13,7 @@ test('chip group default', () => {
); - expect(screen.getByRole('group')).toHaveClass(''); + expect(screen.getByRole('group')).toHaveClass('pf-v5-c-chip-group'); }); test('chip group with category', () => { From a14afbc2fcc3217f757f232249465971a6dc9444 Mon Sep 17 00:00:00 2001 From: Jenny <32821331+jenny-s51@users.noreply.github.com> Date: Wed, 27 Sep 2023 09:16:17 -0400 Subject: [PATCH 3/7] chip group updates, WIP --- .../Chip/__tests__/ChipGroup.test.tsx | 87 ++++++++++++++++++- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx index 0c4c43381da..73d74ad3498 100644 --- a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx +++ b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx @@ -5,6 +5,7 @@ import userEvent from '@testing-library/user-event'; import { ChipGroup } from '../index'; import { Chip } from '../../Chip'; +import styles from '@patternfly/react-styles/css/components/Chip/chip-group'; test('chip group default', () => { render( @@ -13,7 +14,37 @@ test('chip group default', () => {
); - expect(screen.getByRole('group')).toHaveClass('pf-v5-c-chip-group'); + expect(screen.getByRole('group')).toHaveClass(styles.chipGroup); +}); + +test('chip group with custom className', () => { + render( + + 1.1 + + ); + + expect(screen.getByRole('group')).toHaveClass(`${styles.chipGroup} test`); +}); + +test('chip group has aria-label by default when categoryName is not passed', () => { + render( + + 1.1 + + ); + + expect(screen.getByRole('group')).toHaveAccessibleName('Chip group category'); +}); + +test('chip group with custom aria-label', () => { + render( + + 1.1 + + ); + + expect(screen.getByRole('group')).toHaveAccessibleName('test chip group'); }); test('chip group with category', () => { @@ -25,13 +56,59 @@ test('chip group with category', () => { expect(screen.getByText('category')).toBeVisible(); }); +test('chip group expands', async () => { + const user = userEvent.setup(); + const chips = ['Chip one', 'Really long chip that goes on and on', 'Chip three', 'Chip four', 'Chip five']; + + render( + + {chips.map((currentChip) => ( + + {currentChip} + + ))} + + ); + + await user.click(screen.getByText('2 more')); + expect(screen.getByText('chip five')).toBeVisible(); +}); + test('chip group with closable category', () => { render( 1.1 ); - expect(screen.getByLabelText('Close chip group').closest('div')).toHaveClass('pf-v5-c-chip-group__close'); + expect(screen.getByLabelText('Close chip group').closest('div')).toHaveClass(styles.chipGroupClose); +}); + +test('chip group onClick', async () => { + const onClose = jest.fn(); + const user = userEvent.setup(); + + render( + + 1.1 + + ); + + await user.click(screen.getByLabelText('Close chip group')); + expect(onClose).toHaveBeenCalled(); +}); + +test('chip group onOverflowChipClick', async () => { + const onOverflowChipClick = jest.fn(); + const user = userEvent.setup(); + + render( + + 1.1 + + ); + + await user.click(screen.getByLabelText('Close chip group')); + expect(onOverflowChipClick).toHaveBeenCalled(); }); test('chip group expanded', async () => { @@ -66,3 +143,9 @@ test('chip group with category and tooltip', () => { ); expect(screen.getByText('A very long category name')).toBeVisible(); }); + +test('chip group renders to match snapshot', () => { + const { asFragment } = render(); + expect(screen.getByLabelText('test chip group')).toBeInTheDocument(); + expect(asFragment()).toMatchSnapshot(); +}); From 2ee4ef98801072c2a87608e775a8bba5ac8a4863 Mon Sep 17 00:00:00 2001 From: Jenny <32821331+jenny-s51@users.noreply.github.com> Date: Thu, 26 Oct 2023 15:53:31 -0400 Subject: [PATCH 4/7] PR feedback from Eric, added tests --- .../Chip/__tests__/ChipGroup.test.tsx | 177 ++++++++++++++++-- .../__snapshots__/ChipGroup.test.tsx.snap | 29 +++ 2 files changed, 190 insertions(+), 16 deletions(-) create mode 100644 packages/react-core/src/components/Chip/__tests__/__snapshots__/ChipGroup.test.tsx.snap diff --git a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx index 73d74ad3498..09678d6ffeb 100644 --- a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx +++ b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx @@ -56,6 +56,33 @@ test('chip group with category', () => { expect(screen.getByText('category')).toBeVisible(); }); +test('chip group with category renders with class pf-m-category', () => { + render( + + 1.1 + + ); + expect(screen.getByRole('group')).toHaveClass(`${styles.chipGroup} pf-m-category`); +}); + +test('chip group has aria-labelledby attribute', () => { + render( + + 1.1 + + ); + expect(screen.getByRole('group')).toHaveAttribute('aria-labelledby', expect.stringContaining(`pf-random-id`)); +}); + +test('chip group has aria-labelledby attribute set to ID value', () => { + render( + + 1.1 + + ); + expect(screen.getByRole('group')).toHaveAttribute('aria-labelledby', 'chip-group-id'); +}); + test('chip group expands', async () => { const user = userEvent.setup(); const chips = ['Chip one', 'Really long chip that goes on and on', 'Chip three', 'Chip four', 'Chip five']; @@ -63,15 +90,13 @@ test('chip group expands', async () => { render( {chips.map((currentChip) => ( - - {currentChip} - + {currentChip} ))} ); await user.click(screen.getByText('2 more')); - expect(screen.getByText('chip five')).toBeVisible(); + expect(screen.getByText('Chip five')).toBeVisible(); }); test('chip group with closable category', () => { @@ -80,7 +105,16 @@ test('chip group with closable category', () => { 1.1 ); - expect(screen.getByLabelText('Close chip group').closest('div')).toHaveClass(styles.chipGroupClose); + expect(screen.getByRole('group').lastChild).toHaveClass(styles.chipGroupClose); +}); + +test('chip group with closeBtnAriaLabel', () => { + render( + + 1.1 + + ); + expect(screen.getByLabelText('close button aria label')).toBeInTheDocument(); }); test('chip group onClick', async () => { @@ -103,11 +137,14 @@ test('chip group onOverflowChipClick', async () => { render( - 1.1 + 1 + 2 + 3 + 4 ); - await user.click(screen.getByLabelText('Close chip group')); + await user.click(screen.getByText('1 more')); expect(onOverflowChipClick).toHaveBeenCalled(); }); @@ -130,22 +167,130 @@ test('chip group expanded', async () => { expect(screen.getByText('Show Less')).toBeInTheDocument(); }); -test('chip group will not render if no children passed', () => { - render(); - expect(screen.queryByRole('group')).toBeNull(); +test('overflow chip does not render by default when < 4 children are passed', async () => { + const user = userEvent.setup(); + + render( + + 1 + 2 + 3 + + ); + + expect(screen.queryByText('1 more')).not.toBeInTheDocument(); }); -test('chip group with category and tooltip', () => { +test('overflow chip collapsed by default', async () => { + const user = userEvent.setup(); + render( - - 1.1 + + 1 + 2 + 3 + 4 + + ); + + const moreText = screen.getByText('1 more'); + expect(moreText).toBeInTheDocument(); +}); + +test('overflow chip renders with the default numChips prop value of 3', async () => { + const user = userEvent.setup(); + + render( + + 1 + 2 + 3 + 4 + + ); + + const moreText = screen.getByText('1 more'); + expect(moreText).toBeInTheDocument(); + + await user.click(moreText); + expect(screen.getByText('Show Less')).toBeInTheDocument(); +}); + +test('overflow chip renders with numChips prop value of 2', async () => { + const user = userEvent.setup(); + + render( + + 1 + 2 + 3 ); - expect(screen.getByText('A very long category name')).toBeVisible(); + + const moreText = screen.getByText('1 more'); + expect(moreText).toBeInTheDocument(); + + await user.click(moreText); + expect(screen.getByText('Show Less')).toBeInTheDocument(); +}); + +test('clicking the overflow chip causes the text to update with the default props', async () => { + const user = userEvent.setup(); + + render( + + 1 + 2 + 3 + 4 + + ); + + const moreText = screen.getByText('1 more'); + + await user.click(moreText); + expect(screen.getByText('Show Less')).toBeInTheDocument(); +}); + +test('passing in the expandedText and collapsedText props work', async () => { + const user = userEvent.setup(); + + render( + + 1 + 2 + 3 + 4 + + ); + + const moreText = screen.getByText('Expand'); + expect(moreText).toBeInTheDocument(); + + await user.click(moreText); + expect(screen.getByText('Collapse')).toBeInTheDocument(); +}); + +test('passing defaultIsOpen of true causes the chip group to be expanded by default', async () => { + render( + + 1 + 2 + 3 + 4 + + ); + + expect(screen.getByText('Show Less')).toBeInTheDocument(); +}); + +test('chip group will not render if no children passed', () => { + render(); + expect(screen.queryByRole('group')).toBeNull(); }); test('chip group renders to match snapshot', () => { - const { asFragment } = render(); - expect(screen.getByLabelText('test chip group')).toBeInTheDocument(); + const { asFragment } = render(chips); + expect(screen.getByRole('group')).toBeInTheDocument(); expect(asFragment()).toMatchSnapshot(); }); diff --git a/packages/react-core/src/components/Chip/__tests__/__snapshots__/ChipGroup.test.tsx.snap b/packages/react-core/src/components/Chip/__tests__/__snapshots__/ChipGroup.test.tsx.snap new file mode 100644 index 00000000000..e54bd1962a6 --- /dev/null +++ b/packages/react-core/src/components/Chip/__tests__/__snapshots__/ChipGroup.test.tsx.snap @@ -0,0 +1,29 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`chip group renders to match snapshot 1`] = ` + +
+
+
    +
  • + chips +
  • +
+
+
+
+`; From 58967d9868992eae48abb5c5c1c15ff75129e2e0 Mon Sep 17 00:00:00 2001 From: Jenny <32821331+jenny-s51@users.noreply.github.com> Date: Fri, 27 Oct 2023 11:45:23 -0400 Subject: [PATCH 5/7] Apply suggestions from code review Co-authored-by: Eric Olkowski <70952936+thatblindgeye@users.noreply.github.com> --- .../src/components/Chip/__tests__/ChipGroup.test.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx index 09678d6ffeb..3726d263d98 100644 --- a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx +++ b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx @@ -62,7 +62,7 @@ test('chip group with category renders with class pf-m-category', () => { 1.1
); - expect(screen.getByRole('group')).toHaveClass(`${styles.chipGroup} pf-m-category`); + expect(screen.getByRole('group')).toHaveClass(`${styles.modifiers.category}`); }); test('chip group has aria-labelledby attribute', () => { @@ -110,8 +110,8 @@ test('chip group with closable category', () => { test('chip group with closeBtnAriaLabel', () => { render( - - 1.1 + + 1.1 ); expect(screen.getByLabelText('close button aria label')).toBeInTheDocument(); @@ -128,7 +128,7 @@ test('chip group onClick', async () => { ); await user.click(screen.getByLabelText('Close chip group')); - expect(onClose).toHaveBeenCalled(); + expect(onClose).toHaveBeenCalledTimes(1); }); test('chip group onOverflowChipClick', async () => { From 77b8388ff33a51755284e3aba178416ce2b484e4 Mon Sep 17 00:00:00 2001 From: Jenny <32821331+jenny-s51@users.noreply.github.com> Date: Fri, 27 Oct 2023 11:47:11 -0400 Subject: [PATCH 6/7] update onOverflowChipClick test to match onClick --- .../react-core/src/components/Chip/__tests__/ChipGroup.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx index 3726d263d98..ebb42828d17 100644 --- a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx +++ b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx @@ -145,7 +145,7 @@ test('chip group onOverflowChipClick', async () => { ); await user.click(screen.getByText('1 more')); - expect(onOverflowChipClick).toHaveBeenCalled(); + expect(onOverflowChipClick).toHaveBeenCalledTimes(1); }); test('chip group expanded', async () => { From dd70f94ee42927583588eb95c3e88c36fbd9beb7 Mon Sep 17 00:00:00 2001 From: Jenny <32821331+jenny-s51@users.noreply.github.com> Date: Fri, 27 Oct 2023 13:07:28 -0400 Subject: [PATCH 7/7] add check for accessibleName --- .../react-core/src/components/Chip/__tests__/ChipGroup.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx index ebb42828d17..807944710f1 100644 --- a/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx +++ b/packages/react-core/src/components/Chip/__tests__/ChipGroup.test.tsx @@ -115,6 +115,7 @@ test('chip group with closeBtnAriaLabel', () => { ); expect(screen.getByLabelText('close button aria label')).toBeInTheDocument(); + expect(screen.getByLabelText('close button aria label')).toHaveAccessibleName("close button aria label category"); }); test('chip group onClick', async () => {