penpot/frontend/test/frontend_tests/plugins/value_objects_test.cljs
Alonso Torres 7655f854a4
Improved api test suite (#10533)
* 🐛 Fix plugins api issues

* 🐛 Fix problem with text weight

* 🐛 Fix api problems

*  Updated plugins test suite

* 🐛 Referential integrity tests

*  Add resetOverrides method

* 🐛 Fix plugins components structure poluting
2026-07-07 16:12:12 +02:00

112 lines
4.7 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 INC Sucursal en España SL
;; Value-object proxies (shadows, exports, grid tracks) returned by the Plugin
;; API. `format-shadows`, `format-exports` and `format-tracks` hand back live
;; proxies whose member setters persist back to the located shape. Each test
;; mutates a member on the returned proxy and reads the value back through a
;; fresh proxy from the live store, so a detached-snapshot regression fails.
(ns frontend-tests.plugins.value-objects-test
(:require
[app.common.test-helpers.files :as cthf]
[app.main.store :as st]
[app.plugins.api :as api]
[cljs.test :as t :include-macros true]
[frontend-tests.helpers.state :as ths]
[frontend-tests.helpers.wasm :as thw]
[potok.v2.core :as ptk]))
(def ^:private plugin-id "00000000-0000-0000-0000-000000000000")
(defn- setup-context []
(let [store (ths/setup-store (cthf/sample-file :file1 :page-label :page1))
_ (set! st/state store)
_ (set! st/stream (ptk/input-stream store))
context (api/create-context plugin-id)]
{:store store :context context}))
;; ---------------------------------------------------------------------------
;; Shadows
;; ---------------------------------------------------------------------------
(t/deftest shadow-proxy-member-setters-persist-to-the-shape
(thw/with-wasm-mocks*
(fn []
(let [{:keys [context]} (setup-context)
^js rect (.createRectangle ^js context)]
(set! (.-shadows rect)
#js [#js {:style "drop-shadow"
:offsetX 1 :offsetY 1 :blur 2 :spread 0 :hidden false
:color #js {:color "#000000" :opacity 1}}])
(let [^js shadow (aget (.-shadows rect) 0)]
(set! (.-style shadow) "inner-shadow")
(set! (.-offsetX shadow) 5)
(set! (.-offsetY shadow) 6)
(set! (.-blur shadow) 7)
(set! (.-spread shadow) 2)
(set! (.-hidden shadow) true))
(let [^js persisted (aget (.-shadows rect) 0)]
(t/is (= "inner-shadow" (.-style persisted)))
(t/is (= 5 (.-offsetX persisted)))
(t/is (= 6 (.-offsetY persisted)))
(t/is (= 7 (.-blur persisted)))
(t/is (= 2 (.-spread persisted)))
(t/is (= true (.-hidden persisted))))))))
;; ---------------------------------------------------------------------------
;; Exports
;; ---------------------------------------------------------------------------
(t/deftest export-proxy-member-setters-persist-to-the-shape
(thw/with-wasm-mocks*
(fn []
(let [{:keys [context]} (setup-context)
^js rect (.createRectangle ^js context)]
(set! (.-exports rect)
#js [#js {:type "png" :scale 1 :suffix "" :skipChildren false}])
(let [^js export (aget (.-exports rect) 0)]
(set! (.-type export) "jpeg")
(set! (.-scale export) 2)
(set! (.-suffix export) "@2x")
(set! (.-skipChildren export) true))
(let [^js persisted (aget (.-exports rect) 0)]
(t/is (= "jpeg" (.-type persisted)))
(t/is (= 2 (.-scale persisted)))
(t/is (= "@2x" (.-suffix persisted)))
(t/is (= true (.-skipChildren persisted))))))))
;; ---------------------------------------------------------------------------
;; Grid tracks
;; ---------------------------------------------------------------------------
(defn- setup-grid []
(let [{:keys [store context]} (setup-context)
^js board (.createBoard ^js context)
^js grid (.addGridLayout board)]
{:store store :context context :board board :grid grid}))
(t/deftest track-proxy-member-setters-update-the-track
(thw/with-wasm-mocks*
(fn []
(let [{:keys [^js grid]} (setup-grid)]
(.addColumn grid "flex" 1)
(let [^js track (aget (.-columns grid) 0)]
(set! (.-type track) "fixed")
(set! (.-value track) 120))
(let [^js persisted (aget (.-columns grid) 0)]
(t/is (= "fixed" (.-type persisted)))
(t/is (= 120 (.-value persisted))))))))
(t/deftest track-proxy-member-setters-reject-invalid-input
(thw/with-wasm-mocks*
(fn []
(let [{:keys [store ^js grid]} (setup-grid)]
(swap! store assoc-in [:plugins :flags plugin-id :throw-validation-errors] true)
(.addColumn grid "flex" 1)
(let [^js track (aget (.-columns grid) 0)]
(t/is (thrown? js/Error (set! (.-type track) "not-a-track-type")))
(t/is (thrown? js/Error (set! (.-value track) "not-a-number"))))))))