;; Copyright 2016 Mozilla ;; ;; Licensed under the Apache License, Version 2.0 (the "License"); you may not use ;; this file except in compliance with the License. You may obtain a copy of the ;; License at http://www.apache.org/licenses/LICENSE-2.0 ;; Unless required by applicable law or agreed to in writing, software distributed ;; under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR ;; CONDITIONS OF ANY KIND, either express or implied. See the License for the ;; specific language governing permissions and limitations under the License. (ns datomish.db-test #?(:cljs (:require-macros [datomish.pair-chan :refer [go-pair = !]]]) #?@(:cljs [[datomish.js-sqlite] [datomish.pair-chan] [datomish.test-macros :refer-macros [deftest-async deftest-db]] [datomish.node-tempfile :refer [tempfile]] [cljs.test :as t :refer-macros [is are deftest testing async]] [cljs.core.async :as a :refer [!]]])) #?(:clj (:import [clojure.lang ExceptionInfo])) #?(:clj (:import [datascript.db DB]))) #?(:cljs (def Throwable js/Error)) (defn- tempids [tx] (into {} (map (juxt (comp :idx first) second) (:tempids tx)))) (def test-schema [{:db/id (d/id-literal :db.part/user) :db/ident :x :db/unique :db.unique/identity :db/valueType :db.type/long :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :name :db/unique :db.unique/identity :db/valueType :db.type/string :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :y :db/cardinality :db.cardinality/many :db/valueType :db.type/long :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :aka :db/cardinality :db.cardinality/many :db/valueType :db.type/string :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :age :db/valueType :db.type/long :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :email :db/unique :db.unique/identity :db/valueType :db.type/string :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :spouse :db/unique :db.unique/value :db/valueType :db.type/string :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :friends :db/cardinality :db.cardinality/many :db/valueType :db.type/ref :db.install/_attribute :db.part/db} ]) (deftest-db test-add-one conn (let [{tx0 :tx} ( (get (tempids tx0) -1) 1000)) (is (> (get (tempids tx0) -1) 1000)) ;; This time, we can resolve both, but we have to try -1, succeed, and then resolve -2. (let [tx1 (schema in)) expected))))) (deftest-db test-lookup-refs conn (let [{tx0 :tx} (= (d/db conn) tx1)))))) (testing "Looks up value refs" (let [{tx :tx} (= (d/db conn) tx)))))) (testing "Looks up entity refs in maps" (let [{tx :tx} (= (d/db conn) tx)))))) (testing "Looks up value refs in maps" (let [{tx :tx} (= (d/db conn) tx)))))) (testing "Looks up value refs in sequences in maps" (let [{tx :tx} (= (d/db conn) tx)))))) (testing "Looks up refs when there are more than 999 refs (all present)" (let [bound (* 999 2) make-add #(vector :db/add (+ 1000 %) :name (str "Ivan-" %)) make-ref #(-> {:db/id (d/lookup-ref :name (str "Ivan-" %)) :email (str "Ivan-" % "@" %)}) {tx-data1 :tx-data} (= (d/db conn) tx)))))) (testing "Fails for missing fulltext entities" (is (thrown-with-msg? ExceptionInfo #"No entity found for lookup-ref" (