Skip to content

Commit 21d1ad0

Browse files
authored
Merge pull request #1276 from dacadeorg/test/user-card-component
feat: add test for the user card component
2 parents 6371128 + 5849ed1 commit 21d1ad0

File tree

3 files changed

+64
-4
lines changed

3 files changed

+64
-4
lines changed

__mocks__/fixtures/user.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ export const mockUser: User = {
1212
uid: "uuid-uuido-232-dex0232-2331",
1313
joined: "14 days ago",
1414
disabled: false,
15-
reputation: 0,
16-
username: "",
15+
reputation: 2,
16+
username: "Rouven",
1717
lastName: "",
1818
emailVerified: false,
1919
email: "",
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import UserCard from "@/components/cards/User";
2+
import { renderWithRedux } from "@__mocks__/renderWithRedux";
3+
import { mockUser } from "@__mocks__/fixtures/user";
4+
import { fireEvent, screen } from "@testing-library/react";
5+
import "@testing-library/jest-dom";
6+
7+
jest.mock("next/router", () => ({
8+
useRouter: jest.fn(() => ({
9+
locale: "en",
10+
push: mockPush,
11+
})),
12+
}));
13+
const teamMembers = [mockUser];
14+
const handleClick = jest.fn(() => {});
15+
const mockPush = jest.fn();
16+
17+
describe("User card component", () => {
18+
const timestamp = {
19+
date: new Date(),
20+
text: "",
21+
};
22+
beforeEach(() => {
23+
renderWithRedux(
24+
<UserCard user={mockUser} timestamp={timestamp} teamMembers={teamMembers} onClick={handleClick} link="/testlink">
25+
<div>test link</div>
26+
</UserCard>
27+
);
28+
});
29+
// Mock window.getSelection
30+
window.getSelection = jest.fn().mockReturnValue({
31+
type: "Caret",
32+
});
33+
it("Renders the card component", () => {
34+
expect(screen.getByTestId("userId")).toBeInTheDocument();
35+
expect(screen.getAllByTestId("avatar").length).toEqual(teamMembers.length);
36+
const linkElements = screen.getAllByRole("link");
37+
linkElements.forEach((element, index) => {
38+
if (teamMembers[index]) {
39+
const expectedHref = `/profile/${teamMembers[index].username}`;
40+
expect(element).toHaveAttribute("href", expectedHref);
41+
}
42+
});
43+
});
44+
45+
it("Renders the correct tag and currecy when teamMembers is not empty", () => {
46+
expect(screen.getByTestId("currencyId")).toBeInTheDocument();
47+
expect(screen.getByTestId("tag")).toBeInTheDocument();
48+
});
49+
50+
it("Calls onClick prop when clicked", () => {
51+
fireEvent.click(screen.getByTestId("userId"));
52+
expect(handleClick).toHaveBeenCalled();
53+
});
54+
it("Navigates to the correct link when clicked", () => {
55+
const element = screen.getByText("test link");
56+
fireEvent.click(element);
57+
expect(mockPush).toHaveBeenCalledWith("/testlink");
58+
});
59+
});

src/components/cards/User.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ interface UserProps {
3333
submission?: Submission;
3434
teamMembers?: User[];
3535
onClick?: () => void;
36+
testId?: string
3637
}
3738

3839
/**
@@ -51,7 +52,7 @@ interface UserProps {
5152
}
5253
* @returns {ReactElement}
5354
*/
54-
export default function UserCard({ boxLayout, link, bordered, expanded, user, badge = "", timestamp, children, className, teamMembers, onClick }: UserProps): ReactElement {
55+
export default function UserCard({ boxLayout, link, bordered, expanded, user, badge = "", timestamp, children, className, teamMembers, onClick, testId="userId" }: UserProps): ReactElement {
5556
const { locale, push } = useRouter();
5657
const colors = useSelector((state) => state.ui.colors);
5758

@@ -77,7 +78,7 @@ export default function UserCard({ boxLayout, link, bordered, expanded, user, ba
7778
"cursor-pointer": link,
7879
});
7980
return (
80-
<div className={userCardClassName} onClick={handleClick}>
81+
<div data-testid={testId} className={userCardClassName} onClick={handleClick}>
8182
<div className={`z-10 ${boxLayout ? "relative flex-none" : "absolute top-0 left-0"}`}>
8283
{teamMembers && teamMembers?.length ? (
8384
<div className="w-15 h-15 rounded-full bg-gray-800 overflow-hidden grid grid-cols-2 items-between">

0 commit comments

Comments
 (0)