diff --git a/packages/react/__tests__/src/components/NavBar/NavBar.js b/packages/react/__tests__/src/components/NavBar/NavBar.js
deleted file mode 100644
index 849ba1f08..000000000
--- a/packages/react/__tests__/src/components/NavBar/NavBar.js
+++ /dev/null
@@ -1,199 +0,0 @@
-import React from 'react';
-import { mount } from 'enzyme';
-import NavBar, { NavItem } from 'src/components/NavBar';
-import { act } from 'react-dom/test-utils';
-
-let wrapperNode;
-let mountNode;
-
-beforeEach(() => {
- wrapperNode = document.createElement('div');
- wrapperNode.innerHTML = `
- Click Me!
-
- `;
- document.body.appendChild(wrapperNode);
- mountNode = document.getElementById('mount');
-});
-
-afterEach(() => {
- document.body.innerHTML = '';
- wrapperNode = null;
- mountNode = null;
-});
-
-test('mounts without error', () => {
- expect(() =>
- mount(
-
-
-
- )
- ).not.toThrow();
-});
-
-test('renders className prop', () => {
- const MountedNavBar = mount(
-
-
-
- );
- expect(MountedNavBar.find('.find--me').exists()).toBe(true);
-});
-
-test('renders propId', () => {
- const MountedNavBar = mount(
-
-
-
- );
-
- expect(MountedNavBar.find('ul#someid').exists()).toBe(true);
-});
-
-test('renders NavBar trigger button when collapsed prop is true', () => {
- const MountedNavBar = mount(
-
-
- first item
-
-
- );
-
- expect(MountedNavBar.find('.NavBar__trigger').exists()).toBe(true);
- expect(MountedNavBar.find('.NavBar__trigger--active').exists()).toBe(false);
- expect(MountedNavBar.find('NavItem').exists()).toBe(false);
- expect(MountedNavBar.find('button').prop('aria-expanded')).toBe(false);
- expect(MountedNavBar.find('Icon').prop('type')).toEqual('hamburger-menu');
-});
-
-test('renders navTriggerLabel properly', () => {
- const MountedNavBar = mount(
-
-
- first item
-
-
- );
-
- expect(MountedNavBar.find('.NavBar__trigger').exists()).toBe(true);
- expect(
- MountedNavBar.find('.NavBar__trigger')
- .find('button')
- .text()
- ).toEqual('I am a label');
- expect(MountedNavBar.find('NavItem').exists()).toBe(false);
-});
-
-test('renders aria-controls prop on trigger button', () => {
- const MountedTrigger = mount(
-
-
- first item
-
-
- );
- expect(
- MountedTrigger.find('button.NavBar__trigger').prop('aria-controls')
- ).toEqual('someid');
-});
-
-test('shows NavItems after clicking NavBar trigger button', () => {
- const MountedNavBar = mount(
-
-
- first item
-
-
- );
-
- MountedNavBar.find('.NavBar__trigger').simulate('click');
- MountedNavBar.update();
- expect(MountedNavBar.find('NavItem').exists()).toBe(true);
- expect(MountedNavBar.find('.NavBar__trigger--active').exists()).toBe(true);
- expect(
- MountedNavBar.find('button.NavBar__trigger').prop('aria-expanded')
- ).toBe(true);
- expect(MountedNavBar.find('Icon').prop('type')).toEqual('close');
-});
-
-test('hides NavItems after pressing escape key', () => {
- const MountedNavBar = mount(
-
-
- first item
-
-
- );
-
- MountedNavBar.find('.NavBar__trigger').simulate('click');
- MountedNavBar.update();
-
- MountedNavBar.find('ul').simulate('keydown', { key: 'Escape' });
- MountedNavBar.update();
-
- expect(MountedNavBar.find('NavItem').exists()).toBe(false);
-});
-
-test('does not hide NavItems after pressing other keys', () => {
- const MountedNavBar = mount(
-
-
- first item
-
-
- );
-
- MountedNavBar.find('.NavBar__trigger').simulate('click');
- MountedNavBar.update();
-
- MountedNavBar.find('ul').simulate('keydown', { key: 'Home' });
- MountedNavBar.update();
-
- expect(MountedNavBar.find('NavItem').exists()).toBe(true);
-});
-
-test('hides NavItems when focusing outside nav', async () => {
- const MountedNavBar = mount(
-
-
- first item
-
- ,
- { attachTo: mountNode }
- );
-
- MountedNavBar.find('.NavBar__trigger').simulate('click');
- MountedNavBar.update();
-
- act(() => {
- wrapperNode
- .querySelector('a')
- .dispatchEvent(new Event('focusin', { bubbles: true }));
- });
-
- MountedNavBar.update();
-
- expect(MountedNavBar.find('NavItem').exists()).toBe(false);
-});
-
-test('does not hides NavItems when focusing inside nav', async () => {
- const MountedNavBar = mount(
-
-
- first item
-
- ,
- { attachTo: mountNode }
- );
-
- MountedNavBar.find('.NavBar__trigger').simulate('click');
- MountedNavBar.update();
-
- MountedNavBar.find('NavItem')
- .at(0)
- .simulate('focus');
- MountedNavBar.update();
-
- expect(MountedNavBar.find('NavItem').exists()).toBe(true);
-});
diff --git a/packages/react/src/components/NavBar/navBar.test.tsx b/packages/react/src/components/NavBar/navBar.test.tsx
new file mode 100644
index 000000000..8e12065fe
--- /dev/null
+++ b/packages/react/src/components/NavBar/navBar.test.tsx
@@ -0,0 +1,179 @@
+import React from 'react';
+import { render, fireEvent, screen } from '@testing-library/react';
+import NavBar, { NavItem } from './';
+import axe from '../../axe';
+
+let wrapperNode: HTMLDivElement | null;
+let mountNode: HTMLElement | null;
+
+beforeEach(() => {
+ wrapperNode = document.createElement('div');
+ wrapperNode.innerHTML = `
+ Click Me!
+
+ `;
+ document.body.appendChild(wrapperNode);
+ mountNode = document.getElementById('mount');
+});
+
+afterEach(() => {
+ document.body.innerHTML = '';
+ wrapperNode = null;
+ mountNode = null;
+});
+
+test('should render without error', () => {
+ render(
+
+
+
+ );
+ expect(screen.getByRole('navigation')).toBeInTheDocument();
+});
+
+test('should render with propId', () => {
+ render(
+
+
+
+ );
+ expect(screen.getByRole('list')).toHaveAttribute('id', 'someid');
+});
+
+test('should render NavBar trigger button when collapsed prop is true', () => {
+ render(
+
+
+ first item
+
+
+ );
+
+ expect(screen.getByRole('button')).toHaveAttribute('aria-expanded', 'false');
+ expect(screen.getByRole('button')).toHaveClass('NavBar__trigger');
+ expect(screen.getByRole('button')).not.toHaveClass('NavBar__trigger--active');
+ expect(screen.queryByRole('listitem')).not.toBeInTheDocument();
+ expect(screen.getByRole('navigation').querySelector('.Icon')).toHaveClass(
+ 'Icon',
+ 'Icon--hamburger-menu'
+ );
+});
+
+test('should render navTriggerLabel properly', () => {
+ render(
+
+
+ first item
+
+
+ );
+
+ expect(screen.getByRole('button')).toHaveAccessibleName('I am a label');
+});
+
+test('should render aria-controls prop on trigger button', () => {
+ render(
+
+
+ first item
+
+
+ );
+
+ expect(screen.getByRole('button')).toHaveAttribute('aria-controls', 'someid');
+});
+
+test('should render aria-controls prop on trigger button', () => {
+ render(
+
+
+ first item
+
+
+ );
+
+ fireEvent.click(screen.getByRole('button'));
+ expect(screen.getByText('first item')).toBeInTheDocument();
+});
+
+test('should hide NavItems after pressing escape key', () => {
+ render(
+
+
+ first item
+
+
+ );
+
+ fireEvent.click(screen.getByRole('button'));
+ fireEvent.keyDown(screen.getByRole('list'), { key: 'Escape' });
+ expect(screen.queryByRole('listitem')).not.toBeInTheDocument();
+});
+
+test('should not hide NavItems after pressing other keys', () => {
+ render(
+
+
+ first item
+
+
+ );
+
+ fireEvent.click(screen.getByRole('button'));
+ fireEvent.keyDown(screen.getByRole('list'), { key: 'Home' });
+ expect(screen.queryByRole('listitem')).toBeInTheDocument();
+});
+
+test('should hide NavItems when focusing outside nav', () => {
+ render(
+
+
+ first item
+
+
+ );
+
+ fireEvent.click(screen.getByTestId('link'));
+ fireEvent.focusIn(screen.getByTestId('link'));
+ expect(screen.queryByRole('listitem')).not.toBeInTheDocument();
+});
+
+test('should not hide NavItems when focusing inside nav', () => {
+ render(
+
+
+ first item
+
+
+ );
+
+ fireEvent.click(screen.getByRole('button'));
+ fireEvent.focusIn(screen.getByRole('listitem'));
+ expect(screen.getByRole('listitem')).toBeInTheDocument();
+});
+
+test('returns no axe violations when collapsed is true', async () => {
+ const { container } = render(
+
+
+ I am a child
+
+
+ );
+
+ const results = await axe(container);
+ expect(results).toHaveNoViolations();
+});
+
+test('returns no axe violations when collapsed is false', async () => {
+ const { container } = render(
+
+
+ I am a child
+
+
+ );
+
+ const results = await axe(container);
+ expect(results).toHaveNoViolations();
+});