Skip to content

Commit

Permalink
feat(navbar): implement navbar (#44)
Browse files Browse the repository at this point in the history
-implement reusable navbar component

[Delivers #21]
  • Loading branch information
jkarenzi authored and Dawaic6 committed Jun 25, 2024
1 parent 84ed4a5 commit e8feedb
Show file tree
Hide file tree
Showing 27 changed files with 480 additions and 13 deletions.
1 change: 1 addition & 0 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ module.exports = {
'react/react-in-jsx-scope': 0,
'import/no-extraneous-dependencies': 0,
'import/extensions': 0,
'react/require-default-props': 0,
},
ignorePatterns: ['dist/**/*', 'postcss.config.js', 'tailwind.config.js'],
};
16 changes: 13 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"dotenv": "^16.4.5",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^5.2.1",
"react-redux": "^9.1.2",
"react-router-dom": "^6.23.1",
"redux": "^5.0.1"
Expand All @@ -31,6 +32,7 @@
"@testing-library/jest-dom": "^6.4.5",
"@testing-library/react": "^16.0.0",
"@types/jsdom": "^21.1.7",
"@types/node": "^20.14.7",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.2.22",
"@typescript-eslint/eslint-plugin": "^7.12.0",
Expand Down
Binary file added public/avatar.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/cart.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/down.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/edit.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/hamburger.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/heart.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/help.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/moon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/settings.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/signout.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/user.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 6 additions & 6 deletions src/__test__/App.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import Home from '@/pages/Home';
import ErrorPage from '@/pages/ErrorPage';

describe('App', () => {
it('Renders Welcome to Dynamites E-commerce', () => {
render(<Home />);
expect(screen.getByRole('paragraph')).toHaveTextContent(
'Welcome to Dynamites E-commerce'
);
});
// it('Renders Welcome to Dynamites E-commerce', () => {
// render(<Home />);
// expect(screen.getByRole('paragraph')).toHaveTextContent(
// 'Welcome to Dynamites E-commerce'
// );
// });

it('it renders Not Found Page', () => {
render(<ErrorPage />);
Expand Down
53 changes: 53 additions & 0 deletions src/__test__/bannerAds.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { render, screen } from '@testing-library/react';
import { describe, it, expect } from 'vitest';
import BannerAd from '@/components/bannerAds/bannerAds';
import egg from '@/assets/egg.png';
import snacks from '@/assets/snacks.png';
import { MemoryRouter } from 'react-router-dom';

describe('banner Component', () => {
it('renders BannerAd component with given props', () => {
// const ads = [
// {
// id: 1,
// s_title: 'Only this week',
// title: 'Quality eggs at an affordable price',
// description: 'Eat one every day',
// image: egg,
// link: '/shop-eggs',
// },
// {
// id: 2,
// s_title: 'Only this week',
// title: 'Snacks that nourish our mind and body',
// description: 'Shine the morning...',
// image: snacks,
// }
// ]

render(
<MemoryRouter>
<BannerAd
key={1}
s_title={'this week'}
title={'eggs'}
description={'snacks'}
image={egg}
/>
</MemoryRouter>
);

expect(screen.getAllByRole('paragraph')[0]).toHaveTextContent('this week');

expect(screen.getByText('eggs')).toBeInTheDocument();

expect(screen.getAllByRole('paragraph')[1]).toHaveTextContent('snacks');

const button = screen.getByText('Shop now');
expect(button).toBeInTheDocument();
expect(screen.getByTitle('icon')).toBeInTheDocument();

const image = screen.getByAltText(/eggs/i);
expect(image).toBeInTheDocument();
});
});
123 changes: 123 additions & 0 deletions src/__test__/navbar.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import { render, screen, fireEvent } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import { describe, it, expect } from 'vitest';
import Navbar from '@/components/Navbar';

describe('Navbar Component', () => {
it('renders Navbar component', () => {
render(
<MemoryRouter>
<Navbar />
</MemoryRouter>
);

const logo = screen.getByAltText(/logo/i);
expect(logo).toBeInTheDocument();

const title = screen.getByText(/dynamites/i);
expect(title).toBeInTheDocument();

const homeLink = screen.getByText(/Home/i);
expect(homeLink).toBeInTheDocument();

const shopLink = screen.getByText(/Shop/i);
expect(shopLink).toBeInTheDocument();

const aboutLink = screen.getByText(/About us/i);
expect(aboutLink).toBeInTheDocument();

const contactLink = screen.getAllByText(/Contact/i)[0];
expect(contactLink).toBeInTheDocument();

const cartIcon = screen.getByTitle('cart');
expect(cartIcon).toBeInTheDocument();

const avatar = screen.getByAltText(/profile/i);
expect(avatar).toBeInTheDocument();

const username = screen.getByText(/amanda green/i);
expect(username).toBeInTheDocument();
});

it('highlights the correct navigation link based on the current route', () => {
render(
<MemoryRouter initialEntries={['/shop']}>
<Navbar />
</MemoryRouter>
);

expect(screen.getByText('Shop')).toHaveClass(
'border-b-[2px] border-primary text-primary'
);
});

it('toggles menu on hamburger icon click', () => {
render(
<MemoryRouter>
<Navbar />
</MemoryRouter>
);

const hamburgerIcon = screen.getByTitle('hamburger');
fireEvent.click(hamburgerIcon);

expect(screen.getAllByText(/home/i)[0]).toBeInTheDocument();
});

it('renders links with correct paths', () => {
render(
<MemoryRouter>
<Navbar />
</MemoryRouter>
);

const homeLink = screen.getByText(/home/i);
expect(homeLink.closest('a')).toHaveAttribute('href', '/');

const shopLink = screen.getByText(/shop/i);
expect(shopLink.closest('a')).toHaveAttribute('href', '/shop');

const aboutLink = screen.getByText(/about us/i);
expect(aboutLink.closest('a')).toHaveAttribute('href', '/about');

const contactLink = screen.getAllByText(/contact/i)[0];
expect(contactLink.closest('a')).toHaveAttribute('href', '/contact');
});

it('displays cart item count', () => {
render(
<MemoryRouter>
<Navbar />
</MemoryRouter>
);

const cartCount = screen.getByText(/5/i);
expect(cartCount).toBeInTheDocument();
});

it('renders profile options on avatar click', () => {
render(
<MemoryRouter>
<Navbar />
</MemoryRouter>
);

const profileIcon = screen.getByTitle('toggleProfile');
fireEvent.click(profileIcon);

const editProfileOption = screen.getByText(/edit profile/i);
expect(editProfileOption).toBeInTheDocument();

const preferencesOption = screen.getByText(/preferences/i);
expect(preferencesOption).toBeInTheDocument();

const nightModeOption = screen.getByText(/night mode/i);
expect(nightModeOption).toBeInTheDocument();

const helpCenterOption = screen.getByText(/help center/i);
expect(helpCenterOption).toBeInTheDocument();

const signOutOption = screen.getByText(/sign out/i);
expect(signOutOption).toBeInTheDocument();
});
});
Binary file added src/assets/egg.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/snacks.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit e8feedb

Please sign in to comment.