-
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
Merged
Merged
Changes from all commits
Commits
Show all changes
29 commits
Select commit
Hold shift + click to select a range
49f2d25
updated league tests
vmaineng 2e3d089
modified a lot of tests to be formatted similar to league entry
vmaineng b49472b
updated utils
vmaineng 826699b
updated mockApiFunctions
vmaineng 8f0eae3
updated apiFunctions file
vmaineng abfca63
added in tests updates
vmaineng ab549dc
updated tests
vmaineng 1835a0d
added in spinner to not be in document
vmaineng e7c2582
added in form submission
vmaineng 513ae38
added in changes to test
vmaineng 72c3d6d
Merge branch 'develop' into mai/477-add-tests
vmaineng a17add0
added in changes from develop
vmaineng 21ec1f9
pulled in changes for apifunctions.test
vmaineng aa9a0d3
updated tests
vmaineng 2813481
added in updates per chris comment
vmaineng 5e714ea
added in test that passed
vmaineng 4691022
added in changes for submission
vmaineng ad0830c
added in tests for league page
vmaineng 8bbbf98
Merge branch 'develop' into mai/477-add-tests
vmaineng b3063aa
Merge branch 'develop' of github.com:LetsGetTechnical/gridiron-surviv…
vmaineng 5cfa162
added in specific unit tests
vmaineng a6a1e4b
Merge branch 'develop' into mai/477-add-tests
vmaineng 904fdee
added in updates to test the results
vmaineng b625d56
modified the rest of the formats
vmaineng c588465
Merge branch 'develop' into mai/477-add-tests
vmaineng 784998c
updated test to it and reverted utils file
vmaineng 630f584
added in packages
vmaineng aa84260
added a space
vmaineng dd36ddb
reverted utils
vmaineng File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }); | ||
it('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 />); | ||
it('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: [] }, | ||
it('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(); | ||
}); | ||
|
||
it('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!`} | ||
/>, | ||
); | ||
}); | ||
}); | ||
|
||
it('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, | ||
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." | ||
/>, | ||
); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
same comment:
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.
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 comment
The 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 comment
The reason will be displayed to describe this comment to others. Learn more.
Updated :)