From 78484ccea4dcad5304068dd820eaf25114b79f84 Mon Sep 17 00:00:00 2001 From: Amirhossein Alibakhshi Date: Tue, 11 Feb 2025 11:27:35 +0330 Subject: [PATCH] test(web-components): add `avatar` tests --- .../web-components/src/avatar/avatar.test.tsx | 133 ++++++++++++++++-- packages/web-components/src/avatar/avatar.ts | 3 + 2 files changed, 123 insertions(+), 13 deletions(-) diff --git a/packages/web-components/src/avatar/avatar.test.tsx b/packages/web-components/src/avatar/avatar.test.tsx index 6902441d..24b3b1f3 100644 --- a/packages/web-components/src/avatar/avatar.test.tsx +++ b/packages/web-components/src/avatar/avatar.test.tsx @@ -1,23 +1,130 @@ -import { render, screen, userEvent } from "@internals/test-helpers"; -import { describe, expect, it, jest } from "@jest/globals"; +import { fireEvent, render, screen } from "@internals/test-helpers"; +import { describe, expect, it } from "@jest/globals"; +import { createComponent } from "@lit/react"; +import React from "react"; +import { + itShouldMount, + itSupportsClassName, + itSupportsDataSetProps, + itSupportsStyle, +} from "../internals/tests.tsx"; +import { TapsiAvatar } from "./index.ts"; -import "./index.ts"; +const Avatar = createComponent({ + react: React, + elementClass: TapsiAvatar, + tagName: "tapsi-avatar", +}); + +const mockRequiredProps = { + "data-testid": "test-avatar", +}; + +const getTestAvatarRoot = async () => screen.findByShadowTestId("avatar-root"); + +const getTestAvatarImage = async () => + screen.findByShadowTestId("avatar-image"); + +const getTestAvatarPlaceholder = async () => + screen.findByShadowTestId("avatar-placeholder"); + +describe("🧪 avatar: UI", () => { + itShouldMount(Avatar, mockRequiredProps); + itSupportsClassName(Avatar, mockRequiredProps); + itSupportsStyle(Avatar, mockRequiredProps); + itSupportsDataSetProps(Avatar, mockRequiredProps); + + it("should render placeholder if no image was set", async () => { + render(); + + const placeholder = await getTestAvatarPlaceholder(); + + expect(placeholder).toBeInTheDocument(); + }); + + it("should render image if `image` property was set", async () => { + render( + , + ); + + expect(await screen.findByShadowTestId("avatar-image")).toBeInTheDocument(); + }); + + it("should render placeholder if image has error", async () => { + render( + , + ); -describe("tapsi-avatar", () => { - it("renders", async () => { - // @ts-expect-error Current React does not support custom elements. - render(); + const image = await getTestAvatarImage(); - const el = screen.getByTestId("test"); + fireEvent.error(image); - const handleClick = jest.fn(); + const placeholder = await getTestAvatarPlaceholder(); - el.addEventListener("click", handleClick); + expect(placeholder).toBeInTheDocument(); + }); + + it("should apply `loading` attribute correctly", async () => { + render( + , + ); + + const image = await getTestAvatarImage(); + + expect(image).toHaveAttribute("loading", "lazy"); + }); + + it("should apply the correct size class", async () => { + render( + , + ); + + const avatarRoot = await getTestAvatarRoot(); + + expect(avatarRoot).toHaveClass("lg"); + }); + + it("should apply `alt` attribute to the `img` tag correctly", async () => { + render( + , + ); + + const image = await getTestAvatarImage(); + + expect(image).toHaveAttribute("alt", "Test Alt"); + }); - await userEvent.click(el); + it("should apply `label` property as `aria-label`", async () => { + render( + , + ); - expect(handleClick).toHaveBeenCalled(); + const avatarRoot = await getTestAvatarRoot(); - expect(await screen.findByShadowRole("img")).toBeInTheDocument(); + expect(avatarRoot).toHaveAttribute("aria-label", "Avatar Label"); }); }); diff --git a/packages/web-components/src/avatar/avatar.ts b/packages/web-components/src/avatar/avatar.ts index 462a2032..681ea466 100644 --- a/packages/web-components/src/avatar/avatar.ts +++ b/packages/web-components/src/avatar/avatar.ts @@ -46,6 +46,7 @@ export class Avatar extends LitElement { return html`