mirror of
https://github.com/penpot/penpot.git
synced 2026-10-26 04:26:14 +00:00
♻️ Fix regression and add test
This commit is contained in:
parent
92a3030f05
commit
7843bb1208
@ -6,6 +6,7 @@ import {
|
|||||||
setupTypographyTokensFileRender,
|
setupTypographyTokensFileRender,
|
||||||
unfoldTokenType,
|
unfoldTokenType,
|
||||||
createToken,
|
createToken,
|
||||||
|
createSet
|
||||||
} from "./helpers";
|
} from "./helpers";
|
||||||
|
|
||||||
test.beforeEach(async ({ page }) => {
|
test.beforeEach(async ({ page }) => {
|
||||||
@ -1101,21 +1102,6 @@ test("BUG: 14200, Tokens in sets are applied when clicking on Save during creati
|
|||||||
flags: ["enable-token-combobox", "enable-feature-token-input"],
|
flags: ["enable-token-combobox", "enable-feature-token-input"],
|
||||||
});
|
});
|
||||||
|
|
||||||
const changeSetInput = async (sidebar, setName, finalKey = "Enter") => {
|
|
||||||
const setInput = sidebar.locator("input:focus");
|
|
||||||
await expect(setInput).toBeVisible();
|
|
||||||
await setInput.fill(setName);
|
|
||||||
await setInput.press(finalKey);
|
|
||||||
};
|
|
||||||
|
|
||||||
const createSet = async (sidebar, setName, finalKey = "Enter") => {
|
|
||||||
const tokensTabButton = sidebar
|
|
||||||
.getByRole("button", { name: "Add set" })
|
|
||||||
.click();
|
|
||||||
|
|
||||||
await changeSetInput(sidebar, setName, (finalKey = "Enter"));
|
|
||||||
};
|
|
||||||
|
|
||||||
// Select rectangle layer
|
// Select rectangle layer
|
||||||
await page.getByRole("tab", { name: "Layers" }).click();
|
await page.getByRole("tab", { name: "Layers" }).click();
|
||||||
|
|
||||||
@ -1213,21 +1199,6 @@ test("Check token application across sets", async ({ page }) => {
|
|||||||
flags: ["enable-token-combobox", "enable-feature-token-input"],
|
flags: ["enable-token-combobox", "enable-feature-token-input"],
|
||||||
});
|
});
|
||||||
|
|
||||||
const changeSetInput = async (sidebar, setName, finalKey = "Enter") => {
|
|
||||||
const setInput = sidebar.locator("input:focus");
|
|
||||||
await expect(setInput).toBeVisible();
|
|
||||||
await setInput.fill(setName);
|
|
||||||
await setInput.press(finalKey);
|
|
||||||
};
|
|
||||||
|
|
||||||
const createSet = async (sidebar, setName, finalKey = "Enter") => {
|
|
||||||
const tokensTabButton = sidebar
|
|
||||||
.getByRole("button", { name: "Add set" })
|
|
||||||
.click();
|
|
||||||
|
|
||||||
await changeSetInput(sidebar, setName, (finalKey = "Enter"));
|
|
||||||
};
|
|
||||||
|
|
||||||
const createTokenInSet = async (tokenName, tokenValue) => {
|
const createTokenInSet = async (tokenName, tokenValue) => {
|
||||||
await unfoldTokenType(tokensSidebar, "Border radius");
|
await unfoldTokenType(tokensSidebar, "Border radius");
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import {
|
|||||||
testTokenCreationFlow,
|
testTokenCreationFlow,
|
||||||
unfoldTokenType,
|
unfoldTokenType,
|
||||||
createToken,
|
createToken,
|
||||||
|
createSet,
|
||||||
} from "./helpers";
|
} from "./helpers";
|
||||||
|
|
||||||
test.beforeEach(async ({ page }) => {
|
test.beforeEach(async ({ page }) => {
|
||||||
@ -2039,7 +2040,7 @@ test.describe("Tokens tab - delete", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test("BUG: 1425 Token is not highlighted in red when value references a token in a disabled set", async ({
|
test("BUG: 14262 Token pill must be highlighted when value references a token in a disabled set", async ({
|
||||||
page,
|
page,
|
||||||
}) => {
|
}) => {
|
||||||
const { tokensSidebar, tokenContextMenuForToken, tokenThemesSetsSidebar } =
|
const { tokensSidebar, tokenContextMenuForToken, tokenThemesSetsSidebar } =
|
||||||
@ -2049,16 +2050,54 @@ test("BUG: 1425 Token is not highlighted in red when value references a token in
|
|||||||
|
|
||||||
await unfoldTokenType(tokensSidebar, "Border radius");
|
await unfoldTokenType(tokensSidebar, "Border radius");
|
||||||
await createToken(page, "Border radius", "base-radius", "Value", "20");
|
await createToken(page, "Border radius", "base-radius", "Value", "20");
|
||||||
await createToken(page, "Border radius", "ref-base", "Value", "{base-radius}");
|
await createToken(
|
||||||
|
page,
|
||||||
|
"Border radius",
|
||||||
|
"ref-base",
|
||||||
|
"Value",
|
||||||
|
"{base-radius}",
|
||||||
|
);
|
||||||
|
|
||||||
const refTokenPill = tokensSidebar.getByRole("button", {
|
const refTokenPill = tokensSidebar.getByRole("button", {
|
||||||
name: "ref-base",
|
name: "ref-base",
|
||||||
});
|
});
|
||||||
|
|
||||||
await expect(refTokenPill).toBeVisible();
|
await expect(refTokenPill).toBeVisible();
|
||||||
|
|
||||||
const CoreSetCheckbox = tokenThemesSetsSidebar.getByRole('button', { name: 'core' }).getByRole('checkbox');
|
const CoreSetCheckbox = tokenThemesSetsSidebar
|
||||||
|
.getByRole("button", { name: "core" })
|
||||||
|
.getByRole("checkbox");
|
||||||
await CoreSetCheckbox.click();
|
await CoreSetCheckbox.click();
|
||||||
const brokenTokenPill = tokensSidebar.getByRole('button', { name: 'Missing reference ref-base' });
|
|
||||||
await expect(brokenTokenPill).toBeVisible();
|
// Pill is not highlighted if both tokens are on the same disabled set
|
||||||
|
const brokenTokenPill = tokensSidebar.getByRole("button", {
|
||||||
|
name: "Missing reference ref-base",
|
||||||
|
});
|
||||||
|
await expect(brokenTokenPill).not.toBeVisible();
|
||||||
|
await createSet(tokenThemesSetsSidebar, "New set");
|
||||||
|
await tokenThemesSetsSidebar.getByRole("button", { name: "New set" }).click();
|
||||||
|
|
||||||
|
await tokenThemesSetsSidebar
|
||||||
|
.getByRole("button", { name: "New set" })
|
||||||
|
.getByRole("checkbox")
|
||||||
|
.click();
|
||||||
|
await createToken(page, "Border radius", "new-ref", "Value", "{base-radius}");
|
||||||
|
|
||||||
|
// Pill is highlighted if the referenced token is in a different disabled set than the token with the reference
|
||||||
|
const newBrokenTokenPill = tokensSidebar.getByRole("button", {
|
||||||
|
name: "Missing reference new-ref",
|
||||||
|
});
|
||||||
|
await expect(newBrokenTokenPill).toBeVisible();
|
||||||
|
await tokenThemesSetsSidebar
|
||||||
|
.getByRole("button", { name: "core" })
|
||||||
|
.getByRole("checkbox")
|
||||||
|
.click();
|
||||||
|
|
||||||
|
// When the disabled set is activated again, pill is not highlighted anymore
|
||||||
|
await expect(
|
||||||
|
tokenThemesSetsSidebar
|
||||||
|
.getByRole("button", { name: "core" })
|
||||||
|
.getByRole("checkbox"),
|
||||||
|
).toBeChecked();
|
||||||
|
await expect(newBrokenTokenPill).not.toBeVisible();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -360,6 +360,21 @@ const createToken = async (page, type, name, textFieldName, value) => {
|
|||||||
await expect(tokensUpdateCreateModal).not.toBeVisible();
|
await expect(tokensUpdateCreateModal).not.toBeVisible();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const changeSetInput = async (sidebar, setName, finalKey = "Enter") => {
|
||||||
|
const setInput = sidebar.locator("input:focus");
|
||||||
|
await expect(setInput).toBeVisible();
|
||||||
|
await setInput.fill(setName);
|
||||||
|
await setInput.press(finalKey);
|
||||||
|
};
|
||||||
|
|
||||||
|
const createSet = async (sidebar, setName, finalKey = "Enter") => {
|
||||||
|
const tokensTabButton = sidebar
|
||||||
|
.getByRole("button", { name: "Add set" })
|
||||||
|
.click();
|
||||||
|
|
||||||
|
await changeSetInput(sidebar, setName, (finalKey = "Enter"));
|
||||||
|
};
|
||||||
|
|
||||||
export {
|
export {
|
||||||
setupEmptyTokensFile,
|
setupEmptyTokensFile,
|
||||||
setupEmptyTokensFileRender,
|
setupEmptyTokensFileRender,
|
||||||
@ -370,4 +385,6 @@ export {
|
|||||||
testTokenCreationFlow,
|
testTokenCreationFlow,
|
||||||
unfoldTokenType,
|
unfoldTokenType,
|
||||||
createToken,
|
createToken,
|
||||||
|
createSet,
|
||||||
|
changeSetInput,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { test, expect } from "@playwright/test";
|
import { test, expect } from "@playwright/test";
|
||||||
import { BaseWebSocketPage } from "../../pages/BaseWebSocketPage";
|
import { BaseWebSocketPage } from "../../pages/BaseWebSocketPage";
|
||||||
import { WasmWorkspacePage } from "../../pages/WasmWorkspacePage";
|
import { WasmWorkspacePage } from "../../pages/WasmWorkspacePage";
|
||||||
import { setupEmptyTokensFileRender, setupTokensFileRender } from "./helpers";
|
import { setupEmptyTokensFileRender, setupTokensFileRender, createSet, changeSetInput } from "./helpers";
|
||||||
|
|
||||||
test.beforeEach(async ({ page }) => {
|
test.beforeEach(async ({ page }) => {
|
||||||
await WasmWorkspacePage.init(page);
|
await WasmWorkspacePage.init(page);
|
||||||
@ -9,20 +9,6 @@ test.beforeEach(async ({ page }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test.describe("Tokens: Sets Tab", () => {
|
test.describe("Tokens: Sets Tab", () => {
|
||||||
const changeSetInput = async (sidebar, setName, finalKey = "Enter") => {
|
|
||||||
const setInput = sidebar.locator("input:focus");
|
|
||||||
await expect(setInput).toBeVisible();
|
|
||||||
await setInput.fill(setName);
|
|
||||||
await setInput.press(finalKey);
|
|
||||||
};
|
|
||||||
|
|
||||||
const createSet = async (sidebar, setName, finalKey = "Enter") => {
|
|
||||||
const tokensTabButton = sidebar
|
|
||||||
.getByRole("button", { name: "Add set" })
|
|
||||||
.click();
|
|
||||||
|
|
||||||
await changeSetInput(sidebar, setName, (finalKey = "Enter"));
|
|
||||||
};
|
|
||||||
|
|
||||||
const assertEmptySetsList = async (el) => {
|
const assertEmptySetsList = async (el) => {
|
||||||
const buttons = await el.getByRole("button").allTextContents();
|
const buttons = await el.getByRole("button").allTextContents();
|
||||||
|
|||||||
@ -119,7 +119,7 @@
|
|||||||
|
|
||||||
(mf/defc left-sidebar*
|
(mf/defc left-sidebar*
|
||||||
{::mf/memo true}
|
{::mf/memo true}
|
||||||
[{:keys [layout file tokens-lib active-tokens resolved-active-tokens resolved-active-tokens-not-forced]}]
|
[{:keys [layout file tokens-lib active-tokens resolved-active-tokens]}]
|
||||||
(let [options-mode (mf/deref refs/options-mode-global)
|
(let [options-mode (mf/deref refs/options-mode-global)
|
||||||
project (mf/deref refs/project)
|
project (mf/deref refs/project)
|
||||||
file-id (get file :id)
|
file-id (get file :id)
|
||||||
@ -223,8 +223,7 @@
|
|||||||
[:> tokens-sidebar-tab*
|
[:> tokens-sidebar-tab*
|
||||||
{:tokens-lib tokens-lib
|
{:tokens-lib tokens-lib
|
||||||
:active-tokens active-tokens
|
:active-tokens active-tokens
|
||||||
:resolved-active-tokens resolved-active-tokens
|
:resolved-active-tokens resolved-active-tokens}]
|
||||||
:resolved-active-tokens-not-forced resolved-active-tokens-not-forced}]
|
|
||||||
|
|
||||||
:layers
|
:layers
|
||||||
[:> layers-content*
|
[:> layers-content*
|
||||||
@ -396,8 +395,6 @@
|
|||||||
resolved-active-tokens-force-set
|
resolved-active-tokens-force-set
|
||||||
(sd/use-resolved-tokens* active-tokens-force-set)]
|
(sd/use-resolved-tokens* active-tokens-force-set)]
|
||||||
|
|
||||||
;; TODO: This props should be passed though context to avoid prop drilling.
|
|
||||||
|
|
||||||
[:*
|
[:*
|
||||||
(if (:collapse-left-sidebar layout)
|
(if (:collapse-left-sidebar layout)
|
||||||
[:> collapsed-button*]
|
[:> collapsed-button*]
|
||||||
@ -406,7 +403,6 @@
|
|||||||
:page-id page-id
|
:page-id page-id
|
||||||
:tokens-lib tokens-lib
|
:tokens-lib tokens-lib
|
||||||
:active-tokens active-tokens-force-set
|
:active-tokens active-tokens-force-set
|
||||||
:resolved-active-tokens-not-forced resolved-active-tokens
|
|
||||||
:resolved-active-tokens (if tokenscript?
|
:resolved-active-tokens (if tokenscript?
|
||||||
tokenscript-resolved-active-tokens-force-set
|
tokenscript-resolved-active-tokens-force-set
|
||||||
resolved-active-tokens-force-set)}])
|
resolved-active-tokens-force-set)}])
|
||||||
|
|||||||
@ -85,7 +85,7 @@
|
|||||||
|
|
||||||
(mf/defc tokens-section*
|
(mf/defc tokens-section*
|
||||||
{::mf/private true}
|
{::mf/private true}
|
||||||
[{:keys [tokens-lib active-tokens resolved-active-tokens resolved-active-tokens-not-forced]}]
|
[{:keys [tokens-lib active-tokens resolved-active-tokens]}]
|
||||||
(let [objects (mf/deref refs/workspace-page-objects)
|
(let [objects (mf/deref refs/workspace-page-objects)
|
||||||
selected (mf/deref refs/selected-shapes)
|
selected (mf/deref refs/selected-shapes)
|
||||||
|
|
||||||
@ -320,7 +320,6 @@
|
|||||||
:selected-shapes selected-shapes
|
:selected-shapes selected-shapes
|
||||||
:is-selected-inside-layout is-selected-inside-layout
|
:is-selected-inside-layout is-selected-inside-layout
|
||||||
:active-theme-tokens resolved-active-tokens
|
:active-theme-tokens resolved-active-tokens
|
||||||
:active-theme-tokens-not-forced resolved-active-tokens-not-forced
|
|
||||||
:tokens-lib tokens-lib
|
:tokens-lib tokens-lib
|
||||||
:selected-token-set-id selected-token-set-id}]))
|
:selected-token-set-id selected-token-set-id}]))
|
||||||
|
|
||||||
@ -330,6 +329,4 @@
|
|||||||
:type type
|
:type type
|
||||||
:selected-shapes selected-shapes
|
:selected-shapes selected-shapes
|
||||||
:is-selected-inside-layout is-selected-inside-layout
|
:is-selected-inside-layout is-selected-inside-layout
|
||||||
:active-theme-tokens resolved-active-tokens
|
:active-theme-tokens resolved-active-tokens}])]))
|
||||||
:active-theme-tokens-not-forced resolved-active-tokens-not-forced
|
|
||||||
:selected-token-set-id selected-token-set-id}])]))
|
|
||||||
|
|||||||
@ -71,7 +71,7 @@
|
|||||||
|
|
||||||
(mf/defc token-group*
|
(mf/defc token-group*
|
||||||
{::mf/schema schema:token-group}
|
{::mf/schema schema:token-group}
|
||||||
[{:keys [type tokens selected-shapes is-selected-inside-layout active-theme-tokens selected-token-set-id tokens-lib selected-ids active-theme-tokens-not-forced]}]
|
[{:keys [type tokens selected-shapes is-selected-inside-layout active-theme-tokens selected-token-set-id tokens-lib selected-ids]}]
|
||||||
(let [{:keys [modal title]}
|
(let [{:keys [modal title]}
|
||||||
(get dwta/token-properties type)
|
(get dwta/token-properties type)
|
||||||
|
|
||||||
@ -190,7 +190,6 @@
|
|||||||
:selected-shapes selected-shapes
|
:selected-shapes selected-shapes
|
||||||
:is-selected-inside-layout is-selected-inside-layout
|
:is-selected-inside-layout is-selected-inside-layout
|
||||||
:active-theme-tokens active-theme-tokens
|
:active-theme-tokens active-theme-tokens
|
||||||
:active-theme-tokens-not-forced active-theme-tokens-not-forced
|
|
||||||
:selected-token-set-id selected-token-set-id
|
:selected-token-set-id selected-token-set-id
|
||||||
:tokens-lib tokens-lib
|
:tokens-lib tokens-lib
|
||||||
:on-token-pill-click on-token-pill-click
|
:on-token-pill-click on-token-pill-click
|
||||||
|
|||||||
@ -175,7 +175,7 @@
|
|||||||
|
|
||||||
(mf/defc token-pill*
|
(mf/defc token-pill*
|
||||||
{::mf/wrap [mf/memo]}
|
{::mf/wrap [mf/memo]}
|
||||||
[{:keys [on-click token on-context-menu selected-shapes is-selected-inside-layout active-theme-tokens active-theme-tokens-not-forced]}]
|
[{:keys [on-click token on-context-menu selected-shapes is-selected-inside-layout active-theme-tokens]}]
|
||||||
(let [{:keys [name value type]} token
|
(let [{:keys [name value type]} token
|
||||||
|
|
||||||
resolved-token (get active-theme-tokens (:name token))
|
resolved-token (get active-theme-tokens (:name token))
|
||||||
@ -216,7 +216,7 @@
|
|||||||
(if (contains? cf/flags :tokenscript)
|
(if (contains? cf/flags :tokenscript)
|
||||||
(seq (:errors resolved-token))
|
(seq (:errors resolved-token))
|
||||||
(and is-reference?
|
(and is-reference?
|
||||||
(not (contains-reference-value? value active-theme-tokens-not-forced))))
|
(not (contains-reference-value? value active-theme-tokens))))
|
||||||
|
|
||||||
no-valid-value (seq errors)
|
no-valid-value (seq errors)
|
||||||
|
|
||||||
|
|||||||
@ -134,7 +134,6 @@
|
|||||||
selected-shapes
|
selected-shapes
|
||||||
is-selected-inside-layout
|
is-selected-inside-layout
|
||||||
active-theme-tokens
|
active-theme-tokens
|
||||||
active-theme-tokens-not-forced
|
|
||||||
tokens-lib
|
tokens-lib
|
||||||
selected-token-set-id
|
selected-token-set-id
|
||||||
on-token-pill-click
|
on-token-pill-click
|
||||||
@ -172,7 +171,6 @@
|
|||||||
:selected-shapes selected-shapes
|
:selected-shapes selected-shapes
|
||||||
:is-selected-inside-layout is-selected-inside-layout
|
:is-selected-inside-layout is-selected-inside-layout
|
||||||
:active-theme-tokens active-theme-tokens
|
:active-theme-tokens active-theme-tokens
|
||||||
:active-theme-tokens-not-forced active-theme-tokens-not-forced
|
|
||||||
:on-click on-token-pill-click
|
:on-click on-token-pill-click
|
||||||
:on-context-menu on-pill-context-menu}])
|
:on-context-menu on-pill-context-menu}])
|
||||||
;; Render segment folder
|
;; Render segment folder
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user