Skip to content

Commit f4408f0

Browse files
Add tests for LeadersListBlock
1 parent 9146e2c commit f4408f0

File tree

5 files changed

+123
-0
lines changed

5 files changed

+123
-0
lines changed

frontend/__tests__/e2e/pages/ChapterDetails.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,8 @@ test.describe('Chapter Details Page', () => {
5555
await page.getByRole('button', { name: 'Show less' }).click()
5656
await expect(page.getByRole('button', { name: 'Show more' })).toBeVisible()
5757
})
58+
59+
test('should have a leaders list block', async ({ page }) => {
60+
await expect(page.getByRole('heading', { name: 'Leaders' })).toBeVisible()
61+
})
5862
})

frontend/__tests__/e2e/pages/ProjectDetails.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,8 @@ test.describe('Project Details Page', () => {
123123
await expect(page.getByText('Forks Trend')).toBeVisible()
124124
await expect(page.getByText('Days Since Last Commit and Release')).toBeVisible()
125125
})
126+
127+
test('should have a leaders list block', async ({ page }) => {
128+
await expect(page.getByRole('heading', { name: 'Leaders' })).toBeVisible()
129+
})
126130
})
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import { MockedProvider } from '@apollo/client/testing'
2+
import { render, screen, fireEvent } from '@testing-library/react'
3+
import { useRouter } from 'next/navigation'
4+
import { GET_LEADER_DATA } from 'server/queries/userQueries'
5+
import LeadersListBlock from 'components/LeadersListBlock'
6+
7+
jest.mock('next/navigation', () => ({
8+
useRouter: jest.fn(),
9+
}))
10+
11+
const mockLeaders = {
12+
leader1: 'Role 1',
13+
leader2: 'Role 2',
14+
}
15+
16+
const mocks = [
17+
{
18+
request: {
19+
query: GET_LEADER_DATA,
20+
variables: { key: 'leader1' },
21+
},
22+
result: {
23+
data: {
24+
user: {
25+
login: 'leader1',
26+
avatarUrl: 'https://avatars.githubusercontent.com/u/1',
27+
company: 'Company 1',
28+
location: 'Location 1',
29+
name: 'Leader One',
30+
},
31+
},
32+
},
33+
},
34+
{
35+
request: {
36+
query: GET_LEADER_DATA,
37+
variables: { key: 'leader2' },
38+
},
39+
result: {
40+
data: {
41+
user: {
42+
login: 'leader2',
43+
avatarUrl: 'https://avatars.githubusercontent.com/u/2',
44+
company: 'Company 2',
45+
location: 'Location 2',
46+
name: 'Leader Two',
47+
},
48+
},
49+
},
50+
},
51+
]
52+
53+
describe('LeadersListBlock', () => {
54+
const push = jest.fn()
55+
beforeEach(() => {
56+
;(useRouter as jest.Mock).mockReturnValue({ push })
57+
})
58+
59+
test('renders loading state initially', () => {
60+
render(
61+
<MockedProvider mocks={mocks} addTypename={false}>
62+
<LeadersListBlock leaders={mockLeaders} />
63+
</MockedProvider>
64+
)
65+
66+
expect(screen.getByText('Loading leader1...')).toBeInTheDocument()
67+
expect(screen.getByText('Loading leader2...')).toBeInTheDocument()
68+
})
69+
70+
test('renders user cards on successful data fetch', async () => {
71+
render(
72+
<MockedProvider mocks={mocks} addTypename={false}>
73+
<LeadersListBlock leaders={mockLeaders} />
74+
</MockedProvider>
75+
)
76+
77+
expect(await screen.findByText('Leader One')).toBeInTheDocument()
78+
expect(await screen.findByText('Leader Two')).toBeInTheDocument()
79+
})
80+
81+
test('navigates to the correct user profile on button click', async () => {
82+
render(
83+
<MockedProvider mocks={mocks} addTypename={false}>
84+
<LeadersListBlock leaders={mockLeaders} />
85+
</MockedProvider>
86+
)
87+
88+
const viewProfileButton = await screen.findAllByText('View Profile')
89+
fireEvent.click(viewProfileButton[0])
90+
91+
expect(push).toHaveBeenCalledWith('/members/leader1')
92+
})
93+
94+
test('renders an error message if the query fails', async () => {
95+
const errorMocks = [
96+
{
97+
request: {
98+
query: GET_LEADER_DATA,
99+
variables: { key: 'leader1' },
100+
},
101+
error: new Error('An error occurred'),
102+
},
103+
]
104+
105+
render(
106+
<MockedProvider mocks={errorMocks} addTypename={false}>
107+
<LeadersListBlock leaders={{ leader1: 'Role 1' }} />
108+
</MockedProvider>
109+
)
110+
111+
expect(await screen.findByText("Error loading leader1's data")).toBeInTheDocument()
112+
})
113+
})

frontend/__tests__/unit/data/mockChapterDetailsData.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export const mockChapterDetailsData = {
2121
},
2222
establishedYear: 2020,
2323
key: 'test-chapter',
24+
leadersLogins: ['leader1', 'leader2'],
2425
},
2526
topContributors: Array.from({ length: 15 }, (_, i) => ({
2627
avatarUrl: `https://avatars.githubusercontent.com/avatar${i + 1}.jpg`,

frontend/__tests__/unit/data/mockProjectDetailsData.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const mockProjectDetailsData = {
2020
key: 'example-project',
2121
languages: ['Python', 'GraphQL', 'JavaScript'],
2222
leaders: ['alice', 'bob'],
23+
leadersLogins: ['alice', 'bob'],
2324
level: 'Lab',
2425
name: 'Test Project',
2526
recentIssues: [

0 commit comments

Comments
 (0)