Skip to content

Commit

Permalink
refactor: forms
Browse files Browse the repository at this point in the history
  • Loading branch information
thelissimus committed Jan 5, 2024
1 parent 5e17ec0 commit 6b2d364
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 68 deletions.
7 changes: 2 additions & 5 deletions shadow-cljs.edn
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
{:lein true
:source-paths
["src/challenge/frontend"
"src/challenge/common"
"test/challenge/frontend"]

:dev-http
{3000 "resources/public"
Expand All @@ -16,7 +12,7 @@
:modules
{:main {:init-fn challenge.frontend.core/init}}
:devtools
{:preloads [day8.re-frame-10x.preload]}
{:preloads [day8.re-frame-10x.preload devtools.preload]}
:dev
{:compiler-options
{:closure-defines
Expand All @@ -30,6 +26,7 @@

:test
{:target :browser-test
:devtools {:preloads [devtools.preload]}
:test-dir "resources/public/assets/js/test"}

:ci
Expand Down
4 changes: 2 additions & 2 deletions src/challenge/frontend/common/form.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
[:label {:for key}]
[:input (->> {:placeholder placeholder
:name key
:value @(reframe/subscribe [::subs/form form key])
:value (or @(reframe/subscribe [::subs/form form key]) "")
:on-change #(reframe/dispatch [::events/update-form
form
key
Expand All @@ -18,7 +18,7 @@

(defn select-view [key form placeholder options attrs]
[:select (merge {:name key
:value @(reframe/subscribe [::subs/form form key])
:value (or @(reframe/subscribe [::subs/form form key]) js/undefined)
:on-change #(reframe/dispatch [::events/update-form
form
key
Expand Down
7 changes: 1 addition & 6 deletions src/challenge/frontend/core.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,10 @@
(:require
[reagent.dom.client :refer [create-root render]]
[re-frame.core :as reframe]
[challenge.frontend.events :as events]
[challenge.frontend.routes :refer [setup-router]]
[challenge.frontend.view.index :refer [main-page]]))

(defn ^:dev/after-load mount-root []
(defn ^:dev/after-load init []
(reframe/clear-subscription-cache!)
(setup-router)
(render (create-root (.getElementById js/document "app")) [main-page]))

(defn init []
(reframe/dispatch-sync [::events/init-db])
(mount-root))
21 changes: 3 additions & 18 deletions src/challenge/frontend/events.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,21 @@
[challenge.frontend.env :refer [config]]
[challenge.frontend.lib :refer [clj->json]]))

;;; state

(reframe/reg-event-db
::init-db
(fn [_ _]
{:current-route nil
:patients-list []
:patients-query nil
:patient-current nil
:form-patient-create nil
:form-patient-update nil}))

;;; routing

;;; Routing
(reframe/reg-event-db
::navigated
(fn [db [_ newm]]
(let [oldm (:current-route db)
cs (apply-controllers (:controllers oldm) newm)]
(assoc db :current-route (assoc newm :controllers cs)))))

;;; form utils

;;; Form utils
(reframe/reg-event-db
::update-form
(fn [db [_ form key val]]
(assoc-in db [form key] val)))

;;; patients

;;; Patients
;; GET patients/
(reframe/reg-event-db
::fetch-patients-list-ok
Expand Down
4 changes: 0 additions & 4 deletions src/challenge/frontend/subs.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@
(:require
[re-frame.core :as reframe]))

(reframe/reg-sub
::db
identity)

(reframe/reg-sub
::current-route
(fn [db] (:current-route db)))
Expand Down
105 changes: 72 additions & 33 deletions test/challenge/frontend/core_test.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -17,47 +17,86 @@
["@testing-library/react" :refer [screen] :as rtl]
["@testing-library/dom" :refer [within]]))

;;; Utils
(defn with-render [elem f]
(let [mounted (rtl/render (r/as-element elem))]
(try (f mounted)
(finally (rtl/cleanup) (.unmount mounted) (r/flush)))))

(defn change [elem value]
(.change rtl/fireEvent elem (clj->js {:target {:value value}})))

(defn call [f] (f))

(def form-queries
{:first-name #(.getByPlaceholderText screen "First name")
:middle-name #(.getByPlaceholderText screen "Middle name")
:last-name #(.getByPlaceholderText screen "Last name")
:sex #(.getByText screen "Sex")
:birth-date #(.getByPlaceholderText screen "Birth date")
:address #(.getByPlaceholderText screen "Address")
:insurance #(.getByPlaceholderText screen "Insurance")})

;;; Tests
(deftest init
(testing "Renders correctly"
(is (nil? (render (create-root (.getElementById js/document "app")) [main-page])))))

(deftest db-initial-state
(deftest patients-create
(rft/run-test-sync
(testing "Initial db state"
(rf/dispatch [::events/init-db])
(is (= @(rf/subscribe [::subs/db])
{:current-route nil
:patients-list []
:patients-query nil
:patient-current nil
:form-patient-create nil
:form-patient-update nil})))))
(let [{:keys [first-name middle-name last-name sex birth-date address insurance]} form-queries]
(testing "Form renders correctly"
(with-render [create] (fn [_] (is (->> form-queries vals (map call) (every? some?))))))

(deftest patients-create
(testing "Form renders correctly"
(rtl/render (r/as-element [create]))
(is (and (some? (.getByPlaceholderText screen "First name"))
(some? (.getByPlaceholderText screen "Middle name"))
(some? (.getByPlaceholderText screen "Last name"))
(some? (.getByText screen "Sex"))
(some? (.getByText screen "Male"))
(some? (.getByText screen "Female"))
(some? (.getByPlaceholderText screen "Birth date"))
(some? (.getByPlaceholderText screen "Address"))
(some? (.getByPlaceholderText screen "Insurance"))))))
(testing "Form elements work correctly"
(with-render [create]
(fn [_]
(change (first-name) "a")
(change (middle-name) "b")
(change (last-name) "c")
(change (address) "d")
(change (insurance) "e")
(change (birth-date) "2024-01-01")
;; (change (sex) "male")
))
(with-render [create]
(fn [_]
(is (and (= "a" @(rf/subscribe [::subs/form :form-patient-create :first_name]))
(= "b" @(rf/subscribe [::subs/form :form-patient-create :middle_name]))
(= "c" @(rf/subscribe [::subs/form :form-patient-create :last_name]))
(= "d" @(rf/subscribe [::subs/form :form-patient-create :address]))
(= "e" @(rf/subscribe [::subs/form :form-patient-create :insurance]))
(= "2024-01-01" @(rf/subscribe [::subs/form :form-patient-create :birth_date]))
;; (= "male" @(rf/subscribe [::subs/form :form-patient-create :sex]))
))))))))

(deftest patients-edit
(testing "Form renders correctly"
(rtl/render (r/as-element [edit]))
(is (and (some? (.getByPlaceholderText screen "First name"))
(some? (.getByPlaceholderText screen "Middle name"))
(some? (.getByPlaceholderText screen "Last name"))
(some? (.getByText screen "Sex"))
(some? (.getByText screen "Male"))
(some? (.getByText screen "Female"))
(some? (.getByPlaceholderText screen "Birth date"))
(some? (.getByPlaceholderText screen "Address"))
(some? (.getByPlaceholderText screen "Insurance"))))))
(rft/run-test-sync
(let [{:keys [first-name middle-name last-name sex birth-date address insurance]} form-queries]
(testing "Form renders correctly"
(with-render [edit] (fn [_] (is (->> form-queries vals (map call) (every? some?))))))

(testing "Form elements work correctly"
(with-render [edit]
(fn [_]
(change (first-name) "a")
(change (middle-name) "b")
(change (last-name) "c")
(change (address) "d")
(change (insurance) "e")
(change (birth-date) "2024-01-01")
;; (change (sex) "male")
))
(with-render [edit]
(fn [_]
(is (and (= "a" @(rf/subscribe [::subs/form :form-patient-update :first_name]))
(= "b" @(rf/subscribe [::subs/form :form-patient-update :middle_name]))
(= "c" @(rf/subscribe [::subs/form :form-patient-update :last_name]))
(= "d" @(rf/subscribe [::subs/form :form-patient-update :address]))
(= "e" @(rf/subscribe [::subs/form :form-patient-update :insurance]))
(= "2024-01-01" @(rf/subscribe [::subs/form :form-patient-update :birth_date]))
;; (= "male" @(rf/subscribe [::subs/form :form-patient-create :sex]))
))))))))

(deftest patients-index
(testing "Page renders correctly"
Expand Down

0 comments on commit 6b2d364

Please sign in to comment.