penpot/frontend/test/frontend_tests/tokens/logic/tokens_status_test.cljs
Andrés Moya 3cd9bfa9de
✨ Add sync with design tokens in external libraries (#10293)
* ✨ Auto link tokens when adding external libraries (provisional)

* 🔧 Refactor tokens-lib initialization

* 🔧 Add separated TokenStatus to store status apart of TokensLib

* 🔧 Make all status operations use the new data structure

* 🔧 Normalize status helper functions and access token sets by id

* 🔧 Rename :tokens-file to :tokens-source

* 🎉 Allow the user to choose the tokens-source of a file

* 🎉 Make tokens library readonly when it's in an external file

* 🎉 Show tokens in library summaries

* 🎉 Show source info in sidebar

* 🔧 Fix integration tests

* 🐛 Propagate changes of token values in external library

* 🎉 Layout updates

* 🔧 Refactor tokens source calculations

* 🔧 Add harder checks for nil or empty values in everything

* 🐛 Fix some integration tests

* 🔧 Add integration tests for tokens in external libs

* 🔧 Validate and repair missing tokens status

* 🎉 Make ui changes optional with config flag

* 🐛 Propagate tokens after synchronizing components in ext library

* 🐛 Propagate tokens after creating new instances

* 🐛 Propagate tokens after synchronizing tokens in ext library

* 🐛 Add a tokens source icon to libraries section (#11439)

* 🐛 Add a tokens source icon to libraries section

* 🐛 Fix ellipsis on library names

* ♻️ Remove code under flag on legacy component

* 🐛 Fix token theme name on inspect tab

* 🎉 Add changes notification (#11476)

* 🎉 Add changes notification

* ♻️ Change fn names

* 🐛 Fix tokens source label truncation and missing translations (#11533)

* 🐛 Fix tokens source label truncation and missing translations

The tokens source file name always showed, even for the current file,
and long names wrapped onto a second line instead of truncating
because the header used flex-wrap and overflow-wrap: break-word
instead of single-line ellipsis.

Show the source row unconditionally (it now displays "This file" when
the source is the current file, matching the connected-library case),
truncate the file name to one line with an ellipsis, and only attach a
tooltip with the full name when the text is actually truncated.

Replace the hardcoded UI strings with translated ones and add their
English and Spanish entries.

AI-assisted-by: claude-sonnet-5

* 🐛 Remove redundant effect dependency in tokens source

file-name-truncated? was listed as a dependency of the with-effect
that checks and observes label truncation, even though it isn't
read inside the effect body. Since the effect itself flips that
state via check-file-name-truncated, including it as a dependency
caused the ResizeObserver to be needlessly disconnected and
reconnected on every truncation change.

AI-assisted-by: claude-sonnet-5

* 🐛 Fix small visual error

* 🐛 Fix problem with plugins

* 🐛 Fix playwright tests

---------

Co-authored-by: Eva Marco <evamarcod@gmail.com>
Co-authored-by: Eva Marco <eva.marco@kaleidos.net>
Co-authored-by: alonso.torres <alonso.torres@kaleidos.net>
2026-09-21 15:37:45 +02:00

119 lines
4.9 KiB
Clojure

(ns frontend-tests.tokens.logic.tokens-status-test
(:require
[app.common.test-helpers.ids-map :as thi]
[app.common.test-helpers.tokens :as tho]
[app.common.types.tokens-lib :as ctob]
[app.common.types.tokens-status :as ctos]
[app.main.data.workspace.tokens.library-edit :as dwtl]
[cljs.test :as t :include-macros true]
[frontend-tests.helpers.pages :as thp]
[frontend-tests.helpers.state :as ths]
[frontend-tests.tokens.helpers.state :as tohs]))
(t/use-fixtures :each
{:before thp/reset-idmap!})
(defn- setup-file
"Create a file with several token themes and token sets, some active and
some inactive. Returns the file map with :tokens-lib and :tokens-status
in its :data."
[]
(-> (tho/sample-file-with-tokens
:lib-fn #(-> %
;; Add token sets
(ctob/add-set (ctob/make-token-set :id (thi/new-id! :set-active)
:name "set-active"))
(ctob/add-set (ctob/make-token-set :id (thi/new-id! :set-inactive)
:name "set-inactive"))
;; Add themes
(ctob/add-theme (ctob/make-token-theme :id (thi/new-id! :theme-active)
:name "theme-active"
:group "group-1"
:sets #{"set-active"}))
(ctob/add-theme (ctob/make-token-theme :id (thi/new-id! :theme-inactive)
:name "theme-inactive"
:group "group-1"
:sets #{"set-inactive"})))
:status-fn #(-> %
(ctos/set-tokens-status #{(thi/id :theme-active)}
#{(thi/id :set-active)})))))
(defn- get-tokens-status [file]
(get-in file [:data :tokens-status]))
(t/deftest test-set-token-theme-active-deactivate
(t/async
done
(let [file (setup-file)
store (ths/setup-store file)
theme-id (thi/id :theme-active)
set-id (thi/id :set-active)
events [(dwtl/set-token-theme-active theme-id false)]]
(tohs/run-store-async
store done events
(fn [new-state]
(let [file' (ths/get-file-from-state new-state)
status (get-tokens-status file')]
(t/is (not (ctos/theme-active? status theme-id))
"theme should be inactive after deactivation")
(t/is (not (ctos/set-active? status set-id))
"set should be inactive when its theme is deactivated")))))))
(t/deftest test-set-token-theme-active-activate
(t/async
done
(let [file (setup-file)
store (ths/setup-store file)
theme-id (thi/id :theme-inactive)
set-id (thi/id :set-inactive)
events [(dwtl/set-token-theme-active theme-id true)]]
(tohs/run-store-async
store done events
(fn [new-state]
(let [file' (ths/get-file-from-state new-state)
status (get-tokens-status file')]
(t/is (ctos/theme-active? status theme-id)
"theme should be active after activation")
(t/is (ctos/set-active? status set-id)
"set should be active when its theme is activated")))))))
(t/deftest test-toggle-token-theme-active-deactivate
(t/async
done
(let [file (setup-file)
store (ths/setup-store file)
theme-id (thi/id :theme-active)
set-id (thi/id :set-active)
events [(dwtl/toggle-token-theme-active theme-id)]]
(tohs/run-store-async
store done events
(fn [new-state]
(let [file' (ths/get-file-from-state new-state)
status (get-tokens-status file')]
(t/is (not (ctos/theme-active? status theme-id))
"active theme should become inactive after toggle")
(t/is (not (ctos/set-active? status set-id))
"set should be inactive when its theme is toggled off")))))))
(t/deftest test-toggle-token-theme-active-activate
(t/async
done
(let [file (setup-file)
store (ths/setup-store file)
theme-id (thi/id :theme-inactive)
set-id (thi/id :set-inactive)
events [(dwtl/toggle-token-theme-active theme-id)]]
(tohs/run-store-async
store done events
(fn [new-state]
(let [file' (ths/get-file-from-state new-state)
status (get-tokens-status file')]
(t/is (ctos/theme-active? status theme-id)
"inactive theme should become active after toggle")
(t/is (ctos/set-active? status set-id)
"set should be active when its theme is toggled on")))))))