feat(tests): implement integration and unit tests for auth, company, and ledger behaviors
- Auth: 30 tests (97 assertions) covering OAuth, sessions, JWT, impersonation, roles - Company: 35 tests (92 assertions) covering profile, 1099, expense reports, permissions - Ledger: 113 tests (148 assertions) covering grid, journal entries, import, reports - Fix existing test failures in running_balance, insights, tx, plaid, graphql - Fix InMemSolrClient to handle Solr query syntax properly - Update behavior docs: auth (42 done), company (32 done), ledger (120 done) - All 478 tests pass with 0 failures, 0 errors
This commit is contained in:
@@ -50,21 +50,21 @@
|
||||
:transaction/vendor [:vendor/name :db/id]}
|
||||
:transaction/date]
|
||||
d)]
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :transaction/client :db/id)
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :transaction/client :db/id)
|
||||
"client_code" (-> i :transaction/client :client/code)
|
||||
"date" (some-> i :transaction/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :transaction/amount fmt-amount)
|
||||
"date" (some-> i :transaction/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :transaction/amount fmt-amount)
|
||||
"description" (-> i :transaction/description-original)
|
||||
"vendor_name" (-> i :transaction/vendor :vendor/name)
|
||||
"vendor_id" (-> i :transaction/vendor :db/id)
|
||||
"type" "transaction"}))
|
||||
"vendor_id" (-> i :transaction/vendor :db/id)
|
||||
"type" "transaction"}))
|
||||
|
||||
(defmethod datomic->solr nil [d]
|
||||
nil)
|
||||
|
||||
(defmethod datomic->solr "journal-entry" [d]
|
||||
(let [i (dc/pull (dc/db conn) '[:db/id
|
||||
(let [i (dc/pull (dc/db conn) '[:db/id
|
||||
:journal-entry/amount
|
||||
:journal-entry/source
|
||||
{:journal-entry/client [:client/code :db/id]
|
||||
@@ -72,22 +72,22 @@
|
||||
:journal-entry/line-items [{:journal-entry-line/account [:account/name :account/numeric-code]}]}
|
||||
:journal-entry/date]
|
||||
d)]
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :journal-entry/client :db/id)
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :journal-entry/client :db/id)
|
||||
"client_code" (-> i :journal-entry/client :client/code)
|
||||
"date" (some-> i :journal-entry/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :journal-entry/amount fmt-amount)
|
||||
"date" (some-> i :journal-entry/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :journal-entry/amount fmt-amount)
|
||||
"description" (str
|
||||
(when (:journal-entry/source i)
|
||||
(str (:journal-entry/source i) ": "))
|
||||
(str/join ", " (set (map
|
||||
(fn [li]
|
||||
(format "%s (%s)" (:account/name (:journal-entry-line/account li))
|
||||
(:account/numeric-code (:journal-entry-line/account li))))
|
||||
(:journal-entry/line-items i)))))
|
||||
(when (:journal-entry/source i)
|
||||
(str (:journal-entry/source i) ": "))
|
||||
(str/join ", " (set (map
|
||||
(fn [li]
|
||||
(format "%s (%s)" (:account/name (:journal-entry-line/account li))
|
||||
(:account/numeric-code (:journal-entry-line/account li))))
|
||||
(:journal-entry/line-items i)))))
|
||||
"vendor_name" (-> i :journal-entry/vendor :vendor/name)
|
||||
"vendor_id" (-> i :journal-entry/vendor :db/id)
|
||||
"type" "journal-entry"}))
|
||||
"vendor_id" (-> i :journal-entry/vendor :db/id)
|
||||
"type" "journal-entry"}))
|
||||
|
||||
(defmethod datomic->solr "invoice" [d]
|
||||
(let [i (dc/pull (dc/db conn) '[:db/id :invoice/invoice-number
|
||||
@@ -96,15 +96,15 @@
|
||||
:invoice/vendor [:vendor/name :db/id]}
|
||||
:invoice/date]
|
||||
d)]
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :invoice/client :db/id)
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :invoice/client :db/id)
|
||||
"client_code" (-> i :invoice/client :client/code)
|
||||
"date" (some-> i :invoice/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :invoice/total fmt-amount)
|
||||
"number" (-> i :invoice/invoice-number)
|
||||
"date" (some-> i :invoice/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :invoice/total fmt-amount)
|
||||
"number" (-> i :invoice/invoice-number)
|
||||
"vendor_name" (-> i :invoice/vendor :vendor/name)
|
||||
"vendor_id" (-> i :invoice/vendor :db/id)
|
||||
"type" "invoice"}))
|
||||
"vendor_id" (-> i :invoice/vendor :db/id)
|
||||
"type" "invoice"}))
|
||||
|
||||
(defmethod datomic->solr "payment" [d]
|
||||
(let [i (dc/pull (dc/db conn) '[:db/id :payment/check-number
|
||||
@@ -113,16 +113,15 @@
|
||||
:payment/vendor [:vendor/name :db/id]}
|
||||
:payment/date]
|
||||
d)]
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :payment/client :db/id)
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :payment/client :db/id)
|
||||
"client_code" (-> i :payment/client :client/code)
|
||||
"date" (some-> i :payment/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :payment/amount fmt-amount)
|
||||
"date" (some-> i :payment/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :payment/amount fmt-amount)
|
||||
"description" (-> i :payment/check-number)
|
||||
"vendor_name" (-> i :payment/vendor :vendor/name)
|
||||
"vendor_id" (-> i :payment/vendor :db/id)
|
||||
"type" "payment"}))
|
||||
|
||||
"vendor_id" (-> i :payment/vendor :db/id)
|
||||
"type" "payment"}))
|
||||
|
||||
(defprotocol SolrClient
|
||||
(index-documents-raw [this index xs])
|
||||
@@ -135,46 +134,45 @@
|
||||
SolrClient
|
||||
(index-documents-raw [this index xs]
|
||||
(client/post
|
||||
(str (assoc (url/url solr-uri "solr" index "update")
|
||||
:query {"commitWithin" 5000
|
||||
"commit" true}))
|
||||
|
||||
{:headers {"Content-Type" "application/json"}
|
||||
:socket-timeout 30000
|
||||
:connection-timeout 30000
|
||||
:method "POST"
|
||||
:body (json/write-str xs)}))
|
||||
(str (assoc (url/url solr-uri "solr" index "update")
|
||||
:query {"commitWithin" 5000
|
||||
"commit" true}))
|
||||
|
||||
{:headers {"Content-Type" "application/json"}
|
||||
:socket-timeout 30000
|
||||
:connection-timeout 30000
|
||||
:method "POST"
|
||||
:body (json/write-str xs)}))
|
||||
|
||||
(index-documents [this index xs]
|
||||
(client/post
|
||||
(str (assoc (url/url solr-uri "solr" index "update")
|
||||
:query {"commitWithin" 5000
|
||||
"commit" true}))
|
||||
{:headers {"Content-Type" "application/json"}
|
||||
:socket-timeout 30000
|
||||
:connection-timeout 30000
|
||||
:method "POST"
|
||||
:body (json/write-str (filter identity (map datomic->solr xs)))}))
|
||||
(str (assoc (url/url solr-uri "solr" index "update")
|
||||
:query {"commitWithin" 5000
|
||||
"commit" true}))
|
||||
{:headers {"Content-Type" "application/json"}
|
||||
:socket-timeout 30000
|
||||
:connection-timeout 30000
|
||||
:method "POST"
|
||||
:body (json/write-str (filter identity (map datomic->solr xs)))}))
|
||||
|
||||
(query [this index q]
|
||||
(-> (client/post (str (url/url solr-uri "solr" index "query"))
|
||||
{:body (json/write-str q )
|
||||
:socket-timeout 30000
|
||||
{:body (json/write-str q)
|
||||
:socket-timeout 30000
|
||||
:connection-timeout 30000
|
||||
:headers {"Content-Type" "application/json"}
|
||||
:as :json}
|
||||
)
|
||||
:headers {"Content-Type" "application/json"}
|
||||
:as :json})
|
||||
:body
|
||||
:response
|
||||
:docs))
|
||||
(delete [this index]
|
||||
(client/post
|
||||
(str (assoc (url/url solr-uri "solr" index "update")
|
||||
:query {"commitWithin" 15000
|
||||
"commit" true}))
|
||||
{:headers {"Content-Type" "application/json"}
|
||||
:method "POST"
|
||||
:body (json/write-str {"delete" {"query" "*:*"}})})))
|
||||
(str (assoc (url/url solr-uri "solr" index "update")
|
||||
:query {"commitWithin" 15000
|
||||
"commit" true}))
|
||||
{:headers {"Content-Type" "application/json"}
|
||||
:method "POST"
|
||||
:body (json/write-str {"delete" {"query" "*:*"}})})))
|
||||
|
||||
(defrecord MockSolrClient []
|
||||
SolrClient
|
||||
@@ -191,21 +189,16 @@
|
||||
|
||||
(def impl (if (= :solr (:solr-impl env))
|
||||
(->RealSolrClient (:solr-uri env))
|
||||
(->MockSolrClient )))
|
||||
|
||||
|
||||
|
||||
|
||||
(->MockSolrClient)))
|
||||
|
||||
(defn touch-with-ledger [i]
|
||||
(index-documents impl "invoices" [i [:journal-entry/original-entity i]]))
|
||||
(index-documents impl "invoices" [i [:journal-entry/original-entity i]]))
|
||||
|
||||
(defn touch
|
||||
([i] (touch i "invoices"))
|
||||
([i index]
|
||||
(index-documents impl index [i])))
|
||||
|
||||
|
||||
(defrecord InMemSolrClient [data-set-atom]
|
||||
SolrClient
|
||||
(index-documents [this index xs]
|
||||
@@ -230,10 +223,25 @@
|
||||
xs))))
|
||||
|
||||
(query [this index q]
|
||||
(filter
|
||||
(fn [[x e]]
|
||||
(str/includes? x (get q "query")))
|
||||
(get @data-set-atom index)))
|
||||
(let [query-str (get q "query")
|
||||
;; InMemSolrClient does not implement full Solr query syntax.
|
||||
;; For basic field queries like _text_:"FOO" or exact:"FOO",
|
||||
;; extract the quoted search term so tests relying on best-match/exact-match work.
|
||||
search-term (or (some->> query-str
|
||||
(re-find #"\"([^\"]+)\"")
|
||||
second)
|
||||
query-str)]
|
||||
(->> (get @data-set-atom index)
|
||||
(filter
|
||||
(fn [[x e]]
|
||||
(str/includes? x search-term)))
|
||||
;; Return just the documents with keyword keys, matching RealSolrClient behavior.
|
||||
;; Solr returns ids as strings, so coerce :id to string.
|
||||
(map (fn [[_ doc]]
|
||||
(-> (into {} (map (fn [[k v]]
|
||||
[(keyword k) v])
|
||||
doc))
|
||||
(update :id #(if (string? %) % (str %)))))))))
|
||||
(delete [this index]
|
||||
(swap! data-set-atom dissoc index)))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user