Files
integreat/test/clj/auto_ap/ssr/admin/vendors_test.clj

138 lines
6.6 KiB
Clojure

(ns auto-ap.ssr.admin.vendors-test
(:require
[auto-ap.datomic :refer [conn]]
[auto-ap.integration.util :refer [admin-token
setup-test-data
test-account
test-client
test-vendor
user-token
wrap-setup]]
[auto-ap.ssr.admin.vendors :as sut]
[clojure.string :as str]
[clojure.test :refer [deftest is testing use-fixtures]]
[datomic.api :as dc]))
(use-fixtures :each wrap-setup)
(defn create-vendor
[name & {:as attrs}]
(merge
{:db/id (str "vendor-" (java.util.UUID/randomUUID))
:vendor/name name
:vendor/default-account "test-account-id"}
attrs))
(deftest vendor-grid-loads-with-empty-database
(testing "Vendor grid should handle empty database gracefully"
(let [[vendors matching-count] (sut/fetch-page {:query-params {:page 1 :per-page 10}})]
(is (seq? vendors))
(is (number? matching-count))
(is (= 0 (count vendors))))))
(deftest vendor-fetch-ids-returns-correct-structure
(testing "fetch-ids should return properly structured results"
(setup-test-data [(create-vendor "Test Vendor 1")
(create-vendor "Test Vendor 2")])
(let [db (dc/db conn)
result (sut/fetch-ids db {:query-params {:page 1 :per-page 10}})]
(is (contains? result :ids))
(is (contains? result :count))
(is (seq? (:ids result)))
(is (number? (:count result)))
(is (>= (:count result) 3)))))
(deftest vendor-fetch-page-returns-vendors
(testing "fetch-page should return vendors with proper structure"
(setup-test-data [(create-vendor "Page Test Vendor 1")
(create-vendor "Page Test Vendor 2")])
(let [[vendors matching-count] (sut/fetch-page {:query-params {:page 1 :per-page 10}})]
(is (number? matching-count))
(is (>= matching-count 3))
(when-some [vendor (first vendors)]
(is (contains? vendor :db/id))
(is (contains? vendor :vendor/name))
(is (contains? vendor :vendor/default-account))))))
(deftest vendor-hydrate-results-works
(testing "hydrate-results should properly hydrate vendor data"
(let [vendor-temp-id (str "vendor-" (rand-int 100000))
tempids (setup-test-data [(assoc (create-vendor "Hydrate Test Vendor")
:db/id vendor-temp-id)])
db (dc/db conn)
vendor-id (get tempids vendor-temp-id)
hydrated (sut/hydrate-results [vendor-id] db {})]
(is (= 1 (count hydrated)))
(let [vendor (first hydrated)]
(is (= vendor-id (:db/id vendor)))
(is (= "Hydrate Test Vendor" (:vendor/name vendor)))
(is (contains? vendor :vendor/default-account))))))
(deftest vendor-merge-transfers-references
(testing "Vendor merge should transfer all references from source to target"
(let [admin-identity (admin-token)
source-temp-id (str "vendor-source-" (rand-int 100000))
target-temp-id (str "vendor-target-" (rand-int 100000))
tempids (setup-test-data [(assoc (create-vendor "Source Vendor")
:db/id source-temp-id)
(assoc (create-vendor "Target Vendor")
:db/id target-temp-id)])
source-vendor-id (get tempids source-temp-id)
target-vendor-id (get tempids target-temp-id)
result (sut/merge-submit {:form-params {:source-vendor source-vendor-id
:target-vendor target-vendor-id}
:request-method :put
:identity admin-identity})]
(is (= 200 (:status result)))
(let [db (dc/db conn)
remaining-sources (dc/q '[:find ?e
:where [?e :vendor/name "Source Vendor"]]
db)]
(is (= 0 (count remaining-sources)))))))
(deftest vendor-merge-same-vendor-rejected
(testing "Vendor merge should reject when source and target are the same"
(let [admin-identity (admin-token)
vendor-temp-id (str "vendor-solo-" (rand-int 100000))
tempids (setup-test-data [(assoc (create-vendor "Solo Vendor")
:db/id vendor-temp-id)])
vendor-id (get tempids vendor-temp-id)]
(is (thrown-with-msg? clojure.lang.ExceptionInfo
#"Please select two different vendors"
(sut/merge-submit {:form-params {:source-vendor vendor-id
:target-vendor vendor-id}
:request-method :put
:identity admin-identity}))))))
(deftest vendor-merge-invalid-vendor-handled
(testing "Vendor merge should handle invalid vendor IDs gracefully"
(let [admin-identity (admin-token)
target-temp-id (str "vendor-target-" (rand-int 100000))
tempids (setup-test-data [(assoc (create-vendor "Valid Target Vendor")
:db/id target-temp-id)])
target-vendor-id (get tempids target-temp-id)
invalid-source-id 999999999
result (sut/merge-submit {:form-params {:source-vendor invalid-source-id
:target-vendor target-vendor-id}
:request-method :put
:identity admin-identity})]
(is (= 200 (:status result))))))
(deftest vendor-hydration-includes-all-fields
(testing "Vendor hydration should include all required fields"
(let [vendor-temp-id (str "vendor-complete-" (rand-int 100000))
tempids (setup-test-data [(assoc (create-vendor "Complete Vendor"
:vendor/print-as "CV Print Name"
:vendor/hidden false
:vendor/terms 30)
:db/id vendor-temp-id)])
db (dc/db conn)
vendor-id (get tempids vendor-temp-id)
hydrated (sut/hydrate-results [vendor-id] db {})
vendor (first hydrated)]
(is (some? vendor))
(is (= "Complete Vendor" (:vendor/name vendor)))
(is (= "CV Print Name" (:vendor/print-as vendor)))
(is (= false (:vendor/hidden vendor)))
(is (= 30 (:vendor/terms vendor))))))