diff options
| author | Armand Philippot <git@armandphilippot.com> | 2023-11-03 12:22:47 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2023-11-11 18:15:27 +0100 |
| commit | 5d3e8a4d0c2ce2ad8f22df857ab3ce54fcfc38ac (patch) | |
| tree | a758333b29e2e6614de609acb312ea9ff0d3a33b /src/components/organisms/navbar/navbar-item/navbar-item.test.tsx | |
| parent | 655be4404630a20ae4ca40c4af84afcc2e63557b (diff) | |
refactor(components): replace Toolbar with Navbar component
* remove SearchModal and SettingsModal components
* add a generic NavbarItem component (instead of the previous toolbar
items to avoid unreadable styles...)
* move FlippingLabel component logic into NavbarItem since it is only
used here
Diffstat (limited to 'src/components/organisms/navbar/navbar-item/navbar-item.test.tsx')
| -rw-r--r-- | src/components/organisms/navbar/navbar-item/navbar-item.test.tsx | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/components/organisms/navbar/navbar-item/navbar-item.test.tsx b/src/components/organisms/navbar/navbar-item/navbar-item.test.tsx new file mode 100644 index 0000000..2e7edea --- /dev/null +++ b/src/components/organisms/navbar/navbar-item/navbar-item.test.tsx @@ -0,0 +1,79 @@ +import { describe, expect, it } from '@jest/globals'; +import { render, screen as rtlScreen } from '@testing-library/react'; +import { userEvent } from '@testing-library/user-event'; +import { useBoolean } from '../../../../utils/hooks'; +import { NavbarItem, type NavbarItemProps } from './navbar-item'; + +const ControlledNavbarItem = ({ + isActive, + ...props +}: Omit<NavbarItemProps, 'onDeactivate' | 'onToggle'>) => { + const { deactivate, state, toggle } = useBoolean(isActive); + + return ( + <NavbarItem + {...props} + isActive={state} + onDeactivate={deactivate} + onToggle={toggle} + /> + ); +}; + +describe('NavbarItem', () => { + it('renders a labelled checkbox to open/close a modal', async () => { + const label = 'quod'; + const modal = 'tempore ipsam laborum'; + const user = userEvent.setup(); + + render( + <ControlledNavbarItem + icon="arrow" + id="vel" + isActive={false} + label={label} + > + {modal} + </ControlledNavbarItem> + ); + + // eslint-disable-next-line @typescript-eslint/no-magic-numbers + expect.assertions(3); + + const controller = rtlScreen.getByRole('checkbox', { name: label }); + + expect(controller).not.toBeChecked(); + // Since the visibility is declared in CSS we cannot use this assertion. + //expect(rtlScreen.getByText(modal)).not.toBeVisible(); + + await user.click(controller); + + expect(controller).toBeChecked(); + expect(rtlScreen.getByText(modal)).toBeVisible(); + }); + + it('can deactivate the modal when clicking outside', async () => { + const label = 'qui'; + const modal = 'laborum doloremque id'; + const user = userEvent.setup(); + + render( + <ControlledNavbarItem icon="arrow" id="et" isActive label={label}> + {modal} + </ControlledNavbarItem> + ); + + // eslint-disable-next-line @typescript-eslint/no-magic-numbers + expect.assertions(2); + + const controller = rtlScreen.getByRole('checkbox', { name: label }); + + expect(controller).toBeChecked(); + + if (controller.parentElement) await user.click(controller.parentElement); + + expect(controller).not.toBeChecked(); + // Since the visibility is declared in CSS we cannot use this assertion. + //expect(rtlScreen.getByText(modal)).not.toBeVisible(); + }); +}); |
