fix: unit test

This commit is contained in:
Maulana Sodiqin
2025-04-25 14:01:29 +07:00
parent 41712be56a
commit 86290cc820
2 changed files with 30 additions and 67 deletions
+27 -67
View File
@@ -7,6 +7,7 @@ import {
} from '@testing-library/react'; } from '@testing-library/react';
import { BrowserRouter } from 'react-router-dom'; import { BrowserRouter } from 'react-router-dom';
import { Navbar } from './navbar'; import { Navbar } from './navbar';
import { ModalLoginProvider } from '@imphnen-frontend-service/utils';
interface MatchMediaResult { interface MatchMediaResult {
matches: boolean; matches: boolean;
@@ -37,7 +38,16 @@ function mockMatchMedia(width: { matches: boolean }): void {
}); });
} }
describe('Navbar', () => { const renderWithProvider = () =>
render(
<BrowserRouter>
<ModalLoginProvider>
<Navbar />
</ModalLoginProvider>
</BrowserRouter>
);
describe('Navbar Component', () => {
beforeEach(() => { beforeEach(() => {
document.body.innerHTML = ''; document.body.innerHTML = '';
}); });
@@ -46,95 +56,57 @@ describe('Navbar', () => {
vi.restoreAllMocks(); vi.restoreAllMocks();
}); });
it('renders the logo', () => { it('Test renders the logo', () => {
render( renderWithProvider();
<BrowserRouter>
<Navbar />
</BrowserRouter>
);
const logo: HTMLElement = screen.getByAltText(/IMPHNEN Logo/i); const logo: HTMLElement = screen.getByAltText(/IMPHNEN Logo/i);
expect(logo).toBeInTheDocument(); expect(logo).toBeInTheDocument();
}); });
it('renders the Home link', () => { it('Test renders the Home link', () => {
render( renderWithProvider();
<BrowserRouter>
<Navbar />
</BrowserRouter>
);
const homeLink: HTMLElement = screen.getByRole('link', { name: /home/i }); const homeLink: HTMLElement = screen.getByRole('link', { name: /home/i });
expect(homeLink).toBeInTheDocument(); expect(homeLink).toBeInTheDocument();
}); });
it('renders the Merch Gacha link', () => { it('Test renders the Merch Gacha link', () => {
render( renderWithProvider();
<BrowserRouter>
<Navbar />
</BrowserRouter>
);
const merchLink: HTMLElement = screen.getByRole('link', { const merchLink: HTMLElement = screen.getByRole('link', {
name: /merch gacha/i, name: /merch gacha/i,
}); });
expect(merchLink).toBeInTheDocument(); expect(merchLink).toBeInTheDocument();
}); });
it('displays horizontal menu on desktop screens', () => { it('Test displays horizontal menu on desktop screens', () => {
mockMatchMedia({ matches: true }); mockMatchMedia({ matches: true });
global.innerWidth = 1024; global.innerWidth = 1024;
global.dispatchEvent(new Event('resize')); global.dispatchEvent(new Event('resize'));
renderWithProvider();
render(
<BrowserRouter>
<Navbar />
</BrowserRouter>
);
const navItems: HTMLElement = screen.getByRole('list'); const navItems: HTMLElement = screen.getByRole('list');
expect(navItems).toHaveClass('md:flex'); expect(navItems).toHaveClass('md:flex');
const hamburgerButton: HTMLElement = screen.getByRole('button'); const hamburgerButton: HTMLElement = screen.getByRole('button');
expect(hamburgerButton).toHaveClass('md:hidden'); expect(hamburgerButton).toHaveClass('md:hidden');
}); });
it('displays hamburger menu on mobile screens and can toggle dropdown', () => { it('Test displays hamburger menu on mobile screens and can toggle dropdown', () => {
mockMatchMedia({ matches: false }); mockMatchMedia({ matches: false });
global.innerWidth = 375; global.innerWidth = 375;
global.dispatchEvent(new Event('resize')); global.dispatchEvent(new Event('resize'));
renderWithProvider();
render(
<BrowserRouter>
<Navbar />
</BrowserRouter>
);
const hamburgerButton: HTMLElement = screen.getByRole('button'); const hamburgerButton: HTMLElement = screen.getByRole('button');
expect(hamburgerButton).toBeVisible(); expect(hamburgerButton).toBeVisible();
fireEvent.click(hamburgerButton); fireEvent.click(hamburgerButton);
const dropdownMenu: HTMLElement[] = screen.getAllByRole('list'); const dropdownMenu: HTMLElement[] = screen.getAllByRole('list');
expect(dropdownMenu[1]).toBeVisible(); expect(dropdownMenu[1]).toBeVisible();
fireEvent.click(hamburgerButton); fireEvent.click(hamburgerButton);
const updatedDropdownMenus: HTMLElement[] = screen.getAllByRole('list'); const updatedDropdownMenus: HTMLElement[] = screen.getAllByRole('list');
expect(updatedDropdownMenus.length).toBe(1); expect(updatedDropdownMenus.length).toBe(1);
}); });
it('has correct height on tablet screens', () => { it('Test has correct height on tablet screens', () => {
mockMatchMedia({ matches: true }); mockMatchMedia({ matches: true });
global.innerWidth = 768; global.innerWidth = 768;
global.dispatchEvent(new Event('resize')); global.dispatchEvent(new Event('resize'));
const { container }: RenderResult = renderWithProvider();
const { container }: RenderResult = render(
<BrowserRouter>
<Navbar />
</BrowserRouter>
);
const header: HTMLElement | null = container.querySelector('header'); const header: HTMLElement | null = container.querySelector('header');
expect(header).not.toBeNull(); expect(header).not.toBeNull();
if (header) { if (header) {
@@ -143,18 +115,11 @@ describe('Navbar', () => {
} }
}); });
it('has max width constraint on large screens', () => { it('Test has max width constraint on large screens', () => {
mockMatchMedia({ matches: true }); mockMatchMedia({ matches: true });
global.innerWidth = 3840; global.innerWidth = 3840;
global.dispatchEvent(new Event('resize')); global.dispatchEvent(new Event('resize'));
const { container }: RenderResult = renderWithProvider();
const { container }: RenderResult = render(
<BrowserRouter>
<Navbar />
</BrowserRouter>
);
const header: HTMLElement | null = container.querySelector('header'); const header: HTMLElement | null = container.querySelector('header');
expect(header).not.toBeNull(); expect(header).not.toBeNull();
if (header) { if (header) {
@@ -163,13 +128,8 @@ describe('Navbar', () => {
} }
}); });
it('has correct ARIA role for nav', () => { it('Test has correct ARIA role for nav', () => {
const { container }: RenderResult = render( const { container }: RenderResult = renderWithProvider();
<BrowserRouter>
<Navbar />
</BrowserRouter>
);
const header: HTMLElement | null = container.querySelector('header'); const header: HTMLElement | null = container.querySelector('header');
expect(header).toHaveAttribute('role', 'nav'); expect(header).toHaveAttribute('role', 'nav');
}); });
+3
View File
@@ -5,11 +5,14 @@
"scripts": { "scripts": {
"gacha:dev": "nx serve gacha", "gacha:dev": "nx serve gacha",
"gacha:build": "nx build gacha", "gacha:build": "nx build gacha",
"gacha:test": "nx test gacha",
"gacha:prod": "serve ./dist/apps/gacha", "gacha:prod": "serve ./dist/apps/gacha",
"backoffice:dev": "nx serve backoffice", "backoffice:dev": "nx serve backoffice",
"backoffice:build": "nx build backoffice", "backoffice:build": "nx build backoffice",
"backoffice:test": "nx test backoffice",
"backoffice:prod": "serve ./dist/apps/backoffice", "backoffice:prod": "serve ./dist/apps/backoffice",
"dimentorin:dev": "nx serve dimentorin", "dimentorin:dev": "nx serve dimentorin",
"dimentorin:test": "nx test dimentorin",
"dimentorin:build": "nx build dimentorin", "dimentorin:build": "nx build dimentorin",
"dimentorin:prod": "serve ./dist/apps/dimentorin", "dimentorin:prod": "serve ./dist/apps/dimentorin",
"landing:dev": "nx serve landing", "landing:dev": "nx serve landing",