datahike-browser-tests 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/.circleci/config.yml +405 -0
  2. package/.circleci/scripts/gen_ci.clj +194 -0
  3. package/.cirrus.yml +60 -0
  4. package/.clj-kondo/babashka/sci/config.edn +1 -0
  5. package/.clj-kondo/babashka/sci/sci/core.clj +9 -0
  6. package/.clj-kondo/config.edn +95 -0
  7. package/.dir-locals.el +2 -0
  8. package/.github/FUNDING.yml +3 -0
  9. package/.github/ISSUE_TEMPLATE/1-bug-report.yml +68 -0
  10. package/.github/ISSUE_TEMPLATE/2-feature-request.yml +28 -0
  11. package/.github/ISSUE_TEMPLATE/config.yml +6 -0
  12. package/.github/pull_request_template.md +24 -0
  13. package/.github/workflows/native-image.yml +84 -0
  14. package/LICENSE +203 -0
  15. package/README.md +273 -0
  16. package/bb/deps.edn +9 -0
  17. package/bb/resources/github-fingerprints +3 -0
  18. package/bb/resources/native-image-tests/run-bb-pod-tests.clj +162 -0
  19. package/bb/resources/native-image-tests/run-libdatahike-tests +12 -0
  20. package/bb/resources/native-image-tests/run-native-image-tests +74 -0
  21. package/bb/resources/native-image-tests/run-python-tests +22 -0
  22. package/bb/resources/native-image-tests/testconfig.attr-refs.edn +6 -0
  23. package/bb/resources/native-image-tests/testconfig.edn +5 -0
  24. package/bb/resources/template/.settings/org.eclipse.jdt.apt.core.prefs +2 -0
  25. package/bb/resources/template/.settings/org.eclipse.jdt.core.prefs +9 -0
  26. package/bb/resources/template/.settings/org.eclipse.m2e.core.prefs +4 -0
  27. package/bb/resources/template/pom.xml +22 -0
  28. package/bb/src/tools/build.clj +132 -0
  29. package/bb/src/tools/clj_kondo.clj +32 -0
  30. package/bb/src/tools/deploy.clj +26 -0
  31. package/bb/src/tools/examples.clj +19 -0
  32. package/bb/src/tools/npm.clj +100 -0
  33. package/bb/src/tools/python.clj +14 -0
  34. package/bb/src/tools/release.clj +94 -0
  35. package/bb/src/tools/test.clj +148 -0
  36. package/bb/src/tools/version.clj +47 -0
  37. package/bb.edn +269 -0
  38. package/benchmark/src/benchmark/cli.clj +195 -0
  39. package/benchmark/src/benchmark/compare.clj +157 -0
  40. package/benchmark/src/benchmark/config.clj +316 -0
  41. package/benchmark/src/benchmark/measure.clj +187 -0
  42. package/benchmark/src/benchmark/store.clj +190 -0
  43. package/benchmark/test/benchmark/measure_test.clj +156 -0
  44. package/build.clj +30 -0
  45. package/config.edn +49 -0
  46. package/deps.edn +138 -0
  47. package/dev/sandbox.clj +82 -0
  48. package/dev/sandbox.cljs +127 -0
  49. package/dev/sandbox_benchmarks.clj +27 -0
  50. package/dev/sandbox_client.clj +87 -0
  51. package/dev/sandbox_transact_bench.clj +109 -0
  52. package/dev/user.clj +79 -0
  53. package/doc/README.md +96 -0
  54. package/doc/adl/README.md +6 -0
  55. package/doc/adl/adr-000-adr.org +28 -0
  56. package/doc/adl/adr-001-attribute-references.org +15 -0
  57. package/doc/adl/adr-002-build-tooling.org +54 -0
  58. package/doc/adl/adr-003-db-meta-data.md +52 -0
  59. package/doc/adl/adr-004-github-flow.md +40 -0
  60. package/doc/adl/adr-XYZ-template.md +30 -0
  61. package/doc/adl/index.org +3 -0
  62. package/doc/assets/datahike-logo.svg +3 -0
  63. package/doc/assets/datahiking-invoice.org +85 -0
  64. package/doc/assets/hhtree2.png +0 -0
  65. package/doc/assets/network_topology.svg +624 -0
  66. package/doc/assets/perf.png +0 -0
  67. package/doc/assets/schema_mindmap.mm +132 -0
  68. package/doc/assets/schema_mindmap.svg +970 -0
  69. package/doc/assets/temporal_index.mm +74 -0
  70. package/doc/backend-development.md +78 -0
  71. package/doc/bb-pod.md +89 -0
  72. package/doc/benchmarking.md +360 -0
  73. package/doc/bindings/edn-conversion.md +383 -0
  74. package/doc/cli.md +162 -0
  75. package/doc/cljdoc.edn +27 -0
  76. package/doc/cljs-support.md +133 -0
  77. package/doc/config.md +406 -0
  78. package/doc/contributing.md +114 -0
  79. package/doc/datalog-vs-sql.md +210 -0
  80. package/doc/datomic_differences.md +109 -0
  81. package/doc/development/pull-api-ns.md +186 -0
  82. package/doc/development/pull-frame-state-diagram.jpg +0 -0
  83. package/doc/distributed.md +566 -0
  84. package/doc/entity_spec.md +92 -0
  85. package/doc/gc.md +273 -0
  86. package/doc/java-api.md +808 -0
  87. package/doc/javascript-api.md +421 -0
  88. package/doc/libdatahike.md +86 -0
  89. package/doc/logging_and_error_handling.md +43 -0
  90. package/doc/norms.md +66 -0
  91. package/doc/schema-migration.md +85 -0
  92. package/doc/schema.md +287 -0
  93. package/doc/storage-backends.md +363 -0
  94. package/doc/store-id-refactoring.md +596 -0
  95. package/doc/time_variance.md +325 -0
  96. package/doc/unstructured.md +167 -0
  97. package/doc/versioning.md +261 -0
  98. package/examples/basic/README.md +19 -0
  99. package/examples/basic/deps.edn +6 -0
  100. package/examples/basic/docker-compose.yml +13 -0
  101. package/examples/basic/src/examples/core.clj +60 -0
  102. package/examples/basic/src/examples/schema.clj +155 -0
  103. package/examples/basic/src/examples/store.clj +60 -0
  104. package/examples/basic/src/examples/time_travel.clj +185 -0
  105. package/examples/java/.settings/org.eclipse.core.resources.prefs +3 -0
  106. package/examples/java/.settings/org.eclipse.jdt.apt.core.prefs +2 -0
  107. package/examples/java/.settings/org.eclipse.jdt.core.prefs +9 -0
  108. package/examples/java/.settings/org.eclipse.m2e.core.prefs +4 -0
  109. package/examples/java/README.md +162 -0
  110. package/examples/java/pom.xml +62 -0
  111. package/examples/java/src/main/java/examples/QuickStart.java +115 -0
  112. package/examples/java/src/main/java/examples/SchemaExample.java +148 -0
  113. package/examples/java/src/main/java/examples/TimeTravelExample.java +121 -0
  114. package/flake.lock +27 -0
  115. package/flake.nix +27 -0
  116. package/http-server/datahike/http/middleware.clj +75 -0
  117. package/http-server/datahike/http/server.clj +269 -0
  118. package/java/src/datahike/java/Database.java +274 -0
  119. package/java/src/datahike/java/Datahike.java +281 -0
  120. package/java/src/datahike/java/DatahikeGeneratedTest.java +349 -0
  121. package/java/src/datahike/java/DatahikeTest.java +370 -0
  122. package/java/src/datahike/java/EDN.java +170 -0
  123. package/java/src/datahike/java/IEntity.java +11 -0
  124. package/java/src/datahike/java/Keywords.java +161 -0
  125. package/java/src/datahike/java/SchemaFlexibility.java +52 -0
  126. package/java/src/datahike/java/Util.java +219 -0
  127. package/karma.conf.js +19 -0
  128. package/libdatahike/compile-cpp +7 -0
  129. package/libdatahike/src/datahike/impl/LibDatahikeBase.java +203 -0
  130. package/libdatahike/src/datahike/impl/libdatahike.clj +59 -0
  131. package/libdatahike/src/test_cpp.cpp +61 -0
  132. package/npm-package/PUBLISHING.md +140 -0
  133. package/npm-package/README.md +226 -0
  134. package/npm-package/package.template.json +34 -0
  135. package/npm-package/test-isomorphic.ts +281 -0
  136. package/npm-package/test.js +557 -0
  137. package/npm-package/typescript-test.ts +70 -0
  138. package/package.json +16 -0
  139. package/pydatahike/README.md +569 -0
  140. package/pydatahike/pyproject.toml +91 -0
  141. package/pydatahike/setup.py +42 -0
  142. package/pydatahike/src/datahike/__init__.py +134 -0
  143. package/pydatahike/src/datahike/_native.py +250 -0
  144. package/pydatahike/src/datahike/_version.py +2 -0
  145. package/pydatahike/src/datahike/database.py +722 -0
  146. package/pydatahike/src/datahike/edn.py +311 -0
  147. package/pydatahike/src/datahike/py.typed +0 -0
  148. package/pydatahike/tests/conftest.py +17 -0
  149. package/pydatahike/tests/test_basic.py +170 -0
  150. package/pydatahike/tests/test_database.py +51 -0
  151. package/pydatahike/tests/test_edn_conversion.py +299 -0
  152. package/pydatahike/tests/test_query.py +99 -0
  153. package/pydatahike/tests/test_schema.py +55 -0
  154. package/resources/clj-kondo.exports/io.replikativ/datahike/config.edn +5 -0
  155. package/resources/example_server.edn +4 -0
  156. package/shadow-cljs.edn +56 -0
  157. package/src/data_readers.clj +7 -0
  158. package/src/datahike/api/impl.cljc +176 -0
  159. package/src/datahike/api/specification.cljc +633 -0
  160. package/src/datahike/api/types.cljc +261 -0
  161. package/src/datahike/api.cljc +41 -0
  162. package/src/datahike/array.cljc +99 -0
  163. package/src/datahike/cli.clj +166 -0
  164. package/src/datahike/cljs.cljs +6 -0
  165. package/src/datahike/codegen/cli.clj +406 -0
  166. package/src/datahike/codegen/clj_kondo.clj +291 -0
  167. package/src/datahike/codegen/java.clj +403 -0
  168. package/src/datahike/codegen/naming.cljc +33 -0
  169. package/src/datahike/codegen/native.clj +559 -0
  170. package/src/datahike/codegen/pod.clj +488 -0
  171. package/src/datahike/codegen/python.clj +838 -0
  172. package/src/datahike/codegen/report.clj +55 -0
  173. package/src/datahike/codegen/typescript.clj +262 -0
  174. package/src/datahike/codegen/validation.clj +145 -0
  175. package/src/datahike/config.cljc +294 -0
  176. package/src/datahike/connections.cljc +16 -0
  177. package/src/datahike/connector.cljc +265 -0
  178. package/src/datahike/constants.cljc +142 -0
  179. package/src/datahike/core.cljc +297 -0
  180. package/src/datahike/datom.cljc +459 -0
  181. package/src/datahike/db/interface.cljc +119 -0
  182. package/src/datahike/db/search.cljc +305 -0
  183. package/src/datahike/db/transaction.cljc +937 -0
  184. package/src/datahike/db/utils.cljc +338 -0
  185. package/src/datahike/db.cljc +956 -0
  186. package/src/datahike/experimental/unstructured.cljc +126 -0
  187. package/src/datahike/experimental/versioning.cljc +172 -0
  188. package/src/datahike/externs.js +31 -0
  189. package/src/datahike/gc.cljc +69 -0
  190. package/src/datahike/http/client.clj +188 -0
  191. package/src/datahike/http/writer.clj +79 -0
  192. package/src/datahike/impl/entity.cljc +218 -0
  193. package/src/datahike/index/interface.cljc +93 -0
  194. package/src/datahike/index/persistent_set.cljc +469 -0
  195. package/src/datahike/index/utils.cljc +44 -0
  196. package/src/datahike/index.cljc +32 -0
  197. package/src/datahike/js/api.cljs +172 -0
  198. package/src/datahike/js/api_macros.clj +22 -0
  199. package/src/datahike/js.cljs +163 -0
  200. package/src/datahike/json.cljc +209 -0
  201. package/src/datahike/lru.cljc +146 -0
  202. package/src/datahike/migrate.clj +39 -0
  203. package/src/datahike/norm/norm.clj +245 -0
  204. package/src/datahike/online_gc.cljc +252 -0
  205. package/src/datahike/pod.clj +155 -0
  206. package/src/datahike/pull_api.cljc +325 -0
  207. package/src/datahike/query.cljc +1945 -0
  208. package/src/datahike/query_stats.cljc +88 -0
  209. package/src/datahike/readers.cljc +62 -0
  210. package/src/datahike/remote.cljc +218 -0
  211. package/src/datahike/schema.cljc +228 -0
  212. package/src/datahike/schema_cache.cljc +42 -0
  213. package/src/datahike/spec.cljc +101 -0
  214. package/src/datahike/store.cljc +80 -0
  215. package/src/datahike/tools.cljc +308 -0
  216. package/src/datahike/transit.cljc +80 -0
  217. package/src/datahike/writer.cljc +239 -0
  218. package/src/datahike/writing.cljc +362 -0
  219. package/src/deps.cljs +1 -0
  220. package/src-hitchhiker-tree/datahike/index/hitchhiker_tree/insert.cljc +76 -0
  221. package/src-hitchhiker-tree/datahike/index/hitchhiker_tree/upsert.cljc +128 -0
  222. package/src-hitchhiker-tree/datahike/index/hitchhiker_tree.cljc +213 -0
  223. package/test/datahike/backward_compatibility_test/src/backward_test.clj +37 -0
  224. package/test/datahike/integration_test/config_record_file_test.clj +14 -0
  225. package/test/datahike/integration_test/config_record_test.clj +14 -0
  226. package/test/datahike/integration_test/depr_config_uri_test.clj +15 -0
  227. package/test/datahike/integration_test/return_map_test.clj +62 -0
  228. package/test/datahike/integration_test.cljc +67 -0
  229. package/test/datahike/norm/norm_test.clj +124 -0
  230. package/test/datahike/norm/resources/naming-and-sorting-test/001-a1-example.edn +5 -0
  231. package/test/datahike/norm/resources/naming-and-sorting-test/002-a2-example.edn +5 -0
  232. package/test/datahike/norm/resources/naming-and-sorting-test/003-tx-fn-test.edn +1 -0
  233. package/test/datahike/norm/resources/naming-and-sorting-test/004-tx-data-and-tx-fn-test.edn +5 -0
  234. package/test/datahike/norm/resources/naming-and-sorting-test/01-transact-basic-characters.edn +2 -0
  235. package/test/datahike/norm/resources/naming-and-sorting-test/02 add occupation.edn +5 -0
  236. package/test/datahike/norm/resources/naming-and-sorting-test/checksums.edn +12 -0
  237. package/test/datahike/norm/resources/simple-test/001-a1-example.edn +5 -0
  238. package/test/datahike/norm/resources/simple-test/002-a2-example.edn +5 -0
  239. package/test/datahike/norm/resources/simple-test/checksums.edn +4 -0
  240. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/001-a1-example.edn +5 -0
  241. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/002-a2-example.edn +5 -0
  242. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/003-tx-fn-test.edn +1 -0
  243. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/checksums.edn +6 -0
  244. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/second/004-tx-data-and-tx-fn-test.edn +5 -0
  245. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/second/checksums.edn +2 -0
  246. package/test/datahike/norm/resources/tx-fn-test/first/001-a1-example.edn +5 -0
  247. package/test/datahike/norm/resources/tx-fn-test/first/002-a2-example.edn +5 -0
  248. package/test/datahike/norm/resources/tx-fn-test/first/checksums.edn +4 -0
  249. package/test/datahike/norm/resources/tx-fn-test/second/003-tx-fn-test.edn +1 -0
  250. package/test/datahike/norm/resources/tx-fn-test/second/checksums.edn +2 -0
  251. package/test/datahike/test/api_test.cljc +895 -0
  252. package/test/datahike/test/array_test.cljc +40 -0
  253. package/test/datahike/test/attribute_refs/datoms_test.cljc +140 -0
  254. package/test/datahike/test/attribute_refs/db_test.cljc +42 -0
  255. package/test/datahike/test/attribute_refs/differences_test.cljc +515 -0
  256. package/test/datahike/test/attribute_refs/entity_test.cljc +89 -0
  257. package/test/datahike/test/attribute_refs/pull_api_test.cljc +320 -0
  258. package/test/datahike/test/attribute_refs/query_find_specs_test.cljc +59 -0
  259. package/test/datahike/test/attribute_refs/query_fns_test.cljc +130 -0
  260. package/test/datahike/test/attribute_refs/query_interop_test.cljc +47 -0
  261. package/test/datahike/test/attribute_refs/query_not_test.cljc +193 -0
  262. package/test/datahike/test/attribute_refs/query_or_test.cljc +137 -0
  263. package/test/datahike/test/attribute_refs/query_pull_test.cljc +156 -0
  264. package/test/datahike/test/attribute_refs/query_rules_test.cljc +176 -0
  265. package/test/datahike/test/attribute_refs/query_test.cljc +241 -0
  266. package/test/datahike/test/attribute_refs/temporal_search.cljc +22 -0
  267. package/test/datahike/test/attribute_refs/transact_test.cljc +220 -0
  268. package/test/datahike/test/attribute_refs/utils.cljc +128 -0
  269. package/test/datahike/test/cache_test.cljc +38 -0
  270. package/test/datahike/test/components_test.cljc +92 -0
  271. package/test/datahike/test/config_test.cljc +158 -0
  272. package/test/datahike/test/core_test.cljc +105 -0
  273. package/test/datahike/test/datom_test.cljc +44 -0
  274. package/test/datahike/test/db_test.cljc +54 -0
  275. package/test/datahike/test/entity_spec_test.cljc +159 -0
  276. package/test/datahike/test/entity_test.cljc +103 -0
  277. package/test/datahike/test/explode_test.cljc +143 -0
  278. package/test/datahike/test/filter_test.cljc +75 -0
  279. package/test/datahike/test/gc_test.cljc +159 -0
  280. package/test/datahike/test/http/server_test.clj +192 -0
  281. package/test/datahike/test/http/writer_test.clj +86 -0
  282. package/test/datahike/test/ident_test.cljc +32 -0
  283. package/test/datahike/test/index_test.cljc +345 -0
  284. package/test/datahike/test/insert.cljc +125 -0
  285. package/test/datahike/test/java_bindings_test.clj +6 -0
  286. package/test/datahike/test/listen_test.cljc +41 -0
  287. package/test/datahike/test/lookup_refs_test.cljc +266 -0
  288. package/test/datahike/test/lru_test.cljc +27 -0
  289. package/test/datahike/test/migrate_test.clj +297 -0
  290. package/test/datahike/test/model/core.cljc +376 -0
  291. package/test/datahike/test/model/invariant.cljc +142 -0
  292. package/test/datahike/test/model/rng.cljc +82 -0
  293. package/test/datahike/test/model_test.clj +217 -0
  294. package/test/datahike/test/nodejs_test.cljs +262 -0
  295. package/test/datahike/test/online_gc_test.cljc +475 -0
  296. package/test/datahike/test/pod_test.clj +369 -0
  297. package/test/datahike/test/pull_api_test.cljc +474 -0
  298. package/test/datahike/test/purge_test.cljc +144 -0
  299. package/test/datahike/test/query_aggregates_test.cljc +101 -0
  300. package/test/datahike/test/query_find_specs_test.cljc +52 -0
  301. package/test/datahike/test/query_fns_test.cljc +523 -0
  302. package/test/datahike/test/query_interop_test.cljc +47 -0
  303. package/test/datahike/test/query_not_test.cljc +189 -0
  304. package/test/datahike/test/query_or_test.cljc +158 -0
  305. package/test/datahike/test/query_pull_test.cljc +147 -0
  306. package/test/datahike/test/query_rules_test.cljc +248 -0
  307. package/test/datahike/test/query_stats_test.cljc +218 -0
  308. package/test/datahike/test/query_test.cljc +984 -0
  309. package/test/datahike/test/schema_test.cljc +424 -0
  310. package/test/datahike/test/specification_test.cljc +30 -0
  311. package/test/datahike/test/store_test.cljc +78 -0
  312. package/test/datahike/test/stress_test.cljc +57 -0
  313. package/test/datahike/test/time_variance_test.cljc +518 -0
  314. package/test/datahike/test/tools_test.clj +134 -0
  315. package/test/datahike/test/transact_test.cljc +518 -0
  316. package/test/datahike/test/tuples_test.cljc +564 -0
  317. package/test/datahike/test/unstructured_test.cljc +291 -0
  318. package/test/datahike/test/upsert_impl_test.cljc +205 -0
  319. package/test/datahike/test/upsert_test.cljc +363 -0
  320. package/test/datahike/test/utils.cljc +110 -0
  321. package/test/datahike/test/validation_test.cljc +48 -0
  322. package/test/datahike/test/versioning_test.cljc +56 -0
  323. package/test/datahike/test.cljc +66 -0
  324. package/tests.edn +24 -0
