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:
2026-05-08 16:12:08 -07:00
parent d9d9263824
commit 6b5d33a32f
64 changed files with 9005 additions and 2086 deletions

View File

@@ -23,64 +23,60 @@
: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
)])]
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}}
(let [db-after (apply-tx (sut-i/upsert-invoice
(dc/db conn)
{:db/id invoice-id
:invoice/import-status :import-status/imported}))]
;; NOTE: upsert-ledger no longer sets :dirty true on line items automatically.
(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"}
#:journal-entry-line{:account
#:account{:name "Account"},
:location "DT",
: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/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/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])))))))))
@@ -91,47 +87,41 @@
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}]})]
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",
;; NOTE: upsert-ledger no longer sets :dirty true on line items automatically.
(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},
: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}
:debit 500.0}
#:journal-entry-line{:account
#:account{:name "Account"},
:location "A",
:credit 500.0,
:dirty true}]}
:credit 500.0}]}
(dc/pull db-after journal-pull
[:journal-entry/original-entity test-transaction-id])))))
)))
[:journal-entry/original-entity test-transaction-id]))))))))