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:
109
test/clj/auto_ap/company/profile_test.clj
Normal file
109
test/clj/auto_ap/company/profile_test.clj
Normal file
@@ -0,0 +1,109 @@
|
||||
(ns auto-ap.company.profile-test
|
||||
(:require
|
||||
[auto-ap.datomic :refer [conn]]
|
||||
[auto-ap.integration.util :refer [admin-token setup-test-data test-client test-payment test-vendor user-token wrap-setup]]
|
||||
[auto-ap.permissions :as permissions]
|
||||
[auto-ap.ssr.company :as company]
|
||||
[clojure.string :as str]
|
||||
[clojure.test :refer [deftest is testing use-fixtures]]
|
||||
[datomic.api :as dc]))
|
||||
|
||||
(use-fixtures :each wrap-setup)
|
||||
|
||||
;; ============================================================================
|
||||
;; Company Profile - Display Behaviors
|
||||
;; ============================================================================
|
||||
|
||||
(deftest test-download-vendor-list-button
|
||||
(testing "Behavior 1.6: It should show a download link to the vendor list export"
|
||||
(let [{:strs [test-client-id]} (setup-test-data
|
||||
[(test-client :db/id "test-client-id"
|
||||
:client/code "TEST01")])
|
||||
response (company/page {:identity (user-token test-client-id)
|
||||
:client {:db/id test-client-id}
|
||||
:clients [{:db/id test-client-id}]
|
||||
:trimmed-clients [test-client-id]})]
|
||||
(is (= 200 (:status response)))
|
||||
(is (re-find #"Download vendor list" (:body response)))
|
||||
(is (re-find #"/api/vendors/company/export" (:body response))))))
|
||||
|
||||
;; ============================================================================
|
||||
;; Company Profile - Signature Behaviors
|
||||
;; ============================================================================
|
||||
|
||||
(deftest test-signature-section-visibility
|
||||
(testing "Behavior 2.1: It should show the signature section only when the user has signature edit permission"
|
||||
(let [{:strs [test-client-id]} (setup-test-data
|
||||
[(test-client :db/id "test-client-id"
|
||||
:client/code "TEST01")])]
|
||||
;; Admin user should see signature section
|
||||
(testing "Admin user sees signature section"
|
||||
(let [response (company/page {:identity (admin-token)
|
||||
:client {:db/id test-client-id}
|
||||
:clients [{:db/id test-client-id}]
|
||||
:trimmed-clients [test-client-id]})]
|
||||
(is (= 200 (:status response)))
|
||||
(is (re-find #"Signature" (:body response)))))
|
||||
|
||||
;; Regular user with signature edit permission should see signature section
|
||||
(testing "Regular user with signature permission sees signature section"
|
||||
(let [response (company/page {:identity (user-token test-client-id)
|
||||
:client {:db/id test-client-id}
|
||||
:clients [{:db/id test-client-id}]
|
||||
:trimmed-clients [test-client-id]})]
|
||||
(is (= 200 (:status response)))
|
||||
(is (re-find #"Signature" (:body response)))))
|
||||
|
||||
;; Read-only user should NOT see signature section
|
||||
(testing "Read-only user does not see signature section"
|
||||
(let [response (company/page {:identity {:user "READONLY"
|
||||
:exp (clj-time.core/plus (clj-time.core/now) (clj-time.core/days 1))
|
||||
:user/role "read-only"
|
||||
:user/name "READONLY"
|
||||
:user/clients [{:db/id test-client-id}]}
|
||||
:client {:db/id test-client-id}
|
||||
:clients [{:db/id test-client-id}]
|
||||
:trimmed-clients [test-client-id]})]
|
||||
(is (= 200 (:status response)))
|
||||
(is (not (re-find #"Signature" (:body response)))))))))
|
||||
|
||||
(deftest test-invalid-signature-rejected
|
||||
(testing "Behavior 2.6: It should reject invalid signature image data with a validation error"
|
||||
(let [{:strs [test-client-id]} (setup-test-data
|
||||
[(test-client :db/id "test-client-id"
|
||||
:client/code "TEST01")])]
|
||||
;; Invalid signature data (not starting with data:image/png;base64,)
|
||||
(testing "Signature data without proper prefix is rejected"
|
||||
(is (thrown-with-msg? Exception #"Invalid signature image"
|
||||
(company/upload-signature-data
|
||||
{:identity (user-token test-client-id)
|
||||
:client {:db/id test-client-id}
|
||||
:form-params {"signatureData" "invalid-data"}}))))
|
||||
|
||||
;; Empty signature data should be handled gracefully
|
||||
(testing "Empty signature data is handled gracefully"
|
||||
(let [response (company/upload-signature-data
|
||||
{:identity (user-token test-client-id)
|
||||
:client {:db/id test-client-id}
|
||||
:form-params {"signatureData" nil}})]
|
||||
(is (or (nil? response)
|
||||
(= 200 (:status response)))))))))
|
||||
|
||||
(deftest test-signature-upload-refreshes-section
|
||||
(testing "Behavior 2.9: It should refresh the signature section with the uploaded image on successful upload"
|
||||
(let [{:strs [test-client-id]} (setup-test-data
|
||||
[(test-client :db/id "test-client-id"
|
||||
:client/code "TEST01")])
|
||||
valid-signature-data "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="]
|
||||
(with-redefs [amazonica.aws.s3/put-object (fn [& _] nil)]
|
||||
(let [response (company/upload-signature-data
|
||||
{:identity (user-token test-client-id)
|
||||
:client {:db/id test-client-id}
|
||||
:form-params {"signatureData" valid-signature-data}})]
|
||||
(is (= 200 (:status response)))
|
||||
;; The response should contain the refreshed signature section
|
||||
(is (re-find #"Signature" (:body response)))
|
||||
;; Verify the client now has a signature file URL in the database
|
||||
(let [client (dc/pull (dc/db conn) [:client/signature-file] test-client-id)]
|
||||
(is (some? (:client/signature-file client)))
|
||||
(is (str/starts-with? (:client/signature-file client) "https://"))))))))
|
||||
Reference in New Issue
Block a user