First commit. Taken from open source branch of internal sample-tracking application.

This commit is contained in:
Robert Schiemann
2023-03-08 10:11:42 -07:00
parent fa491f63de
commit fe0946c53a
220 changed files with 15808 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
(ns org.parkerici.sample-tracking.api.export-test
(:require [clojure.test :refer :all]
[clojure.data.csv :as csv]
[ring.mock.request :as rm]
[org.parkerici.sample-tracking.test-utils :as tu]))
(deftest export-collected-samples-test
[]
(let [kit-request-body (tu/kit-request-body)
create-response (tu/standard-web-app (-> (rm/request :post "/api/kit")
(rm/json-body kit-request-body)))
created-uuid (tu/get-response-uuid create-response)
export-response (tu/admin-authed-web-app (rm/request :get "/api/sample/export" {:uuid created-uuid}))
export-csv (csv/read-csv (slurp (:body export-response)))]
(is (= 4 (count export-csv)))
(is (= 23 (count (first export-csv))))))
(deftest export-all-samples-test
[]
(let [kit-request-body (tu/kit-request-body)
create-response (tu/standard-web-app (-> (rm/request :post "/api/kit")
(rm/json-body kit-request-body)))
created-uuid (tu/get-response-uuid create-response)
export-response (tu/admin-authed-web-app
(rm/request :get "/api/sample/export" {:uuid created-uuid :uncollected true}))
export-csv (csv/read-csv (slurp (:body export-response)))]
(is (= 15 (count export-csv)))
(is (= 23 (count (first export-csv))))))

View File

