Files
integreat/test/clj/auto_ap/company/profile_test.clj
Bryce 6b5d33a32f 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
2026-05-08 16:12:08 -07:00

110 lines
6.3 KiB
Clojure

(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://"))))))))