summaryrefslogtreecommitdiffstats
path: root/packages/excalidraw/actions/actionProperties.test.tsx
diff options
context:
space:
mode:
authorkj_sh6042026-03-15 16:19:35 -0400
committerkj_sh6042026-03-15 16:19:35 -0400
commit6ec259a0e71174651bae95d4628138bf6fd68742 (patch)
tree5e33c6a5ec091ecabfcb257fdc7b6a88ed8754ac /packages/excalidraw/actions/actionProperties.test.tsx
parent16c8578b15c727f22921f8a80a56ee4d4e7f2272 (diff)
refactor: packages/
Diffstat (limited to 'packages/excalidraw/actions/actionProperties.test.tsx')
-rw-r--r--packages/excalidraw/actions/actionProperties.test.tsx168
1 files changed, 168 insertions, 0 deletions
diff --git a/packages/excalidraw/actions/actionProperties.test.tsx b/packages/excalidraw/actions/actionProperties.test.tsx
new file mode 100644
index 0000000..80d2ca2
--- /dev/null
+++ b/packages/excalidraw/actions/actionProperties.test.tsx
@@ -0,0 +1,168 @@
+import React from "react";
+import { Excalidraw } from "../index";
+import { queryByTestId } from "@testing-library/react";
+import { render } from "../tests/test-utils";
+import { UI } from "../tests/helpers/ui";
+import { API } from "../tests/helpers/api";
+import { COLOR_PALETTE, DEFAULT_ELEMENT_BACKGROUND_PICKS } from "../colors";
+import { FONT_FAMILY, STROKE_WIDTH } from "../constants";
+
+describe("element locking", () => {
+ beforeEach(async () => {
+ await render(<Excalidraw />);
+ });
+
+ describe("properties when tool selected", () => {
+ it("should show active background top picks", () => {
+ UI.clickTool("rectangle");
+
+ const color = DEFAULT_ELEMENT_BACKGROUND_PICKS[1];
+
+ // just in case we change it in the future
+ expect(color).not.toBe(COLOR_PALETTE.transparent);
+
+ API.setAppState({
+ currentItemBackgroundColor: color,
+ });
+ const activeColor = queryByTestId(
+ document.body,
+ `color-top-pick-${color}`,
+ );
+ expect(activeColor).toHaveClass("active");
+ });
+
+ it("should show fill style when background non-transparent", () => {
+ UI.clickTool("rectangle");
+
+ const color = DEFAULT_ELEMENT_BACKGROUND_PICKS[1];
+
+ // just in case we change it in the future
+ expect(color).not.toBe(COLOR_PALETTE.transparent);
+
+ API.setAppState({
+ currentItemBackgroundColor: color,
+ currentItemFillStyle: "hachure",
+ });
+ const hachureFillButton = queryByTestId(document.body, `fill-hachure`);
+
+ expect(hachureFillButton).toHaveClass("active");
+ API.setAppState({
+ currentItemFillStyle: "solid",
+ });
+ const solidFillStyle = queryByTestId(document.body, `fill-solid`);
+ expect(solidFillStyle).toHaveClass("active");
+ });
+
+ it("should not show fill style when background transparent", () => {
+ UI.clickTool("rectangle");
+
+ API.setAppState({
+ currentItemBackgroundColor: COLOR_PALETTE.transparent,
+ currentItemFillStyle: "hachure",
+ });
+ const hachureFillButton = queryByTestId(document.body, `fill-hachure`);
+
+ expect(hachureFillButton).toBe(null);
+ });
+
+ it("should show horizontal text align for text tool", () => {
+ UI.clickTool("text");
+
+ API.setAppState({
+ currentItemTextAlign: "right",
+ });
+
+ const centerTextAlign = queryByTestId(document.body, `align-right`);
+ expect(centerTextAlign).toBeChecked();
+ });
+ });
+
+ describe("properties when elements selected", () => {
+ it("should show active styles when single element selected", () => {
+ const rect = API.createElement({
+ type: "rectangle",
+ backgroundColor: "red",
+ fillStyle: "cross-hatch",
+ });
+ API.setElements([rect]);
+ API.setSelectedElements([rect]);
+
+ const crossHatchButton = queryByTestId(document.body, `fill-cross-hatch`);
+ expect(crossHatchButton).toHaveClass("active");
+ });
+
+ it("should not show fill style selected element's background is transparent", () => {
+ const rect = API.createElement({
+ type: "rectangle",
+ backgroundColor: COLOR_PALETTE.transparent,
+ fillStyle: "cross-hatch",
+ });
+ API.setElements([rect]);
+ API.setSelectedElements([rect]);
+
+ const crossHatchButton = queryByTestId(document.body, `fill-cross-hatch`);
+ expect(crossHatchButton).toBe(null);
+ });
+
+ it("should highlight common stroke width of selected elements", () => {
+ const rect1 = API.createElement({
+ type: "rectangle",
+ strokeWidth: STROKE_WIDTH.thin,
+ });
+ const rect2 = API.createElement({
+ type: "rectangle",
+ strokeWidth: STROKE_WIDTH.thin,
+ });
+ API.setElements([rect1, rect2]);
+ API.setSelectedElements([rect1, rect2]);
+
+ const thinStrokeWidthButton = queryByTestId(
+ document.body,
+ `strokeWidth-thin`,
+ );
+ expect(thinStrokeWidthButton).toBeChecked();
+ });
+
+ it("should not highlight any stroke width button if no common style", () => {
+ const rect1 = API.createElement({
+ type: "rectangle",
+ strokeWidth: STROKE_WIDTH.thin,
+ });
+ const rect2 = API.createElement({
+ type: "rectangle",
+ strokeWidth: STROKE_WIDTH.bold,
+ });
+ API.setElements([rect1, rect2]);
+ API.setSelectedElements([rect1, rect2]);
+
+ expect(queryByTestId(document.body, `strokeWidth-thin`)).not.toBe(null);
+ expect(
+ queryByTestId(document.body, `strokeWidth-thin`),
+ ).not.toBeChecked();
+ expect(
+ queryByTestId(document.body, `strokeWidth-bold`),
+ ).not.toBeChecked();
+ expect(
+ queryByTestId(document.body, `strokeWidth-extraBold`),
+ ).not.toBeChecked();
+ });
+
+ it("should show properties of different element types when selected", () => {
+ const rect = API.createElement({
+ type: "rectangle",
+ strokeWidth: STROKE_WIDTH.bold,
+ });
+ const text = API.createElement({
+ type: "text",
+ fontFamily: FONT_FAMILY["Comic Shanns"],
+ });
+ API.setElements([rect, text]);
+ API.setSelectedElements([rect, text]);
+
+ expect(queryByTestId(document.body, `strokeWidth-bold`)).toBeChecked();
+ expect(queryByTestId(document.body, `font-family-code`)).toHaveClass(
+ "active",
+ );
+ });
+ });
+});