@@ -0,0 +1,91 @@
(ns org.parkerici.sample-tracking.api.kit-test
(:require [clojure.test :refer :all]
[ring.mock.request :as rm]
[org.parkerici.sample-tracking.test-utils :as tu]))
(deftest create-kit-test
[]
(let [initial-kit-list (tu/get-kit-list {:complete "true"})
kit-request-body (tu/kit-request-body)
create-response (tu/standard-web-app (-> (rm/request :post "/api/kit")
(rm/json-body kit-request-body)))
created-uuid (tu/get-response-uuid create-response)
post-create-kit-list (tu/get-kit-list {:complete "true"})
created-kit (first (filter #(= (:uuid %) created-uuid) post-create-kit-list))]
(is (some? created-uuid))
(is (some? created-kit))
(is (= 1 (- (count post-create-kit-list) (count initial-kit-list))))))
(deftest share-kit-test
[]
(let [initial-incomplete-kit-list (tu/get-kit-list {:complete "false"})
initial-complete-kit-list (tu/get-kit-list {:complete "true"})
complete-kit-request-body (tu/kit-request-body)
share-kit-request-body (dissoc complete-kit-request-body :samples :completing-email)
share-response (tu/standard-web-app (-> (rm/request :post "/api/kit/share")
(rm/json-body share-kit-request-body)))
shared-uuid (tu/get-response-uuid share-response)
created-kit (first (tu/get-response-items (tu/standard-web-app (rm/request :get "/api/kit/share" {:uuid shared-uuid}))))
post-share-incomplete-kit-list (tu/get-kit-list {:complete "false"})
shared-kit-from-list (first (filter #(= (:uuid %) shared-uuid) post-share-incomplete-kit-list))
submit-response (tu/standard-web-app (-> (rm/request :post "/api/kit")
(rm/json-body (assoc complete-kit-request-body :uuid shared-uuid))))
submitted-uuid (tu/get-response-uuid submit-response)
submitted-kit-from-share (first (tu/get-response-items (tu/standard-web-app (rm/request :get "/api/kit/share" {:uuid shared-uuid}))))
post-submitted-incomplete-kit-list (tu/get-kit-list {:complete "false"})
post-submitted-complete-kit-list (tu/get-kit-list {:complete "true"})
incomplete-submitted-kit (first (filter #(= (:uuid %) shared-uuid) post-submitted-incomplete-kit-list))
complete-submitted-kit (first (filter #(= (:uuid %) shared-uuid) post-submitted-complete-kit-list))]
(is (some? shared-uuid))
(is (some? submitted-uuid))
(= shared-uuid submitted-uuid) ; The UUID returned from the share endpoint should stay the same after submitting
(is (some? created-kit))
(is (some? shared-kit-from-list))
(is (nil? submitted-kit-from-share)) ; Users should not be able to access a submitted kit via share
(is (nil? incomplete-submitted-kit)) ; Submitted kit should not be available in incomplete list
(is (some? complete-submitted-kit))
(is (= 1 (- (count post-share-incomplete-kit-list) (count initial-incomplete-kit-list))))
(is (= 1 (- (count post-submitted-complete-kit-list) (count initial-complete-kit-list))))))
(deftest edit-kit-test
[]
(let [kit-request-body (tu/kit-request-body)
create-response (tu/standard-web-app (-> (rm/request :post "/api/kit")
(rm/json-body kit-request-body)))
created-uuid (tu/get-response-uuid create-response)
edit-kit-request-body (-> kit-request-body
(assoc :uuid created-uuid)
(assoc :kit-id "87654321"))
edit-response (tu/admin-authed-web-app (-> (rm/request :patch "/api/kit")
(rm/json-body edit-kit-request-body)))
edited-uuid (tu/get-response-uuid edit-response)
edited-kit (first (tu/get-kit-list {:uuid edited-uuid}))
edited-kit-history (tu/get-entity-history edited-uuid)]
(is (some? created-uuid))
(is (some? edited-uuid))
(is (= created-uuid edited-uuid)) ; The UUID returned from the edit endpoint should stay the same after submitting
(is (= (:kit-id edit-kit-request-body) (:kit-id edited-kit)))
(is (= 1 (count edited-kit-history)))))
(deftest archive-kit-test
(let [kit-request-body (tu/kit-request-body)
create-response (tu/standard-web-app (-> (rm/request :post "/api/kit")
(rm/json-body kit-request-body)))
created-uuid (tu/get-response-uuid create-response)
pre-archive-archived-kit-list (tu/get-kit-list {:archived "true"})
_ (tu/admin-authed-web-app (rm/request :patch "/api/kit/set-archived" {:uuid created-uuid :archived "true"}))
post-archive-archived-kit-list (tu/get-kit-list {:archived "true"})
archived-kit (first (filter #(= (:uuid %) created-uuid) post-archive-archived-kit-list))
_ (tu/admin-authed-web-app (rm/request :patch "/api/kit/set-archived" {:uuid created-uuid :archived "false"}))
post-unarchive-archived-kit-list (tu/get-kit-list {:archived "true"})
missing-archived-kit (first (filter #(= (:uuid %) created-uuid) post-unarchive-archived-kit-list))
post-unarchive-kit-list (tu/get-kit-list {})
unarchived-kit (first (filter #(= (:uuid %) created-uuid) post-unarchive-kit-list))
kit-history (tu/get-entity-history created-uuid)]
(is (some? created-uuid))
(is (= 1 (- (count post-archive-archived-kit-list) (count pre-archive-archived-kit-list))))
(is (= 1 (- (count post-archive-archived-kit-list) (count post-unarchive-archived-kit-list))))
(is (some? archived-kit))
(is (nil? missing-archived-kit))
(is (some? unarchived-kit))
(is (= 2 (count kit-history)))))

View File

@@ -0,0 +1,59 @@
(ns org.parkerici.sample-tracking.api.list-test
(:require [clojure.test :refer :all]
[org.parkerici.sample-tracking.test-utils :as tu]))
(defn list-studies-test
[study-name]
(let [studies-list (tu/get-studies-list)
pici0014-study (tu/get-element-with-name studies-list study-name)]
(is (= 4 (count studies-list)))
(is (some? pici0014-study))
pici0014-study))
(defn list-sites-test
[study site-name]
(let [sites-list (tu/get-sites-list (:uuid study))
mskcc-site (tu/get-element-with-name sites-list site-name)]
(is (= 4 (count sites-list)))
(is (some? mskcc-site))
mskcc-site))
(defn list-cohorts-test
[study cohort-name]
(let [cohorts-list (tu/get-cohorts-list (:uuid study))
na-cohort (tu/get-element-with-name cohorts-list cohort-name)]
(is (= 1 (count cohorts-list)))
(is (some? na-cohort))
na-cohort))
(defn list-kit-types-test
[cohort kit-type-name]
(let [kit-types-list (tu/get-kit-types-list (:uuid cohort))
blood-serum-kit (tu/get-element-with-name kit-types-list kit-type-name)]
(is (= 6 (count kit-types-list)))
(is (some? blood-serum-kit))
blood-serum-kit))
(defn list-timepoints-test
[kit-type]
(let [timepoints-list (tu/get-timepoint-list (:uuid kit-type))]
(is (= 7 (count timepoints-list)))))
(defn list-sample-types-test
[kit-type]
(let [sample-types-list (tu/get-sample-types-list (:uuid kit-type))]
(is (= 14 (count sample-types-list)))))
(defn list-form-types-test
[kit-type]
(let [form-types-list (tu/get-form-types-list (:uuid kit-type))]
(is (= 1 (count form-types-list)))))
(deftest list-tests
(let [study (list-studies-test "STUDY13")
cohort (list-cohorts-test study "N/A")
kit-type (list-kit-types-test cohort "STUDY13 Blood-Serum Manifest Form")]
(list-sites-test study "CCCC")
(list-timepoints-test kit-type)
(list-sample-types-test kit-type)
(list-form-types-test kit-type)))

View File

@@ -0,0 +1,94 @@
(ns org.parkerici.sample-tracking.api.propose-edits-test
(:require [clojure.test :refer :all]
[ring.mock.request :as rm]
[org.parkerici.sample-tracking.test-utils :as tu]
[clojure.edn :as edn]))
(deftest propose-edit-kit-test
[]
(let [kit-request-body (tu/kit-request-body)
create-response (tu/standard-web-app (-> (rm/request :post "/api/kit")
(rm/json-body kit-request-body)))
created-uuid (tu/get-response-uuid create-response)
initial-pending-proposed-edits (tu/get-proposed-kit-edit-list {:status "pending"})
propose-edit-kit-request-body (-> kit-request-body
(assoc :uuid created-uuid)
(assoc :kit-id "87654321"))
_propose-edit-response (tu/site-coordinator-authed-web-app (-> (rm/request :post "/api/kit/propose-edit")
(rm/json-body propose-edit-kit-request-body)))
pending-proposed-edits (tu/get-proposed-kit-edit-list {:status "pending"})]
(is (= 1 (- (count pending-proposed-edits) (count initial-pending-proposed-edits))))))
(deftest approve-propose-edit-kit-test
[]
(let [kit-request-body (tu/kit-request-body)
create-response (tu/standard-web-app (-> (rm/request :post "/api/kit")
(rm/json-body kit-request-body)))
created-uuid (tu/get-response-uuid create-response)
propose-edit-kit-request-body (-> kit-request-body
(assoc :uuid created-uuid)
(assoc :kit-id "87654321"))
propose-edit-response (tu/site-coordinator-authed-web-app (-> (rm/request :post "/api/kit/propose-edit")
(rm/json-body propose-edit-kit-request-body)))
propose-edit-uuid (tu/get-response-uuid propose-edit-response)
initial-approved-proposed-edits (tu/get-proposed-kit-edit-list {:status "approved"})
_set-edit-status-response (tu/admin-authed-web-app (rm/request :post "/api/kit/propose-edit/set-status"
{:uuid propose-edit-uuid :status "approved"}))
approved-proposed-edits (tu/get-proposed-kit-edit-list {:status "approved"})
edited-kit (first (tu/get-kit-list {:uuid created-uuid}))
edited-kit-history (tu/get-entity-history created-uuid)]
(is (= 1 (- (count approved-proposed-edits) (count initial-approved-proposed-edits))))
(is (= (:kit-id propose-edit-kit-request-body) (:kit-id edited-kit)))
(is (= 1 (count edited-kit-history)))))
(deftest deny-propose-edit-kit-test
[]
(let [kit-request-body (tu/kit-request-body)
create-response (tu/standard-web-app (-> (rm/request :post "/api/kit")
(rm/json-body kit-request-body)))
created-uuid (tu/get-response-uuid create-response)
propose-edit-kit-request-body (-> kit-request-body
(assoc :uuid created-uuid)
(assoc :kit-id "87654321"))
propose-edit-response (tu/site-coordinator-authed-web-app (-> (rm/request :post "/api/kit/propose-edit")
(rm/json-body propose-edit-kit-request-body)))
propose-edit-uuid (tu/get-response-uuid propose-edit-response)
initial-approved-proposed-edits (tu/get-proposed-kit-edit-list {:status "denied"})
_set-edit-status-response (tu/admin-authed-web-app (rm/request :post "/api/kit/propose-edit/set-status"
{:uuid propose-edit-uuid :status "denied"}))
denied-proposed-edits (tu/get-proposed-kit-edit-list {:status "denied"})
edited-kit (first (tu/get-kit-list {:uuid created-uuid}))
edited-kit-history (tu/get-entity-history created-uuid)]
(is (= 1 (- (count denied-proposed-edits) (count initial-approved-proposed-edits))))
(is (= (:kit-id kit-request-body) (:kit-id edited-kit)))
(is (= 0 (count edited-kit-history)))))
(deftest edit-proposed-edit-test
[]
(let [kit-request-body (tu/kit-request-body)
create-response (tu/standard-web-app (-> (rm/request :post "/api/kit")
(rm/json-body kit-request-body)))
created-kit-uuid (tu/get-response-uuid create-response)
initial-pending-proposed-edits (tu/get-proposed-kit-edit-list {:status "pending"})
first-propose-edit-kit-request-body (-> kit-request-body
(assoc :uuid created-kit-uuid)
(assoc :kit-id "87654321"))
first-propose-edit-response (tu/site-coordinator-authed-web-app (-> (rm/request :post "/api/kit/propose-edit")
(rm/json-body first-propose-edit-kit-request-body)))
first-proposed-edit-uuid (tu/get-response-uuid first-propose-edit-response)
first-pending-proposed-edits (tu/get-proposed-kit-edit-list {:status "pending"})
final-kit-id "12344321"
final-propose-edit-kit-request-body (-> kit-request-body
(assoc :uuid created-kit-uuid)
(assoc :kit-id final-kit-id))
final-propose-edit-response (tu/site-coordinator-authed-web-app (-> (rm/request :post "/api/kit/propose-edit")
(rm/json-body final-propose-edit-kit-request-body)))
final-proposed-edit-uuid (tu/get-response-uuid final-propose-edit-response)
final-pending-proposed-edits (tu/get-proposed-kit-edit-list {:status "pending"})
final-pending-edits-for-kit (filter #(= created-kit-uuid (:kit-uuid %)) final-pending-proposed-edits)
final-pending-edit-update-map (edn/read-string (:update-map (first final-pending-edits-for-kit)))]
(is (= 1 (- (count first-pending-proposed-edits) (count initial-pending-proposed-edits))))
(is (= first-proposed-edit-uuid final-proposed-edit-uuid))
(is (= 0 (- (count first-pending-proposed-edits) (count final-pending-proposed-edits))))
(is (= 1 (count final-pending-edits-for-kit)))
(is (= (:kit-id final-pending-edit-update-map) final-kit-id))))

View File

@@ -0,0 +1,88 @@
(ns org.parkerici.sample-tracking.api.set-active-test
(:require [clojure.test :refer :all]
[ring.mock.request :as rm]
[org.parkerici.sample-tracking.test-utils :as tu]))
(defn toggle-study-active-test
[study-name]
(let [studies-list (tu/get-studies-list)
toggling-study (tu/get-element-with-name studies-list study-name)
_ (tu/admin-authed-web-app (-> (rm/request :post "/api/set-active")
(rm/json-body {:study (:uuid toggling-study) :active "false"})))
post-toggle-studies-list (tu/get-studies-list)
inactive-study (tu/get-element-with-name post-toggle-studies-list study-name)
_ (tu/admin-authed-web-app (-> (rm/request :post "/api/set-active")
(rm/json-body {:study (:uuid toggling-study) :active "true"})))
reverted-studies-list (tu/get-studies-list)
reactivated-study (tu/get-element-with-name reverted-studies-list study-name)]
(is (= 4 (count studies-list)))
(is (= 3 (count post-toggle-studies-list)))
(is (= 4 (count reverted-studies-list)))
(is (some? toggling-study))
(is (nil? inactive-study))
(is (some? reactivated-study))
toggling-study))
(defn toggle-site-active-test
[study site-name]
(let [sites-list (tu/get-sites-list (:uuid study))
toggling-site (tu/get-element-with-name sites-list site-name)
_ (tu/admin-authed-web-app (-> (rm/request :post "/api/set-active")
(rm/json-body {:study (:uuid study) :site (:uuid toggling-site) :active "false"})))
post-toggle-sites-list (tu/get-sites-list (:uuid study))
inactive-site (tu/get-element-with-name post-toggle-sites-list site-name)
_ (tu/admin-authed-web-app (-> (rm/request :post "/api/set-active")
(rm/json-body {:study (:uuid study) :site (:uuid toggling-site) :active "true"})))
reverted-sites-list (tu/get-sites-list (:uuid study))
reverted-site (tu/get-element-with-name reverted-sites-list site-name)]
(is (= 4 (count sites-list)))
(is (= 3 (count post-toggle-sites-list)))
(is (= 4 (count reverted-sites-list)))
(is (some? toggling-site))
(is (nil? inactive-site))
(is (some? reverted-site))))
(defn toggle-cohort-active-test
[study cohort-name]
(let [cohorts-list (tu/get-cohorts-list (:uuid study))
toggling-cohort (tu/get-element-with-name cohorts-list cohort-name)
_ (tu/admin-authed-web-app (-> (rm/request :post "/api/set-active")
(rm/json-body {:study (:uuid study) :cohort (:uuid toggling-cohort) :active "false"})))
post-toggle-cohorts-list (tu/get-cohorts-list (:uuid study))
inactive-cohort (tu/get-element-with-name post-toggle-cohorts-list cohort-name)
_ (tu/admin-authed-web-app (-> (rm/request :post "/api/set-active")
(rm/json-body {:study (:uuid study) :cohort (:uuid toggling-cohort) :active "true"})))
reverted-cohorts-list (tu/get-cohorts-list (:uuid study))
reverted-cohort (tu/get-element-with-name reverted-cohorts-list cohort-name)]
(is (= 1 (count cohorts-list)))
(is (= 0 (count post-toggle-cohorts-list)))
(is (= 1 (count reverted-cohorts-list)))
(is (some? toggling-cohort))
(is (nil? inactive-cohort))
(is (some? reverted-cohort))
toggling-cohort))
(defn toggle-kit-type-active-test
[cohort kit-type-name]
(let [kit-types-list (tu/get-kit-types-list (:uuid cohort))
toggling-kit-type (tu/get-element-with-name kit-types-list kit-type-name)
_ (tu/admin-authed-web-app (-> (rm/request :post "/api/set-active")
(rm/json-body {:kit-type (:uuid toggling-kit-type) :cohort (:uuid cohort) :active "false"})))
post-toggle-kit-types-list (tu/get-kit-types-list (:uuid cohort))
inactive-kit-type (tu/get-element-with-name post-toggle-kit-types-list kit-type-name)
_ (tu/admin-authed-web-app (-> (rm/request :post "/api/set-active")
(rm/json-body {:kit-type (:uuid toggling-kit-type) :cohort (:uuid cohort) :active "true"})))
reverted-kit-types-list (tu/get-kit-types-list (:uuid cohort))
reverted-kit-type (tu/get-element-with-name reverted-kit-types-list kit-type-name)]
(is (= 6 (count kit-types-list)))
(is (= 5 (count post-toggle-kit-types-list)))
(is (= 6 (count reverted-kit-types-list)))
(is (some? toggling-kit-type))
(is (nil? inactive-kit-type))
(is (some? reverted-kit-type))))
(deftest set-active-tests
(let [study (toggle-study-active-test "STUDY13")
cohort (toggle-cohort-active-test study "N/A")]
(toggle-site-active-test study "CCCC")
(toggle-kit-type-active-test cohort "STUDY13 Blood-Serum Manifest Form")))

View File

@@ -0,0 +1,13 @@
(ns org.parkerici.sample-tracking.schema-test
(:require [clojure.test :refer :all]
[org.parkerici.sample-tracking.db.schema :as sc]
[org.parkerici.alzabo.schema :as alz]
[org.parkerici.sample-tracking.test-utils :as tu]))
(deftest validate-schema
;; will throw error if invalid
(alz/validate-schema sc/schema))
(deftest test-datomic-schema
(tu/with-datomic-context
(sc/transact-schema)))

View File

@@ -0,0 +1,165 @@
(ns org.parkerici.sample-tracking.test-utils
(:require [ring.mock.request :as rm]
[cheshire.core :as json]
[org.parkerici.sample-tracking.db.datomic :as d]
[org.parkerici.sample-tracking.handler :as handlers]
[org.parkerici.sample-tracking.configuration :as config]))
(defmacro with-datomic-context [& body]
`(d/wrap-datomic-fn (fn [] ~@body)))
(def standard-web-app (handlers/make-app {:disable-logger true}))
(defn admin-auth-wrapper
[handler]
(fn [request]
(handler (let [current-session (:session request)
updated-session (merge current-session
{:identity "test@example.com"
:roles (set [(config/application-admin-role)])
:is-a-user true
:email-verified true})]
(assoc request :session updated-session)))))
(def admin-authed-web-app (handlers/make-app {:auth-wrapper admin-auth-wrapper :disable-logger true}))
(defn site-coordinator-auth-wrapper
[handler]
(fn [request]
(handler (let [current-session (:session request)
updated-session (merge current-session
{:identity "test@example.com"
:roles (set [(config/site-coordinator-role)])
:is-a-user true
:email-verified true})]
(assoc request :session updated-session)))))
(def site-coordinator-authed-web-app (handlers/make-app {:auth-wrapper admin-auth-wrapper :disable-logger true}))
(defn get-element-with-name
[list name]
(first (filter #(= (:name %) name) list)))
(defn get-response-items
[response]
(get-in (json/parse-string (:body response) true) [:data :items]))
(defn get-response-uuid
[response]
(get-in (json/parse-string (:body response) true) [:data :uuid]))
(defn get-studies-list
[]
(let [studies-response (standard-web-app (rm/request :get "/api/study" {:active "true"}))]
(get-response-items studies-response)))
(defn get-study-by-name
[study-name]
(let [studies-list (get-studies-list)]
(get-element-with-name studies-list study-name)))
(defn get-sites-list
[study-uuid]
(let [sites-response (standard-web-app (rm/request :get "/api/site" {:study study-uuid :active "true"}))]
(get-response-items sites-response)))
(defn get-site-by-name
[study-uuid site-name]
(let [sites-list (get-sites-list study-uuid)]
(get-element-with-name sites-list site-name)))
(defn get-cohorts-list
[study-uuid]
(let [cohorts-response (standard-web-app (rm/request :get "/api/cohort" {:study study-uuid :active "true"}))]
(get-response-items cohorts-response)))
(defn get-cohort-by-name
[study-uuid cohort-name]
(let [cohorts-list (get-cohorts-list study-uuid)]
(get-element-with-name cohorts-list cohort-name)))
(defn get-kit-types-list
[cohort-uuid]
(let [kit-types-response (standard-web-app (rm/request :get "/api/kit-type" {:cohort cohort-uuid :active "true"}))]
(get-response-items kit-types-response)))
(defn get-kit-type-by-name
[cohort-uuid kit-type-name]
(let [kit-types-list (get-kit-types-list cohort-uuid)]
(get-element-with-name kit-types-list kit-type-name)))
(defn get-timepoint-list
[kit-type-uuid]
(let [timepoints-response (standard-web-app (rm/request :get "/api/timepoint" {:kit-type kit-type-uuid}))]
(get-response-items timepoints-response)))
(defn get-timepoint-by-name
[kit-type-uuid timepoint-name]
(let [timepoint-list (get-timepoint-list kit-type-uuid)]
(get-element-with-name timepoint-list timepoint-name)))
(defn get-sample-types-list
[kit-type-uuid]
(let [sample-types-response (standard-web-app (rm/request :get "/api/sample-type" {:kit-type kit-type-uuid}))]
(get-response-items sample-types-response)))
(defn get-form-types-list
[kit-type-uuid]
(let [form-types-response (standard-web-app (rm/request :get "/api/form-type-fields" {:kit-type kit-type-uuid}))]
(get-response-items form-types-response)))
(defn get-kit-list
[params]
(let [kit-response (admin-authed-web-app (rm/request :get "/api/kit" params))]
(get-response-items kit-response)))
(defn get-proposed-kit-edit-list
[params]
(let [kit-response (admin-authed-web-app (rm/request :get "/api/kit/propose-edit/list" params))]
(get-response-items kit-response)))
(defn get-entity-history
[uuid]
(get-response-items (admin-authed-web-app (rm/request :get "/api/history" {:uuid uuid}))))
(defn get-sample-type-with-suffix
[sample-types suffix]
(first (filter #(= (:id-suffix %) suffix) sample-types)))
(defn build-create-sample-map
[sample-types]
(let [a01 (get-sample-type-with-suffix sample-types "-A01")
a02 (get-sample-type-with-suffix sample-types "-A02")
a12 (get-sample-type-with-suffix sample-types "-A12")]
{(keyword (:uuid a01)) {:collected true :sample-id "12345678-A01"}
(keyword (:uuid a02)) {:collected true :sample-id "BAZ-BAT"}
(keyword (:uuid a12)) {:collected true :shipped true :sample-id "12345678-A12"}}))
(defn build-create-request-body
[study site cohort kit-type timepoint sample-types]
{:study (:uuid study)
:site (:uuid site)
:cohort (:uuid cohort)
:kit-type (:uuid kit-type)
:timepoints [(:uuid timepoint)]
:samples (build-create-sample-map sample-types)
:kit-id "12345678"
:participant-id "STUDY13-101-0011"
:air-waybill "123456789012"
:completing-first-name "Foo"
:completing-last-name "Bar"
:completing-email "test@example.com"
:collection-timestamp "2020-12-01T21:13:00.000Z"
:timezone "America/Los_Angeles"
:comments "Comments go here"
:form-type-field-values {:processing-time "2020-12-01T22:14:00.000Z"}})
(defn kit-request-body
[]
(let [study (get-study-by-name "STUDY13")
site (get-site-by-name (:uuid study) "CCCC")
cohort (get-cohort-by-name (:uuid study) "N/A")
kit-type (get-kit-type-by-name (:uuid cohort) "STUDY13 Blood-Serum Manifest Form")
timepoint (get-timepoint-by-name (:uuid kit-type) "BL")
sample-types (get-sample-types-list (:uuid kit-type))]
(build-create-request-body study site cohort kit-type timepoint sample-types)))