-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
updated unit tests from #477 PR #538
Changes from 24 commits
49f2d25
2e3d089
b49472b
826699b
8f0eae3
abfca63
ab549dc
1835a0d
e7c2582
513ae38
72c3d6d
a17add0
21ec1f9
aa9a0d3
2813481
5e714ea
4691022
ad0830c
8bbbf98
b3063aa
5cfa162
a6a1e4b
904fdee
b625d56
c588465
784998c
630f584
aa84260
dd36ddb
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,124 +1,277 @@ | ||
import { render, screen, waitFor, fireEvent } from '@testing-library/react'; | ||
import { | ||
render, | ||
screen, | ||
waitFor, | ||
waitForElementToBeRemoved, | ||
fireEvent, | ||
} from '@testing-library/react'; | ||
import Leagues from './page'; | ||
import { useDataStore } from '@/store/dataStore'; | ||
import { getUserLeagues } from '@/utils/utils'; | ||
import { | ||
getGameWeek, | ||
getAllLeagues, | ||
getUserDocumentId, | ||
} from '@/api/apiFunctions'; | ||
import { AuthContext } from '@/context/AuthContextProvider'; | ||
import { getAllLeagues, addUserToLeague } from '@/api/apiFunctions'; | ||
import { toast } from 'react-hot-toast'; | ||
import Alert from '@/components/AlertNotification/AlertNotification'; | ||
import { AlertVariants } from '@/components/AlertNotification/Alerts.enum'; | ||
|
||
jest.mock('@/store/dataStore', () => ({ | ||
useDataStore: jest.fn(() => ({ user: { id: '123', leagues: [] } })), | ||
})); | ||
const mockUseAuthContext = { | ||
isSignedIn: false, | ||
}; | ||
|
||
jest.mock('@/utils/utils', () => ({ | ||
getUserLeagues: jest.fn(() => Promise.resolve([])), | ||
jest.mock('@/context/AuthContextProvider', () => ({ | ||
useAuthContext() { | ||
return { | ||
...mockUseAuthContext, | ||
}; | ||
}, | ||
})); | ||
|
||
jest.mock('@/api/apiFunctions', () => ({ | ||
getGameWeek: jest.fn(() => | ||
Promise.resolve({ | ||
week: 1, | ||
}), | ||
), | ||
getAllLeagues: jest.fn(() => | ||
Promise.resolve([ | ||
jest.mock('@/store/dataStore', () => ({ | ||
useDataStore: jest.fn(() => ({ | ||
user: { | ||
documentId: '123', | ||
id: '1234', | ||
email: '[email protected]', | ||
leagues: ['league1'], | ||
}, | ||
allLeagues: [ | ||
{ | ||
leagueId: '123', | ||
leagueName: 'Test League', | ||
logo: 'https://example.com/logo.png', | ||
participants: ['123456', '78', '9'], | ||
logo: 'logo.png', | ||
participants: ['123456', '78'], | ||
survivors: ['123456', '78'], | ||
}, | ||
]), | ||
), | ||
], | ||
updateUser: jest.fn(), | ||
})), | ||
})); | ||
|
||
jest.mock('@/context/AuthContextProvider', () => ({ | ||
useAuthContext: jest.fn(() => ({ user: { id: '123' } })), | ||
jest.mock('@/utils/utils', () => ({ | ||
getUserLeagues: jest.fn(() => Promise.resolve([])), | ||
cn: jest.fn(), | ||
})); | ||
|
||
jest.mock('@/api/apiFunctions', () => ({ | ||
getAllLeagues: jest.fn(), | ||
addUserToLeague: jest.fn(), | ||
})); | ||
|
||
jest.mock('react-hot-toast', () => ({ | ||
toast: { | ||
custom: jest.fn(), | ||
}, | ||
})); | ||
|
||
describe('Leagues Component', () => { | ||
const mockUseDataStore = useDataStore as unknown as jest.Mock; | ||
const mockGetUserLeagues = getUserLeagues as jest.Mock; | ||
const mockGetGameWeek = getGameWeek as jest.Mock; | ||
const mockGetAllLeagues = getAllLeagues as jest.Mock; | ||
const mockAddUserToLeague = addUserToLeague as jest.Mock; | ||
|
||
beforeEach(() => { | ||
jest.clearAllMocks(); | ||
}); | ||
|
||
xtest('should render "You are not enrolled in any leagues" message when no leagues are found', async () => { | ||
mockUseDataStore.mockReturnValueOnce({ user: { id: '123', leagues: [] } }); | ||
mockGetUserLeagues.mockResolvedValueOnce([]); | ||
mockGetGameWeek.mockResolvedValueOnce({ week: 1 }); | ||
test('should render "You are not enrolled in any leagues" message when no leagues are found', async () => { | ||
mockUseAuthContext.isSignedIn = true; | ||
mockUseDataStore.mockReturnValue({ | ||
user: { | ||
documentId: '123', | ||
email: '[email protected]', | ||
id: '123', | ||
leagues: [], | ||
}, | ||
allLeagues: [], | ||
}); | ||
|
||
render(<Leagues />); | ||
|
||
await waitForElementToBeRemoved(() => screen.getByTestId('global-spinner')); | ||
|
||
await waitFor(() => { | ||
expect( | ||
screen.getByText('You are not enrolled in any leagues'), | ||
).toBeInTheDocument(); | ||
const messageElement = screen.getByTestId('no-leagues-message'); | ||
expect(messageElement).toBeInTheDocument(); | ||
}); | ||
}); | ||
|
||
xtest('should display GlobalSpinner while loading data', async () => { | ||
mockUseDataStore.mockReturnValueOnce({ user: { id: '123', leagues: [] } }); | ||
mockGetUserLeagues.mockResolvedValueOnce([]); | ||
mockGetGameWeek.mockResolvedValueOnce({ week: 1 }); | ||
render(<Leagues />); | ||
test('should display GlobalSpinner while loading data', async () => { | ||
mockUseAuthContext.isSignedIn = true; | ||
|
||
await waitFor(() => { | ||
expect(screen.getByTestId('global-spinner')).toBeInTheDocument(); | ||
mockUseDataStore.mockReturnValueOnce({ | ||
user: { | ||
documentId: '123', | ||
email: '[email protected]', | ||
id: '123', | ||
leagues: [], | ||
}, | ||
allLeagues: [], | ||
}); | ||
}); | ||
xtest('should not display GlobalSpinner after loading data', async () => { | ||
mockUseDataStore.mockReturnValueOnce({ user: { id: '123', leagues: [] } }); | ||
mockGetUserLeagues.mockResolvedValueOnce([]); | ||
mockGetGameWeek.mockResolvedValueOnce({ week: 1 }); | ||
|
||
render(<Leagues />); | ||
|
||
expect(screen.getByTestId('global-spinner')).toBeInTheDocument(); | ||
|
||
await waitFor(() => { | ||
expect(screen.queryByTestId('global-spinner')).not.toBeInTheDocument(); | ||
}); | ||
}); | ||
|
||
xtest('should handle form submission to join a league', async () => { | ||
mockUseDataStore.mockReturnValueOnce({ | ||
user: { id: '123', leagues: [] }, | ||
test('should not display GlobalSpinner after loading data', async () => { | ||
mockUseAuthContext.isSignedIn = true; | ||
|
||
mockUseDataStore.mockReturnValue({ | ||
user: { | ||
documentId: '123', | ||
email: '[email protected]', | ||
id: '123', | ||
leagues: [], | ||
}, | ||
allLeagues: [ | ||
{ | ||
leagueId: '123', | ||
leagueName: 'Test League', | ||
logo: 'https://findmylogo.com/logo.png', | ||
logo: 'logo.png', | ||
participants: ['123456', '78'], | ||
survivors: ['123456', '78', '9'], | ||
survivors: ['123456', '78'], | ||
}, | ||
], | ||
}); | ||
|
||
mockGetUserLeagues.mockResolvedValueOnce([]); | ||
mockGetGameWeek.mockResolvedValueOnce({ week: 1 }); | ||
|
||
render(<Leagues />); | ||
|
||
await waitForElementToBeRemoved(() => screen.getByTestId('global-spinner')); | ||
|
||
expect(screen.queryByTestId('global-spinner')).not.toBeInTheDocument(); | ||
}); | ||
|
||
test('should handle form submission to join a league', async () => { | ||
mockUseAuthContext.isSignedIn = true; | ||
|
||
const user = { | ||
documentId: '123', | ||
email: '[email protected]', | ||
id: '123', | ||
leagues: [], | ||
}; | ||
|
||
const league = { | ||
leagueId: '123', | ||
leagueName: 'Test League', | ||
logo: 'logo.png', | ||
participants: [], | ||
survivors: [], | ||
}; | ||
|
||
const updateUser = jest.fn(); | ||
|
||
mockUseDataStore.mockReturnValue({ | ||
user, | ||
allLeagues: [league], | ||
updateUser, | ||
}); | ||
|
||
mockGetAllLeagues.mockResolvedValueOnce([league]); | ||
mockAddUserToLeague.mockResolvedValue( | ||
Promise.resolve({ | ||
userDocumentId: user.documentId, | ||
selectedLeague: league.leagueId, | ||
selectedLeagues: [league.leagueId], | ||
participants: [user.id], | ||
survivors: [user.id], | ||
}), | ||
); | ||
|
||
render(<Leagues />); | ||
|
||
await waitFor(() => { | ||
expect(screen.queryByTestId('global-spinner')).not.toBeInTheDocument(); | ||
}); | ||
|
||
const selectElement = screen.getByLabelText(/Select league to join/i); | ||
expect(selectElement).toBeInTheDocument(); | ||
const selectElement = screen.getByTestId('select-available-leagues'); | ||
fireEvent.change(selectElement, { target: { value: '123' } }); | ||
fireEvent.click(screen.getByTestId('join-league-button')); | ||
|
||
await waitFor(() => { | ||
expect(mockAddUserToLeague).toHaveBeenCalledWith({ | ||
userDocumentId: user.documentId, | ||
selectedLeague: league.leagueId, | ||
selectedLeagues: [league.leagueId], | ||
participants: [user.id], | ||
survivors: [user.id], | ||
}); | ||
expect(updateUser).toHaveBeenCalledWith( | ||
user.documentId, | ||
user.id, | ||
user.email, | ||
[...user.leagues, league.leagueId], | ||
); | ||
expect(toast.custom).toHaveBeenCalledWith( | ||
<Alert | ||
variant={AlertVariants.Success} | ||
message={`Added ${league.leagueName} to your leagues!`} | ||
/>, | ||
); | ||
}); | ||
}); | ||
|
||
test('should show error if adding to league fails', async () => { | ||
mockUseAuthContext.isSignedIn = true; | ||
|
||
const user = { | ||
documentId: '123', | ||
email: '[email protected]', | ||
id: '123', | ||
leagues: [], | ||
}; | ||
|
||
const league = { | ||
leagueId: '123', | ||
leagueName: 'Test League', | ||
logo: 'logo.png', | ||
participants: [], | ||
survivors: [], | ||
}; | ||
|
||
mockUseDataStore.mockReturnValue({ | ||
user, | ||
allLeagues: [league], | ||
}); | ||
|
||
mockGetUserLeagues.mockResolvedValueOnce([]); | ||
mockGetAllLeagues.mockResolvedValueOnce([league]); | ||
mockAddUserToLeague.mockResolvedValue( | ||
Promise.resolve({ | ||
userDocumentId: user.documentId, | ||
selectedLeague: league.leagueId, | ||
selectedLeagues: [league.leagueId], | ||
participants: [user.id], | ||
survivors: [user.id], | ||
}), | ||
); | ||
|
||
render(<Leagues />); | ||
|
||
await waitFor(() => { | ||
expect(screen.queryByTestId('global-spinner')).not.toBeInTheDocument(); | ||
}); | ||
|
||
const selectElement = screen.getByTestId('select-available-leagues'); | ||
fireEvent.change(selectElement, { target: { value: '123' } }); | ||
fireEvent.click(screen.getByText(/Join League/i)); | ||
fireEvent.click(screen.getByTestId('join-league-button')); | ||
|
||
await waitFor(() => { | ||
expect( | ||
screen.getByText('Added Test League to your leagues!'), | ||
).toBeInTheDocument(); | ||
expect(mockAddUserToLeague).toHaveBeenCalledWith({ | ||
userDocumentId: user.documentId, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. same comment:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The reason why I set up this code like this is to match the code in league/page.tsx file. What are your thoughts on the different formats? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @vmaineng it's not about different formats. It's about what they are doing. In page.tsx, the code handles adding a new participant/survivor as follows:
The test is verifying that the function is called with the correct data you're passing into it. By having it the same way as page.tsx you are duplicating code. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated :) |
||
selectedLeague: league.leagueId, | ||
selectedLeagues: [league.leagueId], | ||
participants: [user.id], | ||
survivors: [user.id], | ||
}); | ||
|
||
expect(toast.custom).toHaveBeenCalledWith( | ||
<Alert | ||
variant={AlertVariants.Error} | ||
message="Failed to add the league. Please try again." | ||
/>, | ||
); | ||
}); | ||
}); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Chang all
test
toit
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated to
it