Files
integreat/test/clj/auto_ap/graphql.clj
2019-05-14 21:18:52 -07:00

150 lines
10 KiB
Clojure

(ns test.auto-ap.graphql
(:require [auto-ap.graphql :as sut]
[auto-ap.datomic.migrate :as m]
[venia.core :as v]
[clojure.test :as t :refer [deftest is testing use-fixtures]]
[datomic.api :as d]
[auto-ap.datomic :refer [uri]]))
(defn wrap-setup
[f]
(d/create-database uri)
(m/-main false)
(f)
(d/release (d/connect uri))
(d/delete-database uri))
(use-fixtures :each wrap-setup)
(deftest ledger-page
(testing "ledger"
(testing "it should find ledger entries"
(let [result (:ledger-page (:data (sut/query nil "{ ledger_page(client_id: null) { count, start, journal_entries { id } }}")))]
(is (int? (:count result)))
(is (int? (:start result)))
(is (seqable? (:journal-entries result)))))))
(deftest transaction-rule-page
(testing "it should find rules"
(let [result (-> (sut/query nil "{ transaction_rule_page(client_id: null) { count, start, transaction_rules { id } }}")
:data
:transaction-rule-page)]
(is (int? (:count result)))
(is (int? (:start result)))
(is (seqable? (:transaction-rules result))))))
(deftest upsert-transaction-rule
(let [{:strs [vendor-id account-id]} (-> (d/connect uri)
(d/transact
[{:vendor/name "Bryce's Meat Co"
:db/id "vendor-id"}
{:account/name "hello"
:db/id "account-id"}])
deref
:tempids)]
(testing "it should reject rules that don't add up to 100%"
(let [q (v/graphql-query {:venia/operation {:operation/type :mutation
:operation/name "UpsertTransactionRule"}
:venia/queries [{:query/data (sut/->graphql [:upsert-transaction-rule
{:transaction-rule {:accounts [{:account-id account-id
:percentage "0.25"
:location "B"}]}}
[:id ]])}]})]
(is (thrown? clojure.lang.ExceptionInfo (sut/query nil q)))))
(testing "it should add rules"
(let [q (v/graphql-query {:venia/operation {:operation/type :mutation
:operation/name "UpsertTransactionRule"}
:venia/queries [{:query/data (sut/->graphql [:upsert-transaction-rule
{:transaction-rule {:description "123"
:vendor-id vendor-id
:transaction-approval-status :approved
:accounts [{:account-id account-id
:percentage "0.5"
:location "B"}
{:account-id account-id
:percentage "0.5"
:location "A"}]}}
[:id :description
:transaction-approval-status
[:vendor [:name]]
[:accounts [:id :percentage [:account [:name]]]]]])}]})
result (-> (sut/query nil q)
:data
:upsert-transaction-rule)]
(is (= "123" (:description result)))
(is (= "Bryce's Meat Co" (-> result :vendor :name)))
(is (= :approved (:transaction-approval-status result)))
(is (= "hello" (-> result :accounts (get 0) :account :name )))
(is (:id result))
(testing "it should delete removed rules"
(let [q (v/graphql-query {:venia/operation {:operation/type :mutation
:operation/name "UpsertTransactionRule"}
:venia/queries [{:query/data (sut/->graphql [:upsert-transaction-rule
{:transaction-rule {:id (:id result)
:description "123"
:vendor-id vendor-id
:accounts [{:id (-> result :accounts (get 0) :id)
:account-id account-id
:percentage "1.0"
:location "B"}]}}
[[:accounts [:id :percentage [:account [:name]]]]]])}]})
result (-> (sut/query nil q)
:data
:upsert-transaction-rule)]
(is (= 1 (count (:accounts result))))))))))
(deftest test-transaction-rule
(testing "it should match rules"
(let [matching-transaction @(d/transact (d/connect uri)
[{:transaction/description-original "matching-desc"
:transaction/date #inst "2019-01-05T00:00:00.000-08:00"
:transaction/client {:client/name "1"
:db/id "client-1"}
:transaction/bank-account {:db/id "bank-account-1"
:bank-account/name "1"}
:transaction/amount 1.00
:transaction/id "2019-01-05 matching-desc 1"}
{:transaction/description-original "nonmatching-desc"
:transaction/client {:client/name "2"
:db/id "client-2"}
:transaction/bank-account {:db/id "bank-account-2"
:bank-account/name "2"}
:transaction/date #inst "2019-01-15T23:23:00.000-08:00"
:transaction/amount 2.00
:transaction/id "2019-01-15 nonmatching-desc 2"}])
{:strs [client-1 client-2 bank-account-1 bank-account-2]} (get-in matching-transaction [:tempids])
rule-test (fn [rule]
(-> (sut/query nil (v/graphql-query {:venia/operation {:operation/type :query
:operation/name "TestTransactionRule"}
:venia/queries [{:query/data (sut/->graphql [:test-transaction-rule
{:transaction-rule rule}
[:id]])}]}))
:data
:test-transaction-rule))]
(testing "based on date "
(is (= [{:id "2019-01-15 nonmatching-desc 2"}] (rule-test {:dom-gte 14 :dom-lte 16})))
(is (= [{:id "2019-01-15 nonmatching-desc 2"}] (rule-test {:dom-gte 14})))
(is (= [{:id "2019-01-05 matching-desc 1"} {:id "2019-01-15 nonmatching-desc 2"}] (rule-test {:dom-lte 15})))
(is (= [{:id "2019-01-15 nonmatching-desc 2"}] (rule-test {:dom-gte 15})))
(is (= [{:id "2019-01-15 nonmatching-desc 2"}] (rule-test {:dom-gte 15 :dom-lte 15}))))
(testing "based on description"
(is (= [{:id "2019-01-05 matching-desc 1"}] (rule-test {:description "^match"}))))
(testing "based on amount"
(is (= [{:id "2019-01-05 matching-desc 1"}] (rule-test {:amount-gte 1.0 :amount-lte 1.0})))
(is (= [{:id "2019-01-05 matching-desc 1"} {:id "2019-01-15 nonmatching-desc 2"}] (rule-test {:amount-gte 1.0 })) )
(is (= [{:id "2019-01-05 matching-desc 1"} {:id "2019-01-15 nonmatching-desc 2"}] (rule-test {:amount-lte 2.0 })) ))
(testing "based on client"
(is (= [{:id "2019-01-05 matching-desc 1"}] (rule-test {:client-id client-1})))
(is (= [{:id "2019-01-15 nonmatching-desc 2"}] (rule-test {:client-id client-2}))))
(testing "based on bank account"
(is (= [{:id "2019-01-05 matching-desc 1"}] (rule-test {:bank-account-id bank-account-1})))
(is (= [{:id "2019-01-15 nonmatching-desc 2"}] (rule-test {:bank-account-id bank-account-2})))))))