mirror of
https://github.com/penpot/penpot.git
synced 2026-08-31 00:59:02 +00:00
898 lines
33 KiB
Clojure
898 lines
33 KiB
Clojure
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
;;
|
|
;; Copyright (c) KALEIDOS SUBSIDIARY SL
|
|
|
|
(ns frontend-tests.tokens.logic.token-data-test
|
|
(:require
|
|
[app.common.test-helpers.files :as cthf]
|
|
[app.common.test-helpers.ids-map :as cthi]
|
|
[app.common.test-helpers.tokens :as ctho]
|
|
[app.common.types.tokens-lib :as ctob]
|
|
[app.common.types.tokens-status :as ctos]
|
|
[app.common.uuid :as uuid]
|
|
[app.main.data.workspace.tokens.library-edit :as dwtl]
|
|
[app.main.data.workspace.undo :as dwu]
|
|
[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]
|
|
[frontend-tests.tokens.helpers.tokens :as toht]))
|
|
|
|
(t/use-fixtures :each
|
|
{:before thp/reset-idmap!})
|
|
|
|
(defn setup-file []
|
|
(cthf/sample-file :file-1 :page-label :page-1))
|
|
|
|
(defn setup-file-with-token-lib
|
|
[]
|
|
(ctho/sample-file-with-tokens
|
|
:file-id :file-1
|
|
:page-label :page-1
|
|
:lib-fn #(ctob/add-set % (ctob/make-token-set :id (cthi/new-id! :test-token-set)
|
|
:name "Set A"))
|
|
:status-fn #(ctos/set-tokens-status % #{} #{(cthi/id :test-token-set)})))
|
|
|
|
(defn setup-file-with-token-lib-and-theme
|
|
[theme-id]
|
|
(ctho/sample-file-with-tokens
|
|
:file-id :file-1
|
|
:page-label :page-1
|
|
:lib-fn #(-> %
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :test-token-set)
|
|
:name "Set A"))
|
|
(ctob/add-theme (ctob/make-token-theme :id theme-id
|
|
:name "Theme A"
|
|
:group "default")))
|
|
:status-fn #(ctos/set-tokens-status % #{theme-id} #{(cthi/id :test-token-set)})))
|
|
|
|
(defn setup-file-with-token-lib-and-token
|
|
[]
|
|
(ctho/sample-file-with-tokens
|
|
:file-id :file-1
|
|
:page-label :page-1
|
|
:lib-fn #(-> %
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :test-token-set)
|
|
:name "Set A"))
|
|
(ctob/add-token (cthi/id :test-token-set)
|
|
(ctob/make-token :id (cthi/new-id! :color.primary)
|
|
:name "color.primary"
|
|
:type :color
|
|
:value "#000000")))
|
|
:status-fn #(ctos/set-tokens-status % #{} #{(cthi/id :test-token-set)})))
|
|
|
|
(t/deftest add-set
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/create-token-set (ctob/make-token-set :name "Set B"))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')
|
|
sets' (ctob/get-sets tokens-lib')
|
|
set-b' (ctob/get-set-by-name tokens-lib' "Set B")]
|
|
|
|
(t/testing "Token lib contains two sets"
|
|
(t/is (= (count sets') 2))
|
|
(t/is (some? set-b')))))))))
|
|
|
|
(t/deftest add-set-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/create-token-set (ctob/make-token-set :name "Set A"))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest rename-set
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib)
|
|
store (ths/setup-store file)
|
|
tokens-lib (toht/get-tokens-lib file)
|
|
set-a (ctob/get-set-by-name tokens-lib "Set A")
|
|
events [(dwtl/rename-token-set set-a "Set A updated")]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')
|
|
sets' (ctob/get-sets tokens-lib')
|
|
set-a' (ctob/get-set-by-name tokens-lib' "Set A updated")]
|
|
|
|
(t/testing "Set has been renamed"
|
|
(t/is (= (count sets') 1))
|
|
(t/is (some? set-a')))))))))
|
|
|
|
(t/deftest rename-set-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
set-a (ctob/make-token-set :name "Set A")
|
|
events [(dwtl/rename-token-set set-a "Set A updated")]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest duplicate-set
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/duplicate-token-set (cthi/id :test-token-set))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
token-lib (toht/get-tokens-lib file')
|
|
sets (ctob/get-sets token-lib)]
|
|
|
|
(t/testing "Token lib contains two sets"
|
|
(t/is (= (count sets) 2)))))))))
|
|
|
|
(t/deftest duplicate-non-exist-set
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/duplicate-token-set (uuid/next))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
token-lib (toht/get-tokens-lib file')
|
|
sets (ctob/get-sets token-lib)]
|
|
|
|
(t/testing "Token lib contains one set"
|
|
(t/is (= (count sets) 1)))))))))
|
|
|
|
(t/deftest duplicate-set-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/duplicate-token-set (uuid/next))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest delete-set
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/delete-token-set (cthi/id :test-token-set))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')
|
|
sets' (ctob/get-sets tokens-lib')]
|
|
|
|
(t/testing "Set has been deleted"
|
|
(t/is (= (count sets') 0)))))))))
|
|
|
|
(t/deftest delete-set-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/delete-token-set (uuid/next))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest set-tokens-source
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib)
|
|
store (ths/setup-store file)
|
|
library-id (uuid/next)]
|
|
|
|
;; Phase 1: set tokens-source with undo watcher active
|
|
(tohs/run-store
|
|
store identity
|
|
[(tohs/watch-undo-stack)
|
|
(dwtl/set-tokens-source library-id)]
|
|
(fn [new-state]
|
|
(let [file-data' (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "tokens-source is set to the library id"
|
|
(t/is (= library-id (:tokens-source file-data'))))))
|
|
(tohs/stop-on ::dwtl/set-tokens-source))
|
|
|
|
;; Phase 2: undo and verify restoration
|
|
(tohs/run-store
|
|
store done
|
|
[dwu/undo]
|
|
(fn [undone-state]
|
|
(let [file-data'' (-> (ths/get-file-from-state undone-state) :data)]
|
|
(t/testing "tokens-source is restored to nil"
|
|
(t/is (nil? (:tokens-source file-data''))))))
|
|
(tohs/stop-on ::dwu/undo)))))
|
|
|
|
(t/deftest set-tokens-source-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
library-id (uuid/next)]
|
|
|
|
(tohs/run-store-async
|
|
store done
|
|
[(dwtl/set-tokens-source library-id)]
|
|
(fn [new-state]
|
|
(let [file-data' (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "tokens-source is set even without tokens-lib"
|
|
(t/is (= library-id (:tokens-source file-data'))))))))))
|
|
|
|
;; ==========================================================================
|
|
;; Token Themes
|
|
;; ==========================================================================
|
|
|
|
(t/deftest create-token-theme
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib)
|
|
store (ths/setup-store file)
|
|
theme-id (uuid/next)
|
|
events [(dwtl/create-token-theme (ctob/make-token-theme :id theme-id
|
|
:name "Theme B"
|
|
:group "default"))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')
|
|
theme' (ctob/get-theme tokens-lib' theme-id)]
|
|
|
|
(t/testing "Theme has been created"
|
|
(t/is (some? theme'))
|
|
(t/is (= "Theme B" (:name theme'))))))))))
|
|
|
|
(t/deftest create-token-theme-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
theme-id (uuid/next)
|
|
events [(dwtl/create-token-theme (ctob/make-token-theme :id theme-id
|
|
:name "Theme A"
|
|
:group "default"))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest update-token-theme
|
|
(t/async
|
|
done
|
|
(let [theme-id (uuid/next)
|
|
file (setup-file-with-token-lib-and-theme theme-id)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/update-token-theme theme-id
|
|
(ctob/make-token-theme :id theme-id
|
|
:name "Theme A renamed"
|
|
:group "default"))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')
|
|
theme' (ctob/get-theme tokens-lib' theme-id)]
|
|
|
|
(t/testing "Theme has been renamed"
|
|
(t/is (= "Theme A renamed" (:name theme'))))))))))
|
|
|
|
(t/deftest update-token-theme-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
theme-id (uuid/next)
|
|
events [(dwtl/update-token-theme theme-id
|
|
(ctob/make-token-theme :id theme-id
|
|
:name "Theme A"
|
|
:group "default"))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest set-token-theme-active
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib)
|
|
store (ths/setup-store file)
|
|
theme-id (uuid/next)
|
|
events [(dwtl/create-token-theme (ctob/make-token-theme :id theme-id
|
|
:name "Theme B"
|
|
:group "default"))
|
|
(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)
|
|
tokens-status (ctho/get-tokens-status file')]
|
|
|
|
(t/testing "Theme has been activated"
|
|
(t/is (ctos/theme-active? tokens-status theme-id)))))))))
|
|
|
|
(t/deftest set-token-theme-active-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
theme-id (uuid/next)
|
|
events [(dwtl/set-token-theme-active theme-id true)]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest toggle-token-theme-active
|
|
(t/async
|
|
done
|
|
(let [theme-id (uuid/next)
|
|
file (setup-file-with-token-lib-and-theme theme-id)
|
|
store (ths/setup-store file)
|
|
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)
|
|
tokens-status (ctho/get-tokens-status file')]
|
|
|
|
(t/testing "Theme has been deactivated"
|
|
(t/is (not (ctos/theme-active? tokens-status theme-id))))))))))
|
|
|
|
(t/deftest toggle-token-theme-active-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
theme-id (uuid/next)
|
|
events [(dwtl/toggle-token-theme-active theme-id)]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest delete-token-theme
|
|
(t/async
|
|
done
|
|
(let [theme-id (uuid/next)
|
|
file (setup-file-with-token-lib-and-theme theme-id)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/delete-token-theme theme-id)]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')
|
|
theme' (ctob/get-theme tokens-lib' theme-id)]
|
|
|
|
(t/testing "Theme has been deleted"
|
|
(t/is (nil? theme')))))))))
|
|
|
|
(t/deftest delete-token-theme-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
theme-id (uuid/next)
|
|
events [(dwtl/delete-token-theme theme-id)]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
;; ==========================================================================
|
|
;; Token Set Operations
|
|
;; ==========================================================================
|
|
|
|
(t/deftest set-enabled-token-set
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/set-enabled-token-set (cthi/id :test-token-set) true)]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-status (ctho/get-tokens-status file')]
|
|
|
|
(t/testing "Set has been enabled"
|
|
(t/is (ctos/set-active? tokens-status (cthi/id :test-token-set))))))))))
|
|
|
|
(t/deftest set-enabled-token-set-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/set-enabled-token-set (uuid/next) true)]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest toggle-token-set
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/toggle-token-set (cthi/id :test-token-set))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-status (ctho/get-tokens-status file')]
|
|
|
|
(t/testing "Set has been toggled (deactivated)"
|
|
(t/is (not (ctos/set-active? tokens-status (cthi/id :test-token-set)))))))))))
|
|
|
|
(t/deftest toggle-token-set-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/toggle-token-set (uuid/next))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest toggle-token-set-group
|
|
(t/async
|
|
done
|
|
(let [file (ctho/sample-file-with-tokens
|
|
:file-id :file-1
|
|
:page-label :page-1
|
|
:lib-fn #(-> %
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :set-a)
|
|
:name "group/set-a"))
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :set-b)
|
|
:name "group/set-b")))
|
|
:status-fn #(ctos/set-tokens-status % #{} #{}))
|
|
store (ths/setup-store file)
|
|
events [(dwtl/toggle-token-set-group ["group"])]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-status (ctho/get-tokens-status file')]
|
|
|
|
(t/testing "Set group has been toggled (activated)"
|
|
(t/is (ctos/set-active? tokens-status (cthi/id :set-a)))
|
|
(t/is (ctos/set-active? tokens-status (cthi/id :set-b))))))))))
|
|
|
|
(t/deftest toggle-token-set-group-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/toggle-token-set-group ["group"])]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest delete-token-set-group
|
|
(t/async
|
|
done
|
|
(let [file (ctho/sample-file-with-tokens
|
|
:file-id :file-1
|
|
:page-label :page-1
|
|
:lib-fn #(-> %
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :set-a)
|
|
:name "group/set-a"))
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :set-b)
|
|
:name "group/set-b"))
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :set-c)
|
|
:name "other/set-c"))))
|
|
store (ths/setup-store file)
|
|
events [(dwtl/delete-token-set-group ["group"])]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')]
|
|
|
|
(t/testing "Group sets deleted, other set remains"
|
|
(t/is (nil? (ctob/get-set-by-name tokens-lib' "group/set-a")))
|
|
(t/is (nil? (ctob/get-set-by-name tokens-lib' "group/set-b")))
|
|
(t/is (some? (ctob/get-set-by-name tokens-lib' "other/set-c"))))))))))
|
|
|
|
(t/deftest delete-token-set-group-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/delete-token-set-group ["group"])]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest rename-token-set-group
|
|
(t/async
|
|
done
|
|
(let [file (ctho/sample-file-with-tokens
|
|
:file-id :file-1
|
|
:page-label :page-1
|
|
:lib-fn #(ctob/add-set % (ctob/make-token-set :id (cthi/new-id! :set-a)
|
|
:name "old-group/set-a")))
|
|
store (ths/setup-store file)
|
|
events [(dwtl/rename-token-set-group ["old-group"] "new-group")]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')]
|
|
|
|
(t/testing "Set group has been renamed"
|
|
(t/is (some? (ctob/get-set-by-name tokens-lib' "new-group/set-a")))
|
|
(t/is (nil? (ctob/get-set-by-name tokens-lib' "old-group/set-a"))))))))))
|
|
|
|
(t/deftest rename-token-set-group-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/rename-token-set-group ["old-group"] "new-group")]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
;; ==========================================================================
|
|
;; Drop Operations
|
|
;; ==========================================================================
|
|
|
|
(t/deftest drop-token-set-group
|
|
(t/async
|
|
done
|
|
(let [file (ctho/sample-file-with-tokens
|
|
:file-id :file-1
|
|
:page-label :page-1
|
|
:lib-fn #(-> %
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :set-a)
|
|
:name "foo/foo"))
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :set-b)
|
|
:name "bar/bar"))
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :set-c)
|
|
:name "baz/baz"))))
|
|
store (ths/setup-store file)
|
|
events [(dwtl/drop-token-set-group {:from-index 2
|
|
:to-index 0
|
|
:position :top})]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')
|
|
sets' (ctob/get-set-names tokens-lib')]
|
|
|
|
(t/testing "Set groups have been reordered"
|
|
(t/is (= ["bar/bar" "foo/foo" "baz/baz"] (vec sets'))))))))))
|
|
|
|
(t/deftest drop-token-set-group-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/drop-token-set-group {:from-index 0
|
|
:to-index 1
|
|
:position :top})]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest drop-token-set
|
|
(t/async
|
|
done
|
|
(let [file (ctho/sample-file-with-tokens
|
|
:file-id :file-1
|
|
:page-label :page-1
|
|
:lib-fn #(-> %
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :set-a)
|
|
:name "foo"))
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :set-b)
|
|
:name "bar"))
|
|
(ctob/add-set (ctob/make-token-set :id (cthi/new-id! :set-c)
|
|
:name "baz"))))
|
|
store (ths/setup-store file)
|
|
events [(dwtl/drop-token-set {:from-index 0
|
|
:to-index 2
|
|
:position :bot})]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')
|
|
sets' (ctob/get-set-names tokens-lib')]
|
|
|
|
(t/testing "Token sets have been reordered"
|
|
(t/is (= ["bar" "baz" "foo"] (vec sets'))))))))))
|
|
|
|
(t/deftest drop-token-set-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/drop-token-set {:from-index 0
|
|
:to-index 1
|
|
:position :top})]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
;; ==========================================================================
|
|
;; Token CRUD
|
|
;; ==========================================================================
|
|
|
|
(t/deftest create-token-in-set
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib)
|
|
store (ths/setup-store file)
|
|
token-id (cthi/new-id! :color.primary)
|
|
events [(dwtl/create-token (cthi/id :test-token-set)
|
|
(ctob/make-token :id token-id
|
|
:name "color.primary"
|
|
:type :color
|
|
:value "#000000"))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')
|
|
token (ctob/get-token tokens-lib' (cthi/id :test-token-set)
|
|
(cthi/id :color.primary))]
|
|
|
|
(t/testing "Token has been created in set"
|
|
(t/is (some? token)))))))))
|
|
|
|
(t/deftest create-token-no-set
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
token-id (cthi/new-id! :color.primary)
|
|
events [(dwtl/create-token (ctob/make-token :id token-id
|
|
:name "color.primary"
|
|
:type :color
|
|
:value "#000000"))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')]
|
|
|
|
(t/testing "Global set has been created with the token"
|
|
(t/is (some? tokens-lib'))
|
|
(t/is (some? (ctob/get-set-by-name tokens-lib' "Global"))))))))))
|
|
|
|
(t/deftest update-token
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib-and-token)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/update-token (cthi/id :test-token-set)
|
|
(cthi/id :color.primary)
|
|
{:value "#ffffff"
|
|
:name "color.primary.updated"})]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')
|
|
token' (ctob/get-token tokens-lib' (cthi/id :test-token-set)
|
|
(cthi/id :color.primary))]
|
|
|
|
(t/testing "Token has been updated"
|
|
(t/is (= "color.primary.updated" (:name token')))
|
|
(t/is (= "#ffffff" (:value token'))))))))))
|
|
|
|
(t/deftest update-token-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/update-token (uuid/next) (uuid/next) {:value "#ffffff"})]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest delete-token
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib-and-token)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/delete-token (cthi/id :test-token-set)
|
|
(cthi/id :color.primary))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')
|
|
token' (ctob/get-token tokens-lib' (cthi/id :test-token-set)
|
|
(cthi/id :color.primary))]
|
|
|
|
(t/testing "Token has been deleted"
|
|
(t/is (nil? token')))))))))
|
|
|
|
(t/deftest delete-token-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/delete-token (uuid/next) (uuid/next))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
(t/deftest duplicate-token
|
|
(t/async
|
|
done
|
|
(let [file (setup-file-with-token-lib-and-token)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/set-selected-token-set-id (cthi/id :test-token-set))
|
|
(dwtl/duplicate-token (cthi/id :color.primary))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')
|
|
tokens (ctob/get-tokens tokens-lib' (cthi/id :test-token-set))]
|
|
|
|
(t/testing "Token has been duplicated"
|
|
(t/is (= 2 (count tokens))))))))))
|
|
|
|
(t/deftest duplicate-token-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
events [(dwtl/duplicate-token (uuid/next))]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file-data (-> (ths/get-file-from-state new-state) :data)]
|
|
(t/testing "No crash when file has no tokens-lib"
|
|
(t/is (some? file-data)))))))))
|
|
|
|
;; ==========================================================================
|
|
;; Import Tokens Lib
|
|
;; ==========================================================================
|
|
|
|
(t/deftest import-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
new-lib (-> (ctob/make-tokens-lib)
|
|
(ctob/add-set (ctob/make-token-set :name "Imported Set")))
|
|
events [(dwtl/import-tokens-lib new-lib)]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')]
|
|
|
|
(t/testing "Tokens lib has been imported"
|
|
(t/is (some? tokens-lib'))
|
|
(t/is (some? (ctob/get-set-by-name tokens-lib' "Imported Set"))))))))))
|
|
|
|
(t/deftest import-tokens-lib-no-tokens-lib
|
|
(t/async
|
|
done
|
|
(let [file (setup-file)
|
|
store (ths/setup-store file)
|
|
new-lib (-> (ctob/make-tokens-lib)
|
|
(ctob/add-set (ctob/make-token-set :name "Imported Set")))
|
|
events [(dwtl/import-tokens-lib new-lib)]]
|
|
|
|
(tohs/run-store-async
|
|
store done events
|
|
(fn [new-state]
|
|
(let [file' (ths/get-file-from-state new-state)
|
|
tokens-lib' (toht/get-tokens-lib file')]
|
|
(t/testing "Tokens lib has been imported into file without existing lib"
|
|
(t/is (some? tokens-lib'))
|
|
(t/is (some? (ctob/get-set-by-name tokens-lib' "Imported Set"))))))))))
|