got integration tests more or less working

This commit is contained in:
Bryce Covert
2021-12-21 12:33:34 -08:00
parent 563e1c51ff
commit a7c9d376bc
5 changed files with 132 additions and 2464 deletions

2382
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -303,8 +303,8 @@
:db/doc "Whether to include this bank account in balance sheet, etc." :db/doc "Whether to include this bank account in balance sheet, etc."
:db/valueType :db.type/boolean :db/valueType :db.type/boolean
:db/cardinality :db.cardinality/one}]] :db/cardinality :db.cardinality/one}]]
:depends-on [:auto-ap/add-manager-schema]} :requires [:auto-ap/add-manager-schema]}
:auto-ap/migrate-include-in-reports {:txes-fn `add-include-in-reports :depends-on [:auto-ap/add-include-in-reports1] } :auto-ap/migrate-include-in-reports {:txes-fn `add-include-in-reports :requires [:auto-ap/add-include-in-reports1] }
:auto-ap/add-forecasted-transaction-match {:txes [[{:db/ident :transaction/forecast-match :auto-ap/add-forecasted-transaction-match {:txes [[{:db/ident :transaction/forecast-match
:db/doc "Which forecast this transaction matches, for cashflow" :db/doc "Which forecast this transaction matches, for cashflow"
:db/valueType :db.type/ref :db/valueType :db.type/ref
@@ -356,13 +356,14 @@
:db/cardinality :db.cardinality/one}]]} :db/cardinality :db.cardinality/one}]]}
:auto-ap/add-power-user-schema {:txes [[{:db/ident :user-role/power-user}]]} :auto-ap/add-power-user-schema {:txes [[{:db/ident :user-role/power-user}]]}
:auto-ap/add-transaction-date-index {:txes [[{:db/ident :transaction/date :auto-ap/add-transaction-date-index {:txes [[{:db/ident :transaction/date
:db/index true}]]} :db/index true}]]
:requires [:auto-ap/add-general-ledger6]}
:auto-ap/add-invoice-index {:txes [[{:db/ident :invoice/invoice-number :auto-ap/add-invoice-index {:txes [[{:db/ident :invoice/invoice-number
:db/index true}]] :db/index true}]]
:depends-on [:auto-ap/base-schema]} :requires [:auto-ap/base-schema]}
:auto-ap/add-propose-invoice {:txes-fn `propose-invoice-fn :auto-ap/add-propose-invoice {:txes-fn `propose-invoice-fn
:depends-on [:auto-ap/base-schema]} :requires [:auto-ap/base-schema]}
:auto-ap/add-intuit-banks-4 {:txes [[{:db/ident :intuit-bank-account/external-id :auto-ap/add-intuit-banks-4 {:txes [[{:db/ident :intuit-bank-account/external-id
:db/doc "Id of the intui bank" :db/doc "Id of the intui bank"
:db/valueType :db.type/string :db/valueType :db.type/string
@@ -381,7 +382,7 @@
:db/doc "An unhashed version of the id" :db/doc "An unhashed version of the id"
:db/valueType :db.type/string :db/valueType :db.type/string
:db/cardinality :db.cardinality/one}]] :db/cardinality :db.cardinality/one}]]
:depends-on [:auto-ap/base-schema]} :requires [:auto-ap/add-general-ledger6]}
:auto-ap/add-transaction-import2 {:txes [[{:db/ident :import-batch/external-id :auto-ap/add-transaction-import2 {:txes [[{:db/ident :import-batch/external-id
:db/doc "An identifier for the import batch" :db/doc "An identifier for the import batch"
:db/valueType :db.type/string :db/valueType :db.type/string
@@ -425,11 +426,11 @@
:db/doc "Who triggred this import" :db/doc "Who triggred this import"
:db/valueType :db.type/string :db/valueType :db.type/string
:db/cardinality :db.cardinality/one}]] :db/cardinality :db.cardinality/one}]]
:depends-on [:auto-ap/base-schema]} :requires [:auto-ap/add-general-ledger6]}
:auto-ap/add-suppression {:txes [[{:db/ident :transaction-approval-status/suppressed} :auto-ap/add-suppression {:txes [[{:db/ident :transaction-approval-status/suppressed}
{:db/ident :transaction/approval-status {:db/ident :transaction/approval-status
:db/index true}]] :db/index true}]]
:depends-on [:auto-ap/base-schema]}} :requires [:auto-ap/add-transaction-rules]}}

