0 Transacting: EDN test format
Jordan Santell edited this page 2017-02-10 16:31:46 -08:00

The Rust and Clojure{Script} implementations of Mentat share part of their test suites. Tests in this suite are text files in EDN format that label what is being tested, represent assertions to apply to a bootstrapped store, and capture expectations of what parts of the store should look like after the assertions are transacted.

Format

The top-level element should be a vector of transactions. Each transaction should be a map with the following required keys:

key type description example
:test/label string a brief description of what the transaction is testing ":db/add ignores existing datoms"
:test/assertions vector valid Mentat transaction data [[:db/add E A V]]

and at least one of the following optional keys:

key type description example
:test/expected-transaction set transacted datoms, w/ added #{[?tx1 :db/txInstant ?ms1 ?tx1 true]}
:test/expected-datoms set all datoms after bootstrap, w/o :db/txInstant datoms #{[E A V ?tx1]}

Special values

Transaction identifiers are replaced with ?txN, where N counts the transaction number after the initial bootstrap transaction. Therefore, the first tested transaction is ?tx1, the next ?tx2, and so on. Transaction timestamps are replaced with ?mxN, where N is as above.

Therefore every expected transaction should include a datom like:

[?txN :db/txInstant ?msN ?txN true]

Example

;; This is EDN, so comments are allowed.
[{:test/label "can insert two :db.cardinality/one datoms"
  :test/assertions
  [[:db/add 100 :db/ident :keyword/value1]
   [:db/add 101 :db/ident :keyword/value2]]
  :test/expected-transaction
  #{[100 :db/ident :keyword/value1 ?tx1 true]
    [101 :db/ident :keyword/value2 ?tx1 true]
    [?tx1 :db/txInstant ?ms1 ?tx1 true]}
  :test/expected-datoms
  #{[100 :db/ident :keyword/value1]
    [101 :db/ident :keyword/value2]}}]