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"))))))))))