diff --git a/__tests__/components/drops/view/part/DropPartMarkdown.test.tsx b/__tests__/components/drops/view/part/DropPartMarkdown.test.tsx index c596ca3c4e..5bf532e1b7 100644 --- a/__tests__/components/drops/view/part/DropPartMarkdown.test.tsx +++ b/__tests__/components/drops/view/part/DropPartMarkdown.test.tsx @@ -321,6 +321,11 @@ describe("DropPartMarkdown", () => { expect(fallbackLink).toHaveAttribute("target", "_blank"); expect(fallbackLink).toHaveTextContent(/Tweet unavailable/i); expect(fallbackLink).toHaveTextContent(/Open on X/i); + const tweetWrapper = fallbackLink.parentElement; + if (!tweetWrapper) { + throw new Error("Expected tweet fallback wrapper"); + } + expect(tweetWrapper).toHaveClass("tw-w-full", "lg:tw-max-w-[480px]"); }); it("renders a fallback link when the tweet embed throws", async () => { @@ -349,6 +354,11 @@ describe("DropPartMarkdown", () => { "href", "https://twitter.com/foo/status/1111111111" ); + const tweetWrapper = fallbackLink.parentElement; + if (!tweetWrapper) { + throw new Error("Expected tweet fallback wrapper"); + } + expect(tweetWrapper).toHaveClass("tw-w-full", "lg:tw-max-w-[480px]"); } finally { consoleErrorSpy.mockRestore(); } diff --git a/__tests__/components/drops/view/part/dropPartMarkdown/handlers/gif.test.tsx b/__tests__/components/drops/view/part/dropPartMarkdown/handlers/gif.test.tsx new file mode 100644 index 0000000000..0fc2198683 --- /dev/null +++ b/__tests__/components/drops/view/part/dropPartMarkdown/handlers/gif.test.tsx @@ -0,0 +1,67 @@ +import { render, screen } from "@testing-library/react"; + +import { createGifHandler } from "@/components/drops/view/part/dropPartMarkdown/handlers/gif"; +import { renderGifEmbed } from "@/components/drops/view/part/dropPartMarkdown/renderers"; + +jest.mock("@/components/drops/view/part/dropPartMarkdown/renderers", () => ({ + renderGifEmbed: jest.fn((url: string, options?: { fixedSize?: boolean }) => ( +
+ )), +})); + +const mockRenderGifEmbed = renderGifEmbed as jest.MockedFunction< + typeof renderGifEmbed +>; + +describe("createGifHandler", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("matches only Tenor GIF URLs", () => { + const handler = createGifHandler(); + + expect(handler.match("https://media.tenor.com/abc/tenor.gif")).toBe(true); + expect(handler.match("https://media.tenor.com/abc/tenor.jpg")).toBe(false); + expect(handler.match("https://media.giphy.com/media/abc/giphy.gif")).toBe( + false + ); + expect(handler.match("https://example.com/image.gif")).toBe(false); + }); + + it("renders fixed-size GIFs for chat/default variant", () => { + const handler = createGifHandler({ linkPreviewVariant: "chat" }); + const element = handler.render("https://media.tenor.com/abc/tenor.gif"); + + render(<>{element}>); + + expect(screen.getByTestId("gif-embed")).toHaveAttribute( + "data-fixed-size", + "true" + ); + expect(mockRenderGifEmbed).toHaveBeenCalledWith( + "https://media.tenor.com/abc/tenor.gif", + { fixedSize: true } + ); + }); + + it("renders non-fixed GIFs for home variant", () => { + const handler = createGifHandler({ linkPreviewVariant: "home" }); + const element = handler.render("https://media.tenor.com/abc/tenor.gif"); + + render(<>{element}>); + + expect(screen.getByTestId("gif-embed")).toHaveAttribute( + "data-fixed-size", + "false" + ); + expect(mockRenderGifEmbed).toHaveBeenCalledWith( + "https://media.tenor.com/abc/tenor.gif", + { fixedSize: false } + ); + }); +}); diff --git a/__tests__/components/drops/view/part/dropPartMarkdown/linkHandlersRegistry.test.tsx b/__tests__/components/drops/view/part/dropPartMarkdown/linkHandlersRegistry.test.tsx deleted file mode 100644 index 5aee531469..0000000000 --- a/__tests__/components/drops/view/part/dropPartMarkdown/linkHandlersRegistry.test.tsx +++ /dev/null @@ -1,541 +0,0 @@ -import type { ReactNode } from "react"; - -import { render, screen } from "@testing-library/react"; - -import { createLinkRenderer } from "@/components/drops/view/part/dropPartMarkdown/linkHandlers"; -import { ensureStableSeizeLink } from "@/helpers/SeizeLinkParser"; -import { publicEnv } from "@/config/env"; - -type EnsureStableSeizeLinkWithSetter = typeof ensureStableSeizeLink & { - __setCurrentHref?: ((href?: string) => void) | undefined; -}; - -jest.mock( - "@/components/drops/view/part/dropPartMarkdown/youtubePreview", - () => ({ - __esModule: true, - default: ({ href }: { href: string }) => ( - - ), - }) -); - -jest.mock("@/components/drops/view/part/DropPartMarkdownImage", () => ({ - __esModule: true, - default: ({ src }: { src: string }) => ( -