(ns microtables-frontend.storage-test (:require [cljs.test :refer-macros [deftest is]] [microtables-frontend.utils.storage :as storage])) (deftest table-empty-nil-table (is (true? (storage/table-empty? nil)))) (deftest table-empty-blank-values (is (true? (storage/table-empty? {"A" {1 {:value ""} 2 {:value nil}}})))) (deftest table-empty-with-content (is (false? (storage/table-empty? {"A" {1 {:value "42"}}})))) (deftest serialize-round-trip (let [data {"A" {1 {:value "59"} 12 {:value "=A1+3"}}}] (is (= data (storage/deserialize (storage/serialize data)))))) (deftest deserialize-corrupt-returns-nil (is (nil? (storage/deserialize "{:a 1"))) ; unterminated map, e.g. a write truncated by quota (is (nil? (storage/deserialize nil)))) (deftest rename-entry-updates-matching-id (let [index [{:id "a" :name "Old"} {:id "b" :name "Other"}] renamed (storage/rename-entry index "a" "New")] (is (= "New" (:name (first (filter #(= (:id %) "a") renamed))))) (is (= "Other" (:name (first (filter #(= (:id %) "b") renamed))))))) (deftest remove-entry-removes-matching-id (let [index [{:id "a"} {:id "b"}]] (is (= [{:id "b"}] (storage/remove-entry index "a"))))) (deftest sort-by-recency-orders-descending (let [index [{:id "a" :last-opened-at 100} {:id "b" :last-opened-at 300} {:id "c" :last-opened-at 200}]] (is (= ["b" "c" "a"] (map :id (storage/sort-by-recency index)))))) (deftest save-entry-preserves-created-at (let [index [{:id "a" :name "Old" :created-at 50 :last-opened-at 50}] saved (storage/save-entry index "a" "Renamed" 999)] (is (= 50 (:created-at (first saved)))) (is (= 999 (:last-opened-at (first saved)))) (is (= "Renamed" (:name (first saved)))))) (deftest save-entry-creates-new (let [saved (storage/save-entry [] "x" "New Table" 10)] (is (= [{:id "x" :name "New Table" :created-at 10 :last-opened-at 10}] saved))))