Skip to content

Commit

Permalink
[#19] Add some tests to Sidebar component and auth logout
Browse files Browse the repository at this point in the history
  • Loading branch information
liamstevens111 committed Mar 20, 2023
1 parent 0e35d2c commit a16da9a
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 2 deletions.
18 changes: 18 additions & 0 deletions src/adapters/authAdapter.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,22 @@ describe('AuthAdapter', () => {
expect(scope.isDone()).toBe(true);
});
});

describe('logout', () => {
test('The logout endpoint is called', async () => {
const token = 'access_token';

const scope = nock(`${process.env.REACT_APP_API_ENDPOINT}`)
.defaultReplyHeaders({
'access-control-allow-origin': '*',
'access-control-allow-credentials': 'true',
})
.post('/oauth/revoke')
.reply(200);

expect(scope.isDone()).toBe(false);
expect(await AuthAdapter.logout(token));
expect(scope.isDone()).toBe(true);
});
});
});
52 changes: 52 additions & 0 deletions src/components/Sidebar/index.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/* eslint-disable camelcase */
import { BrowserRouter } from 'react-router-dom';

import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';

import AuthAdapter from 'adapters/authAdapter';
import { User } from 'types/User';

import Sidebar from '.';
import { setItem } from '../../helpers/localStorage';

const mockTokenData = {
access_token: 'test_access_token',
refresh_token: 'test_refresh_token',
token_type: 'Bearer',
expires_in: 7200,
created_at: 1677045997,
};

const mockUserProfileData = {
email: '[email protected]',
name: 'TestName',
avatar_url: 'https://secure.gravatar.com/avatar/6733d09432e89459dba795de8312ac2d',
};

describe('Sidebar', () => {
const user: User = { name: 'Test User', email: '[email protected]', avatarUrl: 'an-avatar-url' };

test("renders a sidebar on the page with the user's name, profile image", () => {
render(<Sidebar user={user} />, { wrapper: BrowserRouter });

expect(screen.getByTestId('username')).toHaveTextContent(user.name);

const profileImage = screen.getByAltText('profile') as HTMLImageElement;
expect(profileImage.src).toContain('an-avatar-url');
});

test('renders a sidebar on the page with a logout button that when clicked, calls Logout adapter', async () => {
setItem('UserProfile', { auth: mockTokenData, user: mockUserProfileData });

const mockLogout = jest.spyOn(AuthAdapter, 'logout');

render(<Sidebar user={user} />, { wrapper: BrowserRouter });

const submitButton = screen.getByRole('button', { name: 'Logout' });

await userEvent.click(submitButton);

expect(mockLogout).toHaveBeenCalled();
});
});
13 changes: 11 additions & 2 deletions src/components/Sidebar/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,17 @@ function Sidebar({ user }: SidebarProps) {
return (
<aside className={`${styles.sidebar} fixed top-0 right-0 flex h-screen w-1/6 min-w-fit flex-col gap-10 p-0`}>
<div className="flex h-16 flex-col items-center justify-between px-5 md:flex-row md:border-b md:border-b-white">
<span className="pt-2 font-bold text-white">{user.name}</span>
<img className="cursor-pointer rounded-full" height={36} width={36} src={user.avatarUrl} alt="profile"></img>
<span data-test-id="username" className="pt-2 font-bold text-white">
{user.name}
</span>
<img
data-test-id="avatar"
className="cursor-pointer rounded-full"
height={36}
width={36}
src={user.avatarUrl}
alt="profile"
></img>
</div>
<button onClick={performLogout} className="relative left-5 self-start text-xl text-white opacity-50">
Logout
Expand Down

0 comments on commit a16da9a

Please sign in to comment.