138 lines
7.6 KiB
Clojure
138 lines
7.6 KiB
Clojure
(ns iol-ion.integration.tx
|
|
(:require
|
|
[auto-ap.datomic :refer [conn]]
|
|
[auto-ap.integration.util
|
|
:refer [apply-tx setup-test-data test-invoice test-transaction wrap-setup]]
|
|
[clojure.test :as t :refer [deftest is testing use-fixtures]]
|
|
[datomic.api :as dc]
|
|
[iol-ion.tx.upsert-invoice :as sut-i]
|
|
[iol-ion.tx.upsert-transaction :as sut-t]))
|
|
|
|
(use-fixtures :each wrap-setup)
|
|
|
|
(def journal-pull [:journal-entry/date
|
|
:journal-entry/original-entity
|
|
:journal-entry/client
|
|
:journal-entry/source
|
|
:journal-entry/cleared
|
|
:journal-entry/amount
|
|
:journal-entry/vendor
|
|
{:journal-entry/line-items [{:journal-entry-line/account '[:account/name]}
|
|
:journal-entry-line/location
|
|
:journal-entry-line/credit
|
|
:journal-entry-line/dirty
|
|
:journal-entry-line/debit]}])
|
|
|
|
|
|
(deftest upsert-invoice
|
|
(testing "Importing should create a journal entry"
|
|
(let [{:strs [invoice-id
|
|
test-client-id
|
|
test-vendor-id
|
|
]} (setup-test-data
|
|
[(test-invoice :db/id "invoice-id"
|
|
:invoice/import-status :import-status/pending
|
|
:invoice/total 200.0
|
|
)])]
|
|
|
|
(is (nil? (:db/id (dc/pull (dc/db conn) journal-pull
|
|
[:journal-entry/original-entity invoice-id]))))
|
|
(let [db-after (apply-tx (sut-i/upsert-invoice
|
|
(dc/db conn)
|
|
{:db/id invoice-id
|
|
:invoice/import-status :import-status/imported}))]
|
|
|
|
(is (= #:journal-entry{:date #inst "2022-01-01T00:00:00.000-00:00",
|
|
:original-entity #:db{:id invoice-id},
|
|
:client #:db{:id test-client-id},
|
|
:line-items
|
|
[#:journal-entry-line{:account
|
|
#:account{:name
|
|
"Accounts Payable"},
|
|
:credit 200.0,
|
|
:location "A",
|
|
:dirty true}
|
|
#:journal-entry-line{:account
|
|
#:account{:name "Account"},
|
|
:location "DT",
|
|
:dirty true,
|
|
:debit 100.0}],
|
|
:source "invoice",
|
|
:cleared false,
|
|
:amount 200.0,
|
|
:vendor #:db{:id test-vendor-id}}
|
|
(dc/pull db-after journal-pull
|
|
[:journal-entry/original-entity invoice-id])))
|
|
|
|
(testing "voiding an invoice should remove the journal entry"
|
|
(let [db-after (apply-tx (sut-i/upsert-invoice
|
|
(dc/db conn)
|
|
{:db/id invoice-id
|
|
:invoice/status :invoice-status/voided}))]
|
|
|
|
(is (= nil
|
|
(dc/pull db-after journal-pull
|
|
[:journal-entry/original-entity invoice-id])))))
|
|
(testing "invoice should remove the journal entry"
|
|
(let [db-after (apply-tx (sut-i/upsert-invoice
|
|
(dc/db conn)
|
|
{:db/id invoice-id
|
|
:invoice/status :invoice-status/unpaid
|
|
:invoice/import-status :import-status/pending}))]
|
|
|
|
(is (= nil
|
|
(dc/pull db-after journal-pull
|
|
[:journal-entry/original-entity invoice-id])))))))))
|
|
|
|
(deftest upsert-transaction []
|
|
(testing "should upsert transaction"
|
|
(let [{:strs [test-client-id
|
|
test-bank-account-id
|
|
test-account-id
|
|
test-vendor-id
|
|
test-transaction-id
|
|
test-import-batch-id
|
|
]} (setup-test-data
|
|
[(test-transaction :db/id "test-transaction-id"
|
|
)
|
|
{:db/id "test-import-batch-id"
|
|
:import-batch/date #inst "2022-01-01"}])
|
|
update (sut-t/upsert-transaction (dc/db conn) {:db/id test-transaction-id
|
|
:transaction/id "hello"
|
|
:transaction/bank-account test-bank-account-id
|
|
:transaction/amount 500.00
|
|
:transaction/client test-client-id
|
|
:transaction/date #inst "2022-01-01"
|
|
:transaction/vendor test-vendor-id
|
|
:transaction/approval-status :transaction-approval-status/approved
|
|
:transaction/accounts [
|
|
{:db/id "account"
|
|
:transaction-account/account test-account-id
|
|
:transaction-account/location "A"
|
|
:transaction-account/amount 500.00}]})]
|
|
|
|
(is (nil? (:db/id (dc/pull (dc/db conn) journal-pull
|
|
[:journal-entry/original-entity test-transaction-id]))))
|
|
(let [db-after (apply-tx update)]
|
|
(testing "should create journal entry"
|
|
(is (= #:journal-entry{:date #inst "2022-01-01T00:00:00.000-00:00",
|
|
:original-entity #:db{:id test-transaction-id},
|
|
:client #:db{:id test-client-id},
|
|
:source "transaction",
|
|
:cleared true,
|
|
:amount 500.0,
|
|
:vendor #:db{:id test-vendor-id},
|
|
:line-items
|
|
[#:journal-entry-line{:location "A",
|
|
:dirty true,
|
|
:debit 500.0}
|
|
#:journal-entry-line{:account
|
|
#:account{:name "Account"},
|
|
:location "A",
|
|
:credit 500.0,
|
|
:dirty true}]}
|
|
(dc/pull db-after journal-pull
|
|
[:journal-entry/original-entity test-transaction-id])))))
|
|
|
|
)))
|