From ca45795b1189e9a8dadcfa7cbd0ff562acb61aa6 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Mon, 27 Mar 2023 13:25:43 -0700 Subject: [PATCH] More test coverage, also found a bug where bulk voided invoices were not unvoidable --- src/clj/auto_ap/graphql/invoices.clj | 5 +- .../auto_ap/integration/graphql/invoices.clj | 271 ++++++++++++------ test/clj/auto_ap/integration/util.clj | 6 +- 3 files changed, 199 insertions(+), 83 deletions(-) diff --git a/src/clj/auto_ap/graphql/invoices.clj b/src/clj/auto_ap/graphql/invoices.clj index bd909491..9751c83a 100644 --- a/src/clj/auto_ap/graphql/invoices.clj +++ b/src/clj/auto_ap/graphql/invoices.clj @@ -319,7 +319,8 @@ }] (map (fn [iea] - [:db/retract (:db/id i) :invoice/expense-accounts (:db/id iea)]) + {:db/id (:db/id iea) + :invoice-expense-account/amount 0.0}) (:invoice/expense-accounts i)))))) (:id context)) {:message (str "Succesfully voided " (count all-ids))})) @@ -339,6 +340,8 @@ :in ['$ '?e]} :args [history id]}) [last-transaction] (->> txs (sort-by first) (last))] + (mu/log ::here + :txes txs) (transact-with-ledger [(->> txs (filter (fn [[tx]] (= tx last-transaction))) (reduce (fn [new-transaction [_ entity original-status original-outstanding total expense-account expense-account-amount]] diff --git a/test/clj/auto_ap/integration/graphql/invoices.clj b/test/clj/auto_ap/integration/graphql/invoices.clj index 29a9adec..d4c137be 100644 --- a/test/clj/auto_ap/integration/graphql/invoices.clj +++ b/test/clj/auto_ap/integration/graphql/invoices.clj @@ -1,101 +1,210 @@ (ns auto-ap.integration.graphql.invoices (:require - [auto-ap.datomic :refer [conn uri]] - [auto-ap.datomic.migrate :as m] - [auto-ap.time-reader] + [auto-ap.datomic :refer [conn]] [auto-ap.graphql.invoices :as sut] - [clj-time.core :as time] + [auto-ap.integration.util + :refer [admin-token + setup-test-data + test-account + test-invoice + test-vendor + wrap-setup]] [clojure.test :as t :refer [deftest is testing use-fixtures]] [datomic.api :as d])) -(defn wrap-setup - [f] - (with-redefs [auto-ap.datomic/uri "datomic:mem://datomic-transactor:4334/invoice"] - (d/create-database uri) - (with-redefs [auto-ap.datomic/conn (d/connect uri)] - (m/migrate conn) - - (f) - (d/release conn) - (d/delete-database uri)))) - -#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} -(defn admin-token [] - {:user "TEST ADMIN" - :exp (time/plus (time/now) (time/days 1)) - :user/role "admin" - :user/name "TEST ADMIN"}) - -#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} -(defn user-token [client-id] - {:user "TEST USER" - :exp (time/plus (time/now) (time/days 1)) - :user/role "user" - :user/name "TEST USER" - :user/clients [{:db/id client-id}]}) - - (use-fixtures :each wrap-setup) (deftest test-add-invoice (testing "It should Add an invoice" - (let [{:strs [vendor-id client-id account-id]} - (:tempids @(d/transact conn [{:client/code "ABC" - :db/id "client-id" - :client/locations ["DT"]} - {:vendor/name "Vendy" - :db/id "vendor-id" - :vendor/default-account "account-id"} - {:account/name "Account" - :account/numeric-code 123 - :account/invoice-allowance :allowance/allowed - :db/id "account-id"}]))] + (let [{:strs [test-vendor-id test-client-id test-account-id + denied-account-id vendor-account-id vendor-with-special-account]} + (setup-test-data [(test-account :db/id "denied-account-id" + :account/invoice-allowance :allowance/denied) + (test-account :db/id "vendor-account-id" + :account/invoice-allowance :allowance/denied + :account/vendor-allowance :allowance/allowed) + (test-vendor :db/id "vendor-with-special-account" + :vendor/default-account "vendor-account-id")])] (is (some? (sut/add-invoice {:id (admin-token)} - {:invoice {:client_id client-id - :vendor_id vendor-id + {:invoice {:client_id test-client-id + :vendor_id test-vendor-id :invoice_number "123" :date #clj-time/date-time "2022-01-01" :total 10.00 :expense_accounts [{:amount 10.0 :location "DT" - :account_id account-id}]}} + :account_id test-account-id}]}} nil))) (testing "It should prevent an expense account that isn't allowed" - (let [{:strs [denied-account-id]} - (:tempids @(d/transact conn [ - {:account/name "Account" - :account/numeric-code 123 - :account/invoice-allowance :allowance/denied - :db/id "denied-account-id"}]))] - (is (thrown? Exception (sut/add-invoice {:id (admin-token)} - {:invoice {:client_id client-id - :vendor_id vendor-id - :invoice_number "789" - :date #clj-time/date-time "2022-01-01" - :total 10.00 - :expense_accounts [{:amount 10.0 - :location "DT" - :account_id denied-account-id}]}} - nil))))) + (is (thrown? Exception (sut/add-invoice {:id (admin-token)} + {:invoice {:client_id test-client-id + :vendor_id test-vendor-id + :invoice_number "789" + :date #clj-time/date-time "2022-01-01" + :total 10.00 + :expense_accounts [{:amount 10.0 + :location "DT" + :account_id denied-account-id}]}} + nil)))) (testing "It should allow an expense account that is valid for the vendor" - (let [{:strs [vendor-account-id vendor-2]} - (:tempids @(d/transact conn [ - {:account/name "Account" - :account/numeric-code 123 - :account/invoice-allowance :allowance/denied - :account/vendor-allowance :allowance/allowed - :db/id "vendor-account-id"} - {:vendor/name "Testy" - :vendor/default-account "vendor-account-id" - :db/id "vendor-2"}]))] - (is (some? (sut/add-invoice {:id (admin-token)} - {:invoice {:client_id client-id - :vendor_id vendor-2 - :invoice_number "456" - :date #clj-time/date-time "2022-01-01" - :total 10.00 - :expense_accounts [{:amount 10.0 - :location "DT" - :account_id vendor-account-id}]}} - nil)))))))) + (is (some? (sut/add-invoice {:id (admin-token)} + {:invoice {:client_id test-client-id + :vendor_id vendor-with-special-account + :invoice_number "456" + :date #clj-time/date-time "2022-01-01" + :total 10.00 + :expense_accounts [{:amount 10.0 + :location "DT" + :account_id vendor-account-id}]}} + nil))))))) + +(deftest edit-invoice + (testing "It should edit invoices" + (let [{:strs [invoice-id + new-vendor-id + new-account-id]} + (setup-test-data [(test-invoice :db/id "invoice-id") + (test-vendor :db/id "new-vendor-id") + (test-account :db/id "new-account-id")])] + (is (some? (sut/edit-invoice {:id (admin-token)} + {:invoice {:id invoice-id + :vendor_id new-vendor-id + :invoice_number "890213" + :date #clj-time/date-time "2023-01-01" + :total 100.00 + :outstanding_balance 100.00 + :expense_accounts [{:amount 100.0 + :location "DT" + :account_id new-account-id}]}} + nil))) + (is (= #:invoice{:invoice-number "890213" + :date #inst "2023-01-01T00:00:00.000-00:00" + :total 100.0 + :expense-accounts + [#:invoice-expense-account{:amount 100.0 + :location "DT" + :account {:db/id new-account-id}}]} + (d/pull (d/db conn) [:invoice/invoice-number + :invoice/date + :invoice/total + {:invoice/expense-accounts [:invoice-expense-account/amount + :invoice-expense-account/location + :invoice-expense-account/account]}] + invoice-id))) + + (testing "Should not be able to change vendor" + (is (not= new-vendor-id (:db/id (:invoice/vendor (d/pull (d/db conn) [:invoice/vendor] invoice-id)))))))) + + (testing "Should disallow adding a conflicting invoice" + (let [{:strs [invoice-id]} + (setup-test-data [(test-invoice :db/id "invoice-id" + :invoice/invoice-number "original-invoice" + :invoice/vendor "test-vendor-id" + :invoice/client "test-client-id") + (test-invoice :db/id "extant-invoice-id" + :invoice/invoice-number "already taken" + :invoice/vendor "test-vendor-id" + :invoice/client "test-client-id")])] + (is (thrown? Exception (sut/edit-invoice {:id (admin-token)} + {:invoice {:id invoice-id + :invoice_number "already taken"}} + nil)))))) + +(deftest edit-expense-accounts + (testing "It should edit expense accounts" + (let [{:strs [invoice-id + new-account-id]} + (setup-test-data [(test-invoice :db/id "invoice-id") + (test-account :db/id "new-account-id")])] + (is (some? (sut/edit-expense-accounts {:id (admin-token)} + {:invoice_id invoice-id + :expense_accounts [{:amount 100.0 + :account_id new-account-id + :location "DT"}]} + nil))) + (is (= [#:invoice-expense-account{:amount 100.0 + :location "DT" + :account {:db/id new-account-id}}] + (-> (d/pull (d/db conn) [{:invoice/expense-accounts [:invoice-expense-account/amount + :invoice-expense-account/location + :invoice-expense-account/account]}] + invoice-id) + :invoice/expense-accounts)))))) + +(deftest bulk-change-invoices + (testing "It should change expense accounts in bulk" + (let [{:strs [invoice-id + new-account-id + test-client-id]} + (setup-test-data [(test-invoice :db/id "invoice-id") + (test-account :db/id "new-account-id")])] + (is (some? (sut/bulk-change-invoices {:id (admin-token)} + {:client_id test-client-id + :filters {:client_id test-client-id} + :accounts [{:percentage 1.0 + :account_id new-account-id + :location "Shared"}]} + nil))) + (is (= [#:invoice-expense-account{:amount 100.0 + :location "DT" + :account {:db/id new-account-id}}] + (-> (d/pull (d/db conn) [{:invoice/expense-accounts [:invoice-expense-account/amount + :invoice-expense-account/location + :invoice-expense-account/account]}] + invoice-id) + :invoice/expense-accounts)))))) + +(deftest void-invoices + (testing "It should voide invoices in bulk" + (let [{:strs [invoice-id test-client-id]} + (setup-test-data [(test-invoice :db/id "invoice-id" + :invoice/status :invoice-status/unpaid) + (test-account :db/id "new-account-id")])] + + (is (some? (sut/void-invoices {:id (admin-token)} + {:filters {:client_id test-client-id}} + nil))) + (is (= :invoice-status/voided + (-> (d/pull (d/db conn) [{:invoice/status [:db/ident]}] + invoice-id) + :invoice/status + :db/ident))) + + (testing "Should unvoid invoice" + (is (some? (sut/unvoid-invoice {:id (admin-token)} + {:invoice_id invoice-id} + nil))) + (is (= :invoice-status/unpaid + (-> (d/pull (d/db conn) [{:invoice/status [:db/ident]}] + invoice-id) + :invoice/status + :db/ident))))))) + + +(deftest void-invoice + (testing "It should voide invoices in bulk" + (let [{:strs [invoice-id]} + (setup-test-data [(test-invoice :db/id "invoice-id" + :invoice/status :invoice-status/unpaid) + (test-account :db/id "new-account-id")])] + + + (is (some? (sut/void-invoice {:id (admin-token)} + {:invoice_id invoice-id} + nil))) + (is (= :invoice-status/voided + (-> (d/pull (d/db conn) [{:invoice/status [:db/ident]}] + invoice-id) + :invoice/status + :db/ident))) + + (testing "Should unvoid invoice" + (is (some? (sut/unvoid-invoice {:id (admin-token)} + {:invoice_id invoice-id} + nil))) + (is (= :invoice-status/unpaid + (-> (d/pull (d/db conn) [{:invoice/status [:db/ident]}] + invoice-id) + :invoice/status + :db/ident))))))) diff --git a/test/clj/auto_ap/integration/util.clj b/test/clj/auto_ap/integration/util.clj index a351ec68..0be9ad7a 100644 --- a/test/clj/auto_ap/integration/util.clj +++ b/test/clj/auto_ap/integration/util.clj @@ -43,7 +43,8 @@ (defn test-vendor [& kwargs] (apply assoc {:db/id "vendor-id" - :vendor/name "Vendorson"} + :vendor/name "Vendorson" + :vendor/default-account "test-account-id"} kwargs)) (defn test-bank-account [& kwargs] @@ -75,7 +76,10 @@ (apply assoc {:db/id "test-invoice-id" :invoice/date #inst "2022-01-01" :invoice/client "test-client-id" + :invoice/status :invoice-status/unpaid + :invoice/import-status :import-status/imported :invoice/total 100.0 + :invoice/outstanding-balance 100.00 :invoice/vendor "test-vendor-id" :invoice/invoice-number (str "INVOICE " (rand-int 1000000)) :invoice/expense-accounts [{:invoice-expense-account/account "test-account-id"