@@ -0,0 +1,518 @@
1
+ (ns datahike.test.transact-test
2
+ (:require
3
+ #?(:cljs [cljs.test :as t :refer-macros [is are deftest testing]]
4
+ :clj [clojure.test :as t :refer [is are deftest testing]])
5
+ [datahike.api :as d]
6
+ [datahike.db :as db]
7
+ [datahike.datom :as dd]
8
+ [datahike.constants :as const]
9
+ [datahike.tools :as tools]
10
+ [datahike.test.utils :as du]
11
+ [datahike.test.core-test]
12
+ [clojure.spec.alpha :as s]
13
+ [clojure.spec.gen.alpha :as gen]))
14
+
15
+ #?(:cljs (def Throwable js/Error))
16
+
17
+ (deftest test-with
18
+ (let [db (-> (db/empty-db {:aka {:db/cardinality :db.cardinality/many}})
19
+ (d/db-with [[:db/add 1 :name "Ivan"]])
20
+ (d/db-with [[:db/add 1 :name "Petr"]])
21
+ (d/db-with [[:db/add 1 :aka "Devil"]])
22
+ (d/db-with [[:db/add 1 :aka "Tupen"]]))]
23
+
24
+ (is (= (d/q '[:find ?v
25
+ :where [1 :name ?v]] db)
26
+ #{["Petr"]}))
27
+ (is (= (d/q '[:find ?v
28
+ :where [1 :aka ?v]] db)
29
+ #{["Devil"] ["Tupen"]}))
30
+
31
+ (testing "Retract"
32
+ (let [db (-> db
33
+ (d/db-with [[:db/retract 1 :name "Petr"]])
34
+ (d/db-with [[:db/retract 1 :aka "Devil"]]))]
35
+
36
+ (is (= (d/q '[:find ?v
37
+ :where [1 :name ?v]] db)
38
+ #{}))
39
+ (is (= (d/q '[:find ?v
40
+ :where [1 :aka ?v]] db)
41
+ #{["Tupen"]}))
42
+
43
+ (is (= (into {} (d/entity db 1)) {:aka #{"Tupen"}}))))
44
+
45
+ (testing "Cannot retract what's not there"
46
+ (let [db (-> db
47
+ (d/db-with [[:db/retract 1 :name "Ivan"]]))]
48
+ (is (= (d/q '[:find ?v
49
+ :where [1 :name ?v]] db)
50
+ #{["Petr"]})))))
51
+
52
+ (testing "Skipping nils in tx"
53
+ (let [db (-> (db/empty-db)
54
+ (d/db-with [[:db/add 1 :attr 2]
55
+ nil
56
+ [:db/add 3 :attr 4]]))]
57
+ (is (= [[1 :attr 2], [3 :attr 4]]
58
+ (map (juxt :e :a :v) (d/datoms db :eavt)))))))
59
+
60
+ (deftest test-with-datoms
61
+ (testing "keeps tx number"
62
+ (let [db (-> (db/empty-db)
63
+ (d/db-with [(dd/datom 1 :name "Oleg")
64
+ (dd/datom 1 :age 17 (+ 1 const/tx0))
65
+ [:db/add 1 :aka "x" (+ 2 const/tx0)]]))]
66
+ (is (= [[1 :age 17 (+ 1 const/tx0)]
67
+ [1 :aka "x" (+ 2 const/tx0)]
68
+ [1 :name "Oleg" const/tx0]]
69
+ (map (juxt :e :a :v :tx)
70
+ (d/datoms db :eavt))))))
71
+
72
+ (testing "retraction"
73
+ (let [db (-> (db/empty-db)
74
+ (d/db-with [(dd/datom 1 :name "Oleg")
75
+ (dd/datom 1 :age 17)
76
+ (dd/datom 1 :name "Oleg" const/tx0 false)]))]
77
+ (is (= [[1 :age 17 const/tx0]]
78
+ (map (juxt :e :a :v :tx)
79
+ (d/datoms db :eavt)))))))
80
+
81
+ (deftest test-retract-fns
82
+ (let [db (-> (db/empty-db {:aka {:db/cardinality :db.cardinality/many}
83
+ :friend {:db/valueType :db.type/ref}})
84
+ (d/db-with [{:db/id 1, :name "Ivan", :age 15, :aka ["X" "Y" "Z"], :friend 2}
85
+ {:db/id 2, :name "Petr", :age 37}]))]
86
+ (let [db (d/db-with db [[:db.fn/retractEntity 1]])]
87
+ (is (= (d/q '[:find ?a ?v
88
+ :where [1 ?a ?v]] db)
89
+ #{}))
90
+ (is (= (d/q '[:find ?a ?v
91
+ :where [2 ?a ?v]] db)
92
+ #{[:name "Petr"] [:age 37]})))
93
+
94
+ (is (= (d/db-with db [[:db.fn/retractEntity 1]])
95
+ (d/db-with db [[:db/retractEntity 1]])))
96
+
97
+ (testing "Retract entitiy with incoming refs"
98
+ (is (= (d/q '[:find ?e :where [1 :friend ?e]] db)
99
+ #{[2]}))
100
+
101
+ (let [db (d/db-with db [[:db.fn/retractEntity 2]])]
102
+ (is (= (d/q '[:find ?e :where [1 :friend ?e]] db)
103
+ #{}))))
104
+
105
+ (let [db (d/db-with db [[:db.fn/retractAttribute 1 :name]])]
106
+ (is (= (d/q '[:find ?a ?v
107
+ :where [1 ?a ?v]] db)
108
+ #{[:age 15] [:aka "X"] [:aka "Y"] [:aka "Z"] [:friend 2]}))
109
+ (is (= (d/q '[:find ?a ?v
110
+ :where [2 ?a ?v]] db)
111
+ #{[:name "Petr"] [:age 37]})))
112
+
113
+ (let [db (d/db-with db [[:db.fn/retractAttribute 1 :aka]])]
114
+ (is (= (d/q '[:find ?a ?v
115
+ :where [1 ?a ?v]] db)
116
+ #{[:name "Ivan"] [:age 15] [:friend 2]}))
117
+ (is (= (d/q '[:find ?a ?v
118
+ :where [2 ?a ?v]] db)
119
+ #{[:name "Petr"] [:age 37]})))
120
+
121
+ (is (= (d/db-with db [[:db.fn/retractAttribute 1 :name]])
122
+ (d/db-with db [[:db/retract 1 :name]])))
123
+ (is (= (d/db-with db [[:db.fn/retractAttribute 1 :aka]])
124
+ (d/db-with db [[:db/retract 1 :aka]])))))
125
+
126
+ (deftest test-retract-fns-not-found
127
+ (let [db (-> (db/empty-db {:name {:db/unique :db.unique/identity}})
128
+ (d/db-with [[:db/add 1 :name "Ivan"]]))
129
+ all #(vec (d/datoms % :eavt))
130
+ tx0 (inc const/tx0)]
131
+ (are [op] (= [(dd/datom 1 :name "Ivan" tx0)]
132
+ (all (d/db-with db [op])))
133
+ [:db/retract 2 :name "Petr"]
134
+ [:db.fn/retractAttribute 2 :name]
135
+ [:db.fn/retractEntity 2]
136
+ [:db/retractEntity 2]
137
+ [:db/retract [:name "Petr"] :name "Petr"]
138
+ [:db.fn/retractAttribute [:name "Petr"] :name]
139
+ [:db.fn/retractEntity [:name "Petr"]])
140
+
141
+ (are [op] (= [[] []]
142
+ [(all (d/db-with db [op]))
143
+ (all (d/db-with db [op op]))]) ;; idempotency
144
+ [:db/retract 1 :name "Ivan"]
145
+ [:db.fn/retractAttribute 1 :name]
146
+ [:db.fn/retractEntity 1]
147
+ [:db/retractEntity 1]
148
+ [:db/retract [:name "Ivan"] :name "Ivan"]
149
+ [:db.fn/retractAttribute [:name "Ivan"] :name]
150
+ [:db.fn/retractEntity [:name "Ivan"]])))
151
+
152
+ (deftest test-retract-component
153
+ (let [db (-> (db/empty-db {:name {:db/unique :db.unique/identity}
154
+ :room {:db/valueType :db.type/ref
155
+ :db/cardinality :db.cardinality/many
156
+ :db/isComponent true}})
157
+ (d/db-with [{:name :house1 :room [{:name :kitchen} {:name :bath}]}
158
+ {:name :house2 :room [{:name :office} {:name :attic}]}]))
159
+ names (fn [db]
160
+ (set (d/q '[:find [?name ...]
161
+ :where [_ :name ?name]]
162
+ db)))]
163
+
164
+ (is (= (names (d/db-with db [[:db.fn/retractEntity [:name :house1]]]))
165
+ #{:house2 :office :attic}))
166
+
167
+ (testing ":db.fn/retractAttribute retracts components"
168
+ (let [db (d/db-with db [[:db.fn/retractAttribute [:name :house1] :room]])]
169
+ (is (nil? (:room (d/entity db [:name :house1]))))
170
+ (is (= (names db)
171
+ #{:house1 :house2 :office :attic}))))
172
+
173
+ (testing ":db/retract only retracts reference to components"
174
+ (let [db (d/db-with db [[:db/retract [:name :house1] :room [:name :kitchen]]])]
175
+ (is (= (map :name (:room (d/entity db [:name :house1])))
176
+ [:bath]))
177
+ (is (d/entity db [:name :kitchen])))
178
+
179
+ (let [db (d/db-with db [[:db/retract [:name :house1] :room]])]
180
+ (is (nil? (:room (d/entity db [:name :house1]))))
181
+ (is (= (names db)
182
+ #{:house1 :kitchen :bath :house2 :office :attic}))))))
183
+
184
+ (deftest test-transact!
185
+ (let [conn (du/setup-db {:initial-tx [{:db/ident :aka :db/cardinality :db.cardinality/many}]})]
186
+ (d/transact conn [[:db/add 1 :name "Ivan"]])
187
+ (d/transact conn [[:db/add 1 :name "Petr"]])
188
+ (d/transact conn [[:db/add 1 :aka "Devil"]])
189
+ (d/transact conn [[:db/add 1 :aka "Tupen"]])
190
+
191
+ (is (= (d/q '[:find ?v
192
+ :where [1 :name ?v]] @conn)
193
+ #{["Petr"]}))
194
+ (is (= (d/q '[:find ?v
195
+ :where [1 :aka ?v]] @conn)
196
+ #{["Devil"] ["Tupen"]}))
197
+ (d/release conn)))
198
+
199
+ (deftest test-db-fn-cas
200
+ (let [conn (du/setup-db)]
201
+ (d/transact conn {:tx-data [[:db/cas 1 :weight nil 100]]})
202
+ (is (= (:weight (d/entity @conn 1)) 100))
203
+ (d/transact conn {:tx-data [[:db/add 1 :weight 200]]})
204
+ (d/transact conn {:tx-data [[:db.fn/cas 1 :weight 200 300]]})
205
+ (is (= (:weight (d/entity @conn 1)) 300))
206
+ (d/transact conn {:tx-data [[:db/cas 1 :weight 300 400]]})
207
+ (is (= (:weight (d/entity @conn 1)) 400))
208
+ (is (thrown-with-msg? Throwable #":db.fn/cas failed on datom \[1 :weight 400\], expected 200"
209
+ (d/transact conn {:tx-data [[:db.fn/cas 1 :weight 200 210]]})))
210
+ (d/release conn))
211
+
212
+ (let [conn (du/setup-db {:initial-tx [{:db/ident :label :db/cardinality :db.cardinality/many}]})]
213
+ (d/transact conn {:tx-data [[:db/add 1 :label :x]]})
214
+ (d/transact conn {:tx-data [[:db/add 1 :label :y]]})
215
+ (d/transact conn {:tx-data [[:db.fn/cas 1 :label :y :z]]})
216
+ (is (= (:label (d/entity @conn 1)) #{:x :y :z}))
217
+ (is (thrown-with-msg? Throwable #":db.fn/cas failed on datom \[1 :label \(:x :y :z\)\], expected :s"
218
+ (d/transact conn {:tx-data [[:db.fn/cas 1 :label :s :t]]})))
219
+ (d/release conn))
220
+
221
+ (let [conn (du/setup-db)]
222
+ (d/transact conn {:tx-data [[:db/add 1 :name "Ivan"]]})
223
+ (d/transact conn {:tx-data [[:db.fn/cas 1 :age nil 42]]})
224
+ (is (= (:age (d/entity @conn 1)) 42))
225
+ (is (thrown-with-msg? Throwable #":db.fn/cas failed on datom \[1 :age 42\], expected nil"
226
+ (d/transact conn {:tx-data [[:db.fn/cas 1 :age nil 4711]]})))
227
+ (d/release conn))
228
+
229
+ (let [conn (du/setup-db)]
230
+ (is (thrown-with-msg? Throwable #"Can't use tempid in '\[:db.fn/cas -1 :attr nil :val\]'. Tempids are allowed in :db/add only"
231
+ (d/transact conn {:tx-data [[:db/add -1 :name "Ivan"]
232
+ [:db.fn/cas -1 :attr nil :val]]})))
233
+ (d/release conn)))
234
+
235
+ (deftest test-db-fn
236
+ (let [conn (du/setup-db {:initial-tx [{:db/ident :aka :db/cardinality :db.cardinality/many}]})
237
+ inc-age (fn [db name]
238
+ (if-let [[eid age] (first (d/q '{:find [?e ?age]
239
+ :in [$ ?name]
240
+ :where [[?e :name ?name]
241
+ [?e :age ?age]]}
242
+ db name))]
243
+ [{:db/id eid :age (inc age)} [:db/add eid :had-birthday true]]
244
+ (throw (ex-info (str "No entity with name: " name) {}))))]
245
+ (d/transact conn {:tx-data [{:db/id 1 :name "Ivan" :age 31}]})
246
+ (d/transact conn {:tx-data [[:db/add 1 :name "Petr"]]})
247
+ (d/transact conn {:tx-data [[:db/add 1 :aka "Devil"]]})
248
+ (d/transact conn {:tx-data [[:db/add 1 :aka "Tupen"]]})
249
+ (is (= (d/q '[:find ?v ?a
250
+ :where [?e :name ?v]
251
+ [?e :age ?a]] @conn)
252
+ #{["Petr" 31]}))
253
+ (is (= (d/q '[:find ?v
254
+ :where [?e :aka ?v]] @conn)
255
+ #{["Devil"] ["Tupen"]}))
256
+ (is (thrown-with-msg? Throwable #"No entity with name: Bob"
257
+ (d/transact conn {:tx-data [[:db.fn/call inc-age "Bob"]]})))
258
+ (let [{:keys [db-after]} (d/transact conn {:tx-data [[:db.fn/call inc-age "Petr"]]})
259
+ e (d/entity db-after 1)]
260
+ (is (= (:age e) 32))
261
+ (is (:had-birthday e)))
262
+ (d/release conn)))
263
+
264
+ #_(deftest test-db-ident-fn ;; TODO: check for :db/ident support within hhtree
265
+ (let [conn (du/setup-db {:initial-tx [{:name {:db/unique :db.unique/identity}}]})
266
+ inc-age (fn [db name]
267
+ (if-some [ent (d/entity db [:name name])]
268
+ [{:db/id (:db/id ent)
269
+ :age (inc (:age ent))}
270
+ [:db/add (:db/id ent) :had-birthday true]]
271
+ (throw (ex-info (str "No entity with name: " name) {}))))]
272
+ (d/transact conn {:tx-data [{:db/id 1
273
+ :name "Petr"
274
+ :age 31
275
+ :db/ident :Petr}
276
+ {:db/ident :inc-age
277
+ :db/fn inc-age}]})
278
+ (is (thrown-with-msg? "Can’t find entity for transaction fn :unknown-fn"
279
+ (d/transact conn {:tx-data [[:unknown-fn]]})))
280
+ (is (thrown-with-msg? "Entity :Petr expected to have :db/fn attribute with fn? value"
281
+ (d/transact conn {:tx-data [[:Petr]]})))
282
+ (is (thrown-with-msg? "No entity with name: Bob"
283
+ (d/transact conn {:tx-data [[:inc-age "Bob"]]})))
284
+ (d/transact conn {:tx-data [[:inc-age "Petr"]]})
285
+ (let [e (d/entity @conn 1)]
286
+ (is (= (:age e) 32))
287
+ (is (:had-birthday e)))))
288
+
289
+ (deftest test-resolve-eid
290
+ (let [conn (du/setup-db)
291
+ t1 (d/transact conn {:tx-data [[:db/add -1 :name "Ivan"]
292
+ [:db/add -1 :age 19]
293
+ [:db/add -2 :name "Petr"]
294
+ [:db/add -2 :age 22]]})
295
+ t2 (d/transact conn {:tx-data [[:db/add "Serg" :name "Sergey"]
296
+ [:db/add "Serg" :age 30]]})]
297
+ (is (= (:tempids t1) {-1 1, -2 2, :db/current-tx (+ const/tx0 1)}))
298
+ (is (= (:tempids t2) {"Serg" 3, :db/current-tx (+ const/tx0 2)}))
299
+ (is (= #{[1 "Ivan" 19 (+ const/tx0 1)]
300
+ [2 "Petr" 22 (+ const/tx0 1)]
301
+ [3 "Sergey" 30 (+ const/tx0 2)]}
302
+ (d/q '[:find ?e ?n ?a ?t
303
+ :where [?e :name ?n ?t]
304
+ [?e :age ?a]] @conn)))
305
+ (d/release conn)))
306
+
307
+ (deftest test-resolve-eid-refs
308
+ (let [conn (du/setup-db {:initial-tx [{:db/ident :friend
309
+ :db/valueType :db.type/ref
310
+ :db/cardinality :db.cardinality/many}]})
311
+ tx (d/transact conn {:tx-data [{:name "Sergey"
312
+ :friend [-1 -2]}
313
+ [:db/add -1 :name "Ivan"]
314
+ [:db/add -2 :name "Petr"]
315
+ [:db/add "B" :name "Boris"]
316
+ [:db/add "B" :friend -3]
317
+ [:db/add -3 :name "Oleg"]
318
+ [:db/add -3 :friend "B"]]})
319
+ q '[:find ?fn
320
+ :in $ ?n
321
+ :where [?e :name ?n]
322
+ [?e :friend ?fe]
323
+ [?fe :name ?fn]]]
324
+ (is (= (:tempids tx) {-1 3, -2 4, "B" 5, -3 6, :db/current-tx (+ const/tx0 2)}))
325
+ (is (= (d/q {:query q :args [@conn "Sergey"]}) #{["Ivan"] ["Petr"]}))
326
+ (is (= (d/q {:query q :args [@conn "Boris"]}) #{["Oleg"]}))
327
+ (is (= (d/q {:query q :args [@conn "Oleg"]}) #{["Boris"]}))
328
+ (d/release conn))
329
+
330
+ (testing "Resolve eid for unique attributes with temporary reference value"
331
+ (let [cfg {:initial-tx [{:db/ident :foo/match
332
+ :db/valueType :db.type/ref
333
+ :db/cardinality :db.cardinality/one
334
+ :db/unique :db.unique/identity}]}
335
+ query '[:find ?e ?a ?v
336
+ :where [?e ?a ?v]
337
+ [(= ?a :foo/match)]]]
338
+ (testing "with maps"
339
+ (testing "temp-eid first"
340
+ (let [conn (du/setup-db cfg)
341
+ report (d/transact conn [{:db/id 16
342
+ :foo/match -1000001}
343
+ {:db/id -1000001
344
+ :foo/match 16}])
345
+ id (get-in report [:tempids -1000001])]
346
+ (is (= (d/q query (:db-after report))
347
+ #{[16 :foo/match id] [id :foo/match 16]}))
348
+ (d/release conn)))
349
+ (testing "temp-vid first"
350
+ (let [conn (du/setup-db cfg)
351
+ report (d/transact conn [{:db/id -1000001
352
+ :foo/match 16}
353
+ {:db/id 16
354
+ :foo/match -1000001}])
355
+ id (get-in report [:tempids -1000001])]
356
+ (is (= (d/q query (:db-after report))
357
+ #{[16 :foo/match id] [id :foo/match 16]}))
358
+ (d/release conn))))
359
+ (testing "with vectors"
360
+ (testing "temp-eid first"
361
+ (let [conn (du/setup-db cfg)
362
+ report (d/transact conn [[:db/add 16 :foo/match -1000001]
363
+ [:db/add -1000001 :foo/match 16]])
364
+ id (get-in report [:tempids -1000001])]
365
+ (is (= (d/q query (:db-after report))
366
+ #{[16 :foo/match id] [id :foo/match 16]}))
367
+ (d/release conn)))
368
+ (testing "temp-vid first"
369
+ (let [conn (du/setup-db cfg)
370
+ report (d/transact conn [[:db/add -1000001 :foo/match 16]
371
+ [:db/add 16 :foo/match -1000001]])
372
+ id (get-in report [:tempids -1000001])]
373
+ (is (= (d/q query (:db-after report))
374
+ #{[16 :foo/match id] [id :foo/match 16]}))
375
+ (d/release conn)))))))
376
+
377
+ (deftest test-resolve-current-tx
378
+ (doseq [tx-tempid [:db/current-tx "datomic.tx" "datahike.tx"]]
379
+ (testing tx-tempid
380
+ (let [conn (du/setup-db {:keep-history? false})
381
+ tx1 (d/transact conn {:tx-data [{:db/ident :created-at :db/valueType :db.type/ref}
382
+ {:name "X", :created-at tx-tempid}
383
+ {:db/id tx-tempid, :prop1 "prop1"}
384
+ [:db/add tx-tempid :prop2 "prop2"]
385
+ [:db/add -1 :name "Y"]
386
+ [:db/add -1 :created-at tx-tempid]]})]
387
+ (is (= #{[1 :db/ident :created-at]
388
+ [1 :db/valueType :db.type/ref]
389
+ [2 :name "X"]
390
+ [2 :created-at (+ const/tx0 1)]
391
+ [(+ const/tx0 1) :prop1 "prop1"]
392
+ [(+ const/tx0 1) :prop2 "prop2"]
393
+ [3 :name "Y"]
394
+ [3 :created-at (+ const/tx0 1)]}
395
+ (d/q '[:find ?e ?a ?v :where [?e ?a ?v]] @conn)))
396
+ (is (= (assoc {-1 3, :db/current-tx (+ const/tx0 1)}
397
+ tx-tempid (+ const/tx0 1))
398
+ (:tempids tx1)))
399
+ (let [tx2 (d/transact conn {:tx-data [[:db/add tx-tempid :prop3 "prop3"]]})
400
+ tx-id (get-in tx2 [:tempids tx-tempid])]
401
+ (is (= (into {} (d/entity @conn tx-id))
402
+ {:prop3 "prop3"})))
403
+ (let [tx3 (d/transact conn {:tx-data [{:db/id tx-tempid, :prop4 "prop4"}]})
404
+ tx-id (get-in tx3 [:tempids tx-tempid])]
405
+ (is (= tx-id (+ const/tx0 3)))
406
+ (is (= (into {} (d/entity @conn tx-id))
407
+ {:prop4 "prop4"})))
408
+ (d/release conn)))))
409
+
410
+ (deftest test-tx-meta
411
+ (testing "simple test"
412
+ (let [conn (du/setup-db)
413
+ tx (d/transact conn {:tx-data [{:name "Sergey"
414
+ :age 5}]
415
+ :tx-meta {:foo "bar"}})]
416
+ (is (= (dissoc (:tx-meta tx) :db/txInstant :db/commitId)
417
+ {:foo "bar"}))
418
+ (d/release conn)))
419
+ (testing "generative test"
420
+ (let [conn (du/setup-db)
421
+ Metadata (s/map-of keyword? (s/or :int int?
422
+ :str string?
423
+ :inst inst?
424
+ :kw keyword?
425
+ :sym symbol?))
426
+ generated (gen/generate (s/gen Metadata))
427
+ tx-report (d/transact conn {:tx-data [{:name "Sergey"
428
+ :age 5}]
429
+ :tx-meta generated})]
430
+ (is (= (dissoc (:tx-meta tx-report) :db/txInstant :db/commitId)
431
+ generated))
432
+ (d/release conn)))
433
+ (testing "manual txInstant is the same as auto-generated"
434
+ (let [conn (du/setup-db)
435
+ date (tools/get-date)
436
+ _ (d/transact conn {:tx-data [{:name "Sergey"
437
+ :age 5}]
438
+ :tx-meta {:db/txInstant date}})]
439
+ (is (= [[1 :age 5 536870913 true]
440
+ [1 :name "Sergey" 536870913 true]
441
+ [536870913
442
+ :db/txInstant
443
+ date
444
+ 536870913
445
+ true]]
446
+ (mapv (comp #(into [] %) seq)
447
+ (d/datoms @conn :eavt))))
448
+ (d/release conn)))
449
+ (testing "missing schema definition"
450
+ (let [schema [{:db/ident :name
451
+ :db/cardinality :db.cardinality/one
452
+ :db/index true
453
+ :db/unique :db.unique/identity
454
+ :db/valueType :db.type/string}
455
+ {:db/ident :age
456
+ :db/cardinality :db.cardinality/one
457
+ :db/valueType :db.type/long}]
458
+ conn (du/setup-db {:initial-tx schema
459
+ :schema-flexibility :write})]
460
+ (is (thrown-with-msg? Throwable #"Bad entity attribute :foo at \[:db/add 536870914 :foo :bar 536870914\], not defined in current schema"
461
+ (d/transact conn {:tx-data [{:name "Sergey"
462
+ :age 5}]
463
+ :tx-meta {:foo :bar}})))
464
+ (d/release conn)))
465
+ (testing "meta-data is available on the indices"
466
+ (let [conn (du/setup-db)
467
+ _ (d/transact conn {:tx-data [{:name "Sergey"
468
+ :age 5}]
469
+ :tx-meta {:foo :bar}})]
470
+ (is (= #{[536870913 :bar]}
471
+ (d/q '[:find ?e ?v
472
+ :where [?e :foo ?v]]
473
+ @conn)))
474
+ (d/release conn)))
475
+ (testing "retracting metadata"
476
+ (let [conn (du/setup-db)
477
+ _ (d/transact conn {:tx-data [{:name "Sergey"
478
+ :age 5}]
479
+ :tx-meta {:foo :bar}})
480
+ _ (d/transact conn {:tx-data [[:db/retract 536870913 :foo :bar]]})]
481
+ (is (= #{}
482
+ (d/q '[:find ?e ?v
483
+ :where [?e :foo ?v]]
484
+ @conn)))
485
+ (d/release conn)))
486
+ (testing "overwrite metadata"
487
+ (let [conn (du/setup-db)
488
+ _ (d/transact conn {:tx-data [{:name "Sergey"
489
+ :age 5}]
490
+ :tx-meta {:foo :bar}})
491
+ _ (d/transact conn {:tx-data [{:db/id 536870913 :foo :baz}]})]
492
+ (is (= #{[536870913 :baz]}
493
+ (d/q '[:find ?e ?v
494
+ :where [?e :foo ?v]]
495
+ @conn)))
496
+ (d/release conn)))
497
+ (testing "metadata has txInstant"
498
+ (let [conn (du/setup-db)
499
+ {:keys [tempids]} (d/transact conn {:tx-data [{:name "Sergey"
500
+ :age 5}]
501
+ :tx-meta {:foo :bar}})]
502
+ (is (-> (d/pull @conn
503
+ '[:db/txInstant]
504
+ (:db/current-tx tempids))
505
+ :db/txInstant
506
+ inst?))
507
+ (d/release conn))))
508
+
509
+ (deftest test-db-id-ident-keyword
510
+ (testing "Using :db/ident keyword directly in :db/id (Datomic compatibility)"
511
+ (let [db (-> (db/empty-db {:name {:db/cardinality :db.cardinality/one}})
512
+ (d/db-with [{:db/ident :my.entity
513
+ :name "Initial"}]))]
514
+ (is (= "Initial" (-> (d/entity db :my.entity) :name)))
515
+ (let [db (d/db-with db [{:db/id :my.entity
516
+ :name "Updated"}])]
517
+ (is (= "Updated" (-> (d/entity db :my.entity) :name)))
518
+ (is (= "Updated" (-> (d/entity db [:db/ident :my.entity]) :name)))))))