Files
eREQ/test/clj/org/parkerici/sample_tracking/test_utils.clj

165 lines
6.4 KiB
Clojure

(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)))