View File

@@ -2,7 +2,7 @@
(:require (:require
[auto-ap.datomic [auto-ap.datomic
:refer [add-sorter-fields apply-pagination apply-sort-3 conn merge-query]] :refer [add-sorter-fields apply-pagination apply-sort-3 conn merge-query]]
[auto-ap.graphql.utils :refer [assert-admin assert-present]] [auto-ap.graphql.utils :refer [assert-admin assert-present <-graphql ->graphql]]
[auto-ap.plaid.core :as p] [auto-ap.plaid.core :as p]
[clj-time.coerce :as coerce] [clj-time.coerce :as coerce]
[clj-time.core :as time] [clj-time.core :as time]

View File

@@ -34,7 +34,6 @@
start (time/plus end (time/days -30)) start (time/plus end (time/days -30))
_ (log/infof "importing from %s to %s for %s" start end external-id) _ (log/infof "importing from %s to %s for %s" start end external-id)
transactions (p/get-transactions access-token external-id start end) transactions (p/get-transactions access-token external-id start end)
_ (clojure.pprint/pprint transactions)
transactions (->> transactions transactions (->> transactions
:transactions :transactions
(filter (fn [t] (filter (fn [t]

View File

@@ -2,7 +2,7 @@
(:require [auto-ap.yodlee.import :as sut] (:require [auto-ap.yodlee.import :as sut]
[auto-ap.yodlee.core :as c] [auto-ap.yodlee.core :as c]
[datomic.api :as d] [datomic.api :as d]
[auto-ap.datomic :refer [uri]] [auto-ap.datomic :refer [uri conn]]
[auto-ap.rule-matching :as rm] [auto-ap.rule-matching :as rm]
[auto-ap.datomic.migrate :as m] [auto-ap.datomic.migrate :as m]
[clojure.test :as t] [clojure.test :as t]
@@ -40,8 +40,8 @@
:client/_bank-accounts {:db/id 123 :client/_bank-accounts {:db/id 123
:client/locations ["Z" "E"]}}}) :client/locations ["Z" "E"]}}})
(t/deftest do-import (t/deftest add-transactions
(t/testing "Should import single transaction" (t/testing "Should import and code transactions"
(let [[result] (sut/transactions->txs [base-transaction] (let [[result] (sut/transactions->txs [base-transaction]
:bank-account :bank-account
noop-rule noop-rule
@@ -58,33 +58,75 @@
:raw-id "1" :raw-id "1"
:approval-status :transaction-approval-status/unapproved :approval-status :transaction-approval-status/unapproved
:description-simple "simple-description"}] :description-simple "simple-description"}]
result)))))
(t/deftest do-import
(t/testing "Should import single transaction"
(println "HER")
(let [{:strs [bank-account-id client-id]} (:tempids @(d/transact conn [{:db/id "bank-account-id"
:bank-account/code "TEST-1"}
{:db/id "client-id"
:client/code "TEST"
:client/locations ["Z" "E"]
:client/bank-accounts ["bank-account-id"]}]))
result (sut/transactions->txs [base-transaction]
(d/entity (d/db conn) bank-account-id)
1
noop-rule
#{})]
(t/is (= {:import [[#:transaction {:amount -12.0
:date #inst "2014-01-02T08:00:00.000-00:00"
:bank-account bank-account-id
:client client-id
:post-date #inst "2014-01-04T08:00:00.000-00:00"
:account-id 1234
:description-original "original-description"
:status "POSTED"
:id "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"
:raw-id "1"
:approval-status :transaction-approval-status/unapproved
:description-simple "simple-description"
:import-batch/_entry 1}]]}
result)))) result))))
(t/testing "Should exclude a transaction before start date" (t/testing "Should exclude a transaction before start date"
(let [result (sut/transactions->txs [(assoc-in base-transaction (let [{:strs [bank-account-id client-id]} (:tempids @(d/transact conn [{:db/id "bank-account-id"
[:bank-account :start-date] :bank-account/code "TEST-1"
(clj-time.coerce/to-date-time #inst "2020-01-01"))] :bank-account/start-date #inst "2030-01-01"}
:bank-account {:db/id "client-id"
:client/code "TEST"
:client/locations ["Z" "E"]
:client/bank-accounts ["bank-account-id"]}]))
result (sut/transactions->txs [(assoc base-transaction :date "2020-05-01")]
(d/entity (d/db conn) bank-account-id)
1
noop-rule noop-rule
#{})] #{})]
(t/is (= [] (t/is (= 1 (count (:not-ready result))))))
result))))
(t/testing "Should not reimport an existing transaction" (t/testing "Should not reimport an existing transaction"
(let [result (sut/transactions->txs [base-transaction] (let [{:strs [bank-account-id client-id]} (:tempids @(d/transact conn [{:db/id "bank-account-id"
:bank-account :bank-account/code "TEST-1"
:bank-account/start-date #inst "2030-01-01"}
{:db/id "client-id"
:client/code "TEST"
:client/locations ["Z" "E"]
:client/bank-accounts ["bank-account-id"]}]))
result (sut/transactions->txs [(assoc base-transaction :id "123")]
(d/entity (d/db conn) bank-account-id)
1
noop-rule noop-rule
#{"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"})] {(digest/sha-256 "123") :transaction-approval-status/unapproved})]
(t/is (= [] (t/is (= 1 (count (:extant result))))))
result))))
(t/testing "Should skip transaction if no client is found" (t/testing "Should skip transaction if no client is found"
(let [result (sut/transactions->txs [(assoc base-transaction :bank-account nil)] (let [result (sut/transactions->txs [base-transaction]
:bank-account (d/entity (d/db conn) 1238970123)
1
noop-rule noop-rule
#{})] {})]
(t/is (= [] result)))) (t/is (= 1 (count (:error result))))))
(t/testing "Should match an uncleared check" (t/testing "Should match an uncleared check"
(let [{:strs [bank-account-id client-id payment-id]} (->> [#:payment {:status :payment-status/pending (let [{:strs [bank-account-id client-id payment-id]} (->> [#:payment {:status :payment-status/pending
@@ -104,16 +146,22 @@
:tempids)] :tempids)]
(let [[[transaction-result]] (sut/transactions->txs [(assoc base-transaction (println (sut/transactions->txs [(assoc base-transaction
:description {:original "CHECK 10001" :description {:original "CHECK 10001"
:simple ""} :simple ""}
:amount {:amount 30.0} :amount {:amount 30.0})]
:bank-account {:db/id bank-account-id (d/entity (d/db conn ) bank-account-id)
:client/_bank-accounts {:db/id client-id 1
:client/locations ["A"]}})] noop-rule
:bank-account {}))
noop-rule (let [[[transaction-result]] (:import (sut/transactions->txs [(assoc base-transaction
#{})] :description {:original "CHECK 10001"
:simple ""}
:amount {:amount 30.0})]
(d/entity (d/db conn ) bank-account-id)
1
noop-rule
{}))]
(t/is (= {:db/id payment-id (t/is (= {:db/id payment-id
:payment/status :payment-status/cleared} :payment/status :payment-status/cleared}
@@ -121,17 +169,15 @@
(t/testing "Should not match an already matched check" (t/testing "Should not match an already matched check"
@(d/transact (d/connect uri) [{:db/id payment-id :payment/status :payment-status/cleared}]) @(d/transact (d/connect uri) [{:db/id payment-id :payment/status :payment-status/cleared}])
(let [[result] (sut/transactions->txs [(assoc base-transaction (let [[result] (:import (sut/transactions->txs [(assoc base-transaction
:description {:original "CHECK 10001" :description {:original "CHECK 10001"
:simple ""} :simple ""}
:amount {:amount 30.0} :amount {:amount 30.0}
:id 789 :id 789)]
:bank-account {:db/id bank-account-id (d/entity (d/db conn) bank-account-id)
:client/_bank-accounts {:db/id client-id 1
:client/locations ["A"]}})] noop-rule
:bank-account {}))]
noop-rule
#{})]
(t/is (= nil (t/is (= nil
(:transaction/payment result))))))) (:transaction/payment result)))))))
@@ -155,15 +201,13 @@
(t/testing "Should match within 10 days" (t/testing "Should match within 10 days"
(let [[[transaction-result]] (sut/transactions->txs [(assoc base-transaction (let [[[transaction-result]] (:import (sut/transactions->txs [(assoc base-transaction
:date "2021-07-03" :date "2021-07-03"
:amount {:amount -100.0} :amount {:amount -100.0})]
:bank-account {:db/id bank-account-id (d/entity (d/db conn) bank-account-id)
:client/_bank-accounts {:db/id client-id 1
:client/locations ["MF"]}})] noop-rule
:bank-account #{}))]
noop-rule
#{})]
(t/is (= expected-deposit-id (t/is (= expected-deposit-id
(sut/find-expected-deposit client-id 100.0 (clj-time.coerce/to-date-time #inst "2021-07-03T00:00:00-08:00")))) (sut/find-expected-deposit client-id 100.0 (clj-time.coerce/to-date-time #inst "2021-07-03T00:00:00-08:00"))))
@@ -172,27 +216,23 @@
(:transaction/expected-deposit transaction-result))))) (:transaction/expected-deposit transaction-result)))))
(t/testing "Should not match old expected deposits" (t/testing "Should not match old expected deposits"
(let [[[transaction-result]] (sut/transactions->txs [(assoc base-transaction (let [[[transaction-result]] (:import (sut/transactions->txs [(assoc base-transaction
:date "2021-07-13" :date "2021-07-13"
:amount {:amount -100.0} :amount {:amount -100.0})]
:bank-account {:db/id bank-account-id (d/entity (d/db conn) bank-account-id)
:client/_bank-accounts {:db/id client-id 1
:client/locations ["MF"]}})] noop-rule
:bank-account {}))]
noop-rule
#{})]
(t/is (not (:transaction/expected-deposit transaction-result))))) (t/is (not (:transaction/expected-deposit transaction-result)))))
(t/testing "Should only match exact." (t/testing "Should only match exact."
(let [[[transaction-result]] (sut/transactions->txs [(assoc base-transaction (let [[[transaction-result]] (:import (sut/transactions->txs [(assoc base-transaction
:date "2021-07-03" :date "2021-07-03"
:amount {:amount -100.01} :amount {:amount -100.01})]
:bank-account {:db/id bank-account-id (d/entity (d/db conn) bank-account-id)
:client/_bank-accounts {:db/id client-id 1
:client/locations ["MF"]}})] noop-rule
:bank-account {}))]
noop-rule
#{})]
(t/is (not (:transaction/expected-deposit transaction-result))))))) (t/is (not (:transaction/expected-deposit transaction-result)))))))
#_(t/testing "Auto-pay Invoices" #_(t/testing "Auto-pay Invoices"
@@ -304,18 +344,16 @@
(d/transact (d/connect uri)) (d/transact (d/connect uri))
deref deref
:tempids) :tempids)
[[transaction-tx]] (sut/transactions->txs [(assoc base-transaction [[transaction-tx]] (:import (sut/transactions->txs [(assoc base-transaction
:description {:original "Hello XXX039" :description {:original "Hello XXX039"
:simple ""} :simple ""}
:amount {:amount 31.0} :amount {:amount 31.0}
:id 789 :id 789)]
:bank-account {:db/id bank-account-id (d/entity (d/db conn) bank-account-id)
:client/_bank-accounts {:db/id client-id 1
:client/locations ["A"]}})] (rm/rule-applying-fn [{:transaction-rule/description "XXX039"
:bank-account :transaction-rule/transaction-approval-status :transaction-approval-status/approved}])
(rm/rule-applying-fn [{:transaction-rule/description "XXX039" #{}))]
:transaction-rule/transaction-approval-status :transaction-approval-status/approved}])
#{})]
(t/is (= :transaction-approval-status/approved (t/is (= :transaction-approval-status/approved
(:transaction/approval-status transaction-tx))))) (:transaction/approval-status transaction-tx)))))