Skip to content

Commit

Permalink
test(Tooltip): add visual tests
Browse files Browse the repository at this point in the history
  • Loading branch information
sarkaaa committed Nov 7, 2024
1 parent 524b7e9 commit 412fa17
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 0 deletions.
46 changes: 46 additions & 0 deletions packages/orbit-components/src/Tooltip/Tooltip.ct-story.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import React from "react";

import { PLACEMENTS } from "../common/placements";
import { tooltipContentCtStory } from "../primitives/TooltipPrimitive/TooltipPrimitive.ct-story";
import Stack from "../Stack";
import { Icons } from "../..";
import type { Props, Size } from "./types";

import Tooltip from ".";

type TooltipPrimitiveProps = Pick<Props, "placement" | "block">;

export function DefaultTooltip({ placement = PLACEMENTS.BOTTOM, block }: TooltipPrimitiveProps) {
return (
<div className="lm:min-h-[600px] flex min-h-[800px] items-center">
<Stack justify={placement.includes("left") ? "end" : "start"}>
<Tooltip content={tooltipContentCtStory} placement={placement} block={block}>
<Icons.Airplane />
</Tooltip>
</Stack>
</div>
);
}

export function TooltipWithImage({ size = "medium" }: { size?: Size }) {
return (
<div className="min-h-[750px]">
<Stack justify="center">
<Tooltip
size={size}
content={
<Stack>
<img
src="https://images.kiwi.com/illustrations/0x200/Rating-Q85.png"
alt="Preview of card help in TooltipPrimitive component"
/>
{tooltipContentCtStory}
</Stack>
}
>
<Icons.Airplane />
</Tooltip>
</Stack>
</div>
);
}
104 changes: 104 additions & 0 deletions packages/orbit-components/src/Tooltip/Tooltip.ct.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
import * as React from "react";
import { test, expect } from "@playwright/experimental-ct-react";
import { defaultTokens } from "@kiwicom/orbit-design-tokens";

import { DefaultTooltip, TooltipWithImage } from "./Tooltip.ct-story";
import type { Placement } from "../common/placements";
import type { Size } from "../primitives/TooltipPrimitive/types";

const skipIfViewportSmallerThan = (viewport, width, message) => {
test.skip(viewport !== null && viewport.width < width, message);
};

const skipIfViewportLargerThanOrEqual = (viewport, width, message) => {
test.skip(viewport !== null && viewport.width >= width, message);
};

test.describe("Tooltip visual tests", () => {
const { breakpointLargeMobile } = defaultTokens;

const placements = ["top", "right", "bottom", "left"];
const sizes: Size[] = ["small", "medium"];

placements.forEach(placement => {
test(`screenshot for default - ${placement} - desktop`, async ({ mount, viewport }) => {
skipIfViewportSmallerThan(
viewport,
breakpointLargeMobile,
"This feature is largeMobile, tablet and desktop only",
);

const component = await mount(<DefaultTooltip placement={placement as Placement} />);

await component.getByRole("button").hover();
await expect(component).toHaveScreenshot();
});
});

sizes.forEach(size => {
test(`screenshot with image inside - ${size} on desktop`, async ({ mount, viewport }) => {
skipIfViewportSmallerThan(
viewport,
breakpointLargeMobile,
"This feature is largeMobile, tablet and desktop only",
);

const component = await mount(<TooltipWithImage size={size} />);

await component.getByRole("button").hover();
await expect(component).toHaveScreenshot();
});
});

test(`screenshot - block tooltip on desktop`, async ({ mount, viewport }) => {
skipIfViewportSmallerThan(
viewport,
breakpointLargeMobile,
"This feature is largeMobile, tablet and desktop only",
);

const component = await mount(<DefaultTooltip block />);

await component.getByRole("button").hover();
await expect(component).toHaveScreenshot();
});

// Tests below cover mobile views - the tooltip is visible on click.
placements.forEach(placement => {
test(`screenshot for default - ${placement} on mobile`, async ({ mount, viewport, page }) => {
skipIfViewportLargerThanOrEqual(
viewport,
breakpointLargeMobile,
"This feature is small and medium mobile only",
);

const component = await mount(<DefaultTooltip placement={placement as Placement} />);

const tooltip = await page.getByRole("tooltip");

await component.getByRole("button").click();

await expect(tooltip).toBeVisible();
await expect(component).toHaveScreenshot();
});
});

sizes.forEach(size => {
test(`screenshot with image inside - ${size} on mobile`, async ({ mount, viewport, page }) => {
skipIfViewportLargerThanOrEqual(
viewport,
breakpointLargeMobile,
"This feature is small and medium mobile only",
);

const component = await mount(<TooltipWithImage size={size} />);

const tooltip = await page.getByRole("tooltip");

await component.getByRole("button").click();

await expect(tooltip).toBeVisible();
await expect(component).toHaveScreenshot();
});
});
});

0 comments on commit 412fa17

Please sign in to comment.