From daf00f5310dfafd42c23faf655b0158c74063577 Mon Sep 17 00:00:00 2001 From: Oleg Tsvetkov Date: Thu, 16 Jul 2026 16:51:05 +0300 Subject: [PATCH] Use is assertion messages instead of testing blocks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace (testing "…" …) wrappers with per-assertion messages passed as the is message argument (on its own line), across the library tests and the example projects. deftests with multiple testing blocks are flattened, each assertion carrying its own descriptive message. Drop the now-unused testing refer from every test namespace. --- .../src/app/reagent_test.cljs | 44 ++--- .../re-frame-example/src/app/events_test.cljs | 14 +- .../re-frame-example/src/app/views_test.cljs | 34 ++-- .../fire_event_test.cljs | 64 +++---- .../mocks_test.cljs | 48 ++--- .../reagent/fire_event_test.cljs | 80 ++++---- .../reagent/render_test.cljs | 32 ++-- .../screen_test.cljs | 104 ++++++----- .../within_test.cljs | 171 +++++++++--------- 9 files changed, 306 insertions(+), 285 deletions(-) diff --git a/examples/node-test-example/src/app/reagent_test.cljs b/examples/node-test-example/src/app/reagent_test.cljs index 0536c85..d8cc8db 100644 --- a/examples/node-test-example/src/app/reagent_test.cljs +++ b/examples/node-test-example/src/app/reagent_test.cljs @@ -2,7 +2,7 @@ "Testing Reagent components: render!, fire-event, screen, within, and mocks." (:require [app.components :refer [counter]] - [cljs.test :refer [deftest is testing]] + [cljs.test :refer [deftest is]] [react-testing-library-cljs.mocks :as mocks] [react-testing-library-cljs.reagent.fire-event :as fire-event] [react-testing-library-cljs.reagent.render :refer [act render!]] @@ -10,27 +10,29 @@ [react-testing-library-cljs.within :as within])) (deftest counter-increments - (testing "clicking the button updates the rendered state" - (render! [counter]) - (is (= "0" (.-textContent (screen/get-by-test-id "count")))) - ;; Wrap interactions that cause re-renders in `act` so React flushes them. - (act #(fire-event/click (screen/get-by-role "button" {:name "Increment"}))) - (is (= "1" (.-textContent (screen/get-by-test-id "count")))))) + (render! [counter]) + (is (= "0" (.-textContent (screen/get-by-test-id "count"))) + "renders the initial state") + ;; Wrap interactions that cause re-renders in `act` so React flushes them. + (act #(fire-event/click (screen/get-by-role "button" {:name "Increment"}))) + (is (= "1" (.-textContent (screen/get-by-test-id "count"))) + "clicking the button updates the rendered state")) (deftest scoped-queries-with-within - (testing "within scopes a query to a subtree" - (render! [:div - [:section {:aria-label "sidebar"} - [:button "Save"]] - [:button "Save"]]) - (let [sidebar (screen/get-by-role "region" {:name "sidebar"})] - (is (some? (within/get-by-role sidebar "button" {:name "Save"}))) - ;; Two "Save" buttons exist overall; within disambiguates. - (is (= 2 (count (screen/get-all-by-role "button" {:name "Save"}))))))) + (render! [:div + [:section {:aria-label "sidebar"} + [:button "Save"]] + [:button "Save"]]) + (let [sidebar (screen/get-by-role "region" {:name "sidebar"})] + (is (some? (within/get-by-role sidebar "button" {:name "Save"})) + "within scopes a query to a subtree") + ;; Two "Save" buttons exist overall; within disambiguates. + (is (= 2 (count (screen/get-all-by-role "button" {:name "Save"}))) + "both buttons are found without scoping"))) (deftest mock-handler-records-calls - (testing "mocks/create returns [handler calls reset!]" - (let [[on-click calls] (mocks/create)] - (render! [:button {:on-click on-click} "Submit"]) - (act #(fire-event/click (screen/get-by-text "Submit"))) - (is (= 1 (count @calls)))))) + (let [[on-click calls] (mocks/create)] + (render! [:button {:on-click on-click} "Submit"]) + (act #(fire-event/click (screen/get-by-text "Submit"))) + (is (= 1 (count @calls)) + "the mock records the click"))) diff --git a/examples/re-frame-example/src/app/events_test.cljs b/examples/re-frame-example/src/app/events_test.cljs index 1f3f77a..a1a9961 100644 --- a/examples/re-frame-example/src/app/events_test.cljs +++ b/examples/re-frame-example/src/app/events_test.cljs @@ -3,14 +3,14 @@ (:require [app.events :as events] [app.subs :as subs] - [cljs.test :refer [deftest is testing]])) + [cljs.test :refer [deftest is]])) (deftest event-handlers - (testing "initialize sets the starting count" - (is (= {:count 0} (events/initialize nil nil)))) - (testing "increment bumps the count" - (is (= {:count 1} (events/increment {:count 0} nil))))) + (is (= {:count 0} (events/initialize nil nil)) + "initialize sets the starting count") + (is (= {:count 1} (events/increment {:count 0} nil)) + "increment bumps the count")) (deftest subscription-handlers - (testing "count-value reads :count from the db" - (is (= 5 (subs/count-value {:count 5} nil))))) + (is (= 5 (subs/count-value {:count 5} nil)) + "count-value reads :count from the db")) diff --git a/examples/re-frame-example/src/app/views_test.cljs b/examples/re-frame-example/src/app/views_test.cljs index 585148f..bfa1440 100644 --- a/examples/re-frame-example/src/app/views_test.cljs +++ b/examples/re-frame-example/src/app/views_test.cljs @@ -4,7 +4,7 @@ (:require [app.events :as events] [app.views :as views] - [cljs.test :refer [deftest is testing]] + [cljs.test :refer [deftest is]] [re-frame.core :as rf] [react-testing-library-cljs.reagent.fire-event :as fire-event] [react-testing-library-cljs.reagent.render :refer [act render!]] @@ -14,20 +14,22 @@ (.-textContent (screen/get-by-test-id "count"))) (deftest view-reflects-state - (testing "the view renders the current count and reacts to state changes" - (rf/dispatch-sync [::events/initialize]) - (render! [views/counter]) - (is (= "0" (count-text))) - ;; dispatch-sync updates the db synchronously; act flushes the re-render. - (act #(rf/dispatch-sync [::events/increment])) - (is (= "1" (count-text))))) + (rf/dispatch-sync [::events/initialize]) + (render! [views/counter]) + (is (= "0" (count-text)) + "renders the current count") + ;; dispatch-sync updates the db synchronously; act flushes the re-render. + (act #(rf/dispatch-sync [::events/increment])) + (is (= "1" (count-text)) + "reacts to state changes")) (deftest ^:async clicking-button-increments - (testing "clicking the button dispatches an event and updates the view" - (rf/dispatch-sync [::events/initialize]) - (render! [views/counter]) - (is (= "0" (count-text))) - (fire-event/click (screen/get-by-role "button" {:name "Increment"})) - ;; re-frame `dispatch` is asynchronous, so wait for the DOM to reflect the - ;; new count rather than asserting immediately. - (is (some? (await (screen/find-by-text "1")))))) + (rf/dispatch-sync [::events/initialize]) + (render! [views/counter]) + (is (= "0" (count-text)) + "renders the initial count") + (fire-event/click (screen/get-by-role "button" {:name "Increment"})) + ;; re-frame `dispatch` is asynchronous, so wait for the DOM to reflect the + ;; new count rather than asserting immediately. + (is (some? (await (screen/find-by-text "1"))) + "clicking the button dispatches an event and updates the view")) diff --git a/src/test/react_testing_library_cljs/fire_event_test.cljs b/src/test/react_testing_library_cljs/fire_event_test.cljs index 701f1e0..c6749e6 100644 --- a/src/test/react_testing_library_cljs/fire_event_test.cljs +++ b/src/test/react_testing_library_cljs/fire_event_test.cljs @@ -1,7 +1,7 @@ (ns react-testing-library-cljs.fire-event-test (:require ["react" :as react] - [cljs.test :refer [deftest is testing]] + [cljs.test :refer [deftest is]] [react-testing-library-cljs.fire-event :as fire-event] [react-testing-library-cljs.render :as rtl] [react-testing-library-cljs.screen :as screen])) @@ -17,41 +17,41 @@ "Increment")))) (deftest click-test - (testing "click fires and updates state" - (rtl/cleanup) - (rtl/render (react/createElement counter-component)) - (let [btn (screen/get-by-text "Increment")] - (fire-event/click btn) - (is (= "1" (.-textContent (screen/get-by-test-id "count"))))))) + (rtl/cleanup) + (rtl/render (react/createElement counter-component)) + (let [btn (screen/get-by-text "Increment")] + (fire-event/click btn) + (is (= "1" (.-textContent (screen/get-by-test-id "count"))) + "click fires and updates state"))) (deftest change-test - (testing "change updates input value" - (rtl/cleanup) - (rtl/render (react/createElement "input" #js {:placeholder "type here" - :defaultValue ""})) - (let [input-el (screen/get-by-placeholder-text "type here")] - (fire-event/change input-el {:target {:value "new value"}}) - (is (= "new value" (.-value input-el)))))) + (rtl/cleanup) + (rtl/render (react/createElement "input" #js {:placeholder "type here" + :defaultValue ""})) + (let [input-el (screen/get-by-placeholder-text "type here")] + (fire-event/change input-el {:target {:value "new value"}}) + (is (= "new value" (.-value input-el)) + "change updates input value"))) (deftest key-down-returns-default-prevented-boolean - (testing "returns true when nothing calls preventDefault (single arity)" - (rtl/cleanup) - (rtl/render (react/createElement "input" #js {:placeholder "plain"})) - (is (true? (fire-event/key-down (screen/get-by-placeholder-text "plain"))))) + (rtl/cleanup) + (rtl/render (react/createElement "input" #js {:placeholder "plain"})) + (is (true? (fire-event/key-down (screen/get-by-placeholder-text "plain"))) + "returns true when nothing calls preventDefault (single arity)") - (testing "returns true when nothing calls preventDefault (options arity)" - (rtl/cleanup) - (rtl/render (react/createElement "input" #js {:placeholder "plain"})) - (is (true? (fire-event/key-down (screen/get-by-placeholder-text "plain") {:key " "})))) + (rtl/cleanup) + (rtl/render (react/createElement "input" #js {:placeholder "plain"})) + (is (true? (fire-event/key-down (screen/get-by-placeholder-text "plain") {:key " "})) + "returns true when nothing calls preventDefault (options arity)") - (testing "returns false when a handler calls preventDefault (single arity)" - (rtl/cleanup) - (rtl/render (react/createElement "input" #js {:placeholder "prevents" - :onKeyDown (fn [e] (.preventDefault e))})) - (is (false? (fire-event/key-down (screen/get-by-placeholder-text "prevents"))))) + (rtl/cleanup) + (rtl/render (react/createElement "input" #js {:placeholder "prevents" + :onKeyDown (fn [e] (.preventDefault e))})) + (is (false? (fire-event/key-down (screen/get-by-placeholder-text "prevents"))) + "returns false when a handler calls preventDefault (single arity)") - (testing "returns false when a handler calls preventDefault (options arity)" - (rtl/cleanup) - (rtl/render (react/createElement "input" #js {:placeholder "prevents" - :onKeyDown (fn [e] (.preventDefault e))})) - (is (false? (fire-event/key-down (screen/get-by-placeholder-text "prevents") {:key " "}))))) + (rtl/cleanup) + (rtl/render (react/createElement "input" #js {:placeholder "prevents" + :onKeyDown (fn [e] (.preventDefault e))})) + (is (false? (fire-event/key-down (screen/get-by-placeholder-text "prevents") {:key " "})) + "returns false when a handler calls preventDefault (options arity)")) diff --git a/src/test/react_testing_library_cljs/mocks_test.cljs b/src/test/react_testing_library_cljs/mocks_test.cljs index 310b5cf..35f1e2d 100644 --- a/src/test/react_testing_library_cljs/mocks_test.cljs +++ b/src/test/react_testing_library_cljs/mocks_test.cljs @@ -1,37 +1,41 @@ (ns react-testing-library-cljs.mocks-test (:require - [cljs.test :refer [deftest is testing]] + [cljs.test :refer [deftest is]] [react-testing-library-cljs.fire-event :as fire-event] [react-testing-library-cljs.mocks :as mocks] [react-testing-library-cljs.reagent.render :as render] [react-testing-library-cljs.screen :as screen])) (deftest create-test - (testing "create returns a [calls handler reset!] triple" - (let [[handler calls reset!] (mocks/create)] - (is (= [] @calls)) + (let [[handler calls reset!] (mocks/create)] + (is (= [] @calls) + "starts with no recorded calls") - (handler "arg1") - (is (= ["arg1"] @calls)) + (handler "arg1") + (is (= ["arg1"] @calls) + "records the first call's args") - (handler "arg2") - (is (= ["arg1" "arg2"] @calls)) + (handler "arg2") + (is (= ["arg1" "arg2"] @calls) + "appends subsequent calls") - (reset!) - (is (= [] @calls))))) + (reset!) + (is (= [] @calls) + "reset! clears the recorded calls"))) (deftest multiple-mocks-are-independent - (testing "separate mocks do not share state" - (let [[handler-a calls-a _] (mocks/create) - [handler-b calls-b _] (mocks/create)] - (handler-a "a") - (handler-b "b") - (is (= ["a"] @calls-a)) - (is (= ["b"] @calls-b))))) + (let [[handler-a calls-a _] (mocks/create) + [handler-b calls-b _] (mocks/create)] + (handler-a "a") + (handler-b "b") + (is (= ["a"] @calls-a) + "separate mocks do not share state") + (is (= ["b"] @calls-b) + "separate mocks do not share state"))) (deftest tracks-button-click - (testing "a mock handler wired to a rendered button records clicks" - (let [[on-click calls] (mocks/create)] - (render/render! [:button {:on-click on-click} "Submit"]) - (fire-event/click (screen/get-by-text "Submit")) - (is (= 1 (count @calls)))))) + (let [[on-click calls] (mocks/create)] + (render/render! [:button {:on-click on-click} "Submit"]) + (fire-event/click (screen/get-by-text "Submit")) + (is (= 1 (count @calls)) + "a mock handler wired to a rendered button records clicks"))) diff --git a/src/test/react_testing_library_cljs/reagent/fire_event_test.cljs b/src/test/react_testing_library_cljs/reagent/fire_event_test.cljs index bd17a74..8c8c091 100644 --- a/src/test/react_testing_library_cljs/reagent/fire_event_test.cljs +++ b/src/test/react_testing_library_cljs/reagent/fire_event_test.cljs @@ -1,54 +1,56 @@ (ns react-testing-library-cljs.reagent.fire-event-test (:require - [cljs.test :refer [deftest is testing]] + [cljs.test :refer [deftest is]] [react-testing-library-cljs.reagent.fire-event :as fire-event] [react-testing-library-cljs.reagent.render :refer [render! act]] [react-testing-library-cljs.screen :as screen] [reagent.core :as r])) (deftest click-triggers-re-render - (testing "clicking a button updates state visibly" - (let [counter (r/atom 0) - component (fn [] [:div - [:span {:data-testid "count"} (str @counter)] - [:button {:on-click #(swap! counter inc)} "Inc"]])] - (render! [component]) - (is (= "0" (.-textContent (screen/get-by-test-id "count")))) - (act #(fire-event/click (screen/get-by-text "Inc"))) - (is (= "1" (.-textContent (screen/get-by-test-id "count"))))))) + (let [counter (r/atom 0) + component (fn [] [:div + [:span {:data-testid "count"} (str @counter)] + [:button {:on-click #(swap! counter inc)} "Inc"]])] + (render! [component]) + (is (= "0" (.-textContent (screen/get-by-test-id "count"))) + "renders the initial count") + (act #(fire-event/click (screen/get-by-text "Inc"))) + (is (= "1" (.-textContent (screen/get-by-test-id "count"))) + "clicking a button updates state visibly"))) (deftest change-triggers-re-render - (testing "changing an input updates state visibly" - (let [value (r/atom "") - component (fn [] [:div - [:input {:data-testid "input" - :value @value - :on-change #(reset! value (.. % -target -value))}] - [:span {:data-testid "display"} @value]])] - (render! [component]) - (is (= "" (.-textContent (screen/get-by-test-id "display")))) - (act #(fire-event/change (screen/get-by-test-id "input") {:target {:value "hello"}})) - (is (= "hello" (.-textContent (screen/get-by-test-id "display"))))))) + (let [value (r/atom "") + component (fn [] [:div + [:input {:data-testid "input" + :value @value + :on-change #(reset! value (.. % -target -value))}] + [:span {:data-testid "display"} @value]])] + (render! [component]) + (is (= "" (.-textContent (screen/get-by-test-id "display"))) + "renders the initial empty value") + (act #(fire-event/change (screen/get-by-test-id "input") {:target {:value "hello"}})) + (is (= "hello" (.-textContent (screen/get-by-test-id "display"))) + "changing an input updates state visibly"))) (deftest key-down-returns-default-prevented-boolean - (testing "returns true when nothing calls preventDefault (single arity)" - (let [component (fn [] [:input {:data-testid "plain"}])] - (render! [component]) - (is (true? (fire-event/key-down (screen/get-by-test-id "plain")))))) + (let [component (fn [] [:input {:data-testid "plain"}])] + (render! [component]) + (is (true? (fire-event/key-down (screen/get-by-test-id "plain"))) + "returns true when nothing calls preventDefault (single arity)")) - (testing "returns true when nothing calls preventDefault (options arity)" - (let [component (fn [] [:input {:data-testid "plain"}])] - (render! [component]) - (is (true? (fire-event/key-down (screen/get-by-test-id "plain") {:key " "}))))) + (let [component (fn [] [:input {:data-testid "plain"}])] + (render! [component]) + (is (true? (fire-event/key-down (screen/get-by-test-id "plain") {:key " "})) + "returns true when nothing calls preventDefault (options arity)")) - (testing "returns false when a handler calls preventDefault (single arity)" - (let [component (fn [] [:input {:data-testid "prevents" - :on-key-down #(.preventDefault %)}])] - (render! [component]) - (is (false? (fire-event/key-down (screen/get-by-test-id "prevents")))))) + (let [component (fn [] [:input {:data-testid "prevents" + :on-key-down #(.preventDefault %)}])] + (render! [component]) + (is (false? (fire-event/key-down (screen/get-by-test-id "prevents"))) + "returns false when a handler calls preventDefault (single arity)")) - (testing "returns false when a handler calls preventDefault (options arity)" - (let [component (fn [] [:input {:data-testid "prevents" - :on-key-down #(.preventDefault %)}])] - (render! [component]) - (is (false? (fire-event/key-down (screen/get-by-test-id "prevents") {:key " "})))))) + (let [component (fn [] [:input {:data-testid "prevents" + :on-key-down #(.preventDefault %)}])] + (render! [component]) + (is (false? (fire-event/key-down (screen/get-by-test-id "prevents") {:key " "})) + "returns false when a handler calls preventDefault (options arity)"))) diff --git a/src/test/react_testing_library_cljs/reagent/render_test.cljs b/src/test/react_testing_library_cljs/reagent/render_test.cljs index 556b406..6f94704 100644 --- a/src/test/react_testing_library_cljs/reagent/render_test.cljs +++ b/src/test/react_testing_library_cljs/reagent/render_test.cljs @@ -1,24 +1,26 @@ (ns react-testing-library-cljs.reagent.render-test (:require - [cljs.test :refer [deftest is testing]] + [cljs.test :refer [deftest is]] [react-testing-library-cljs.reagent.render :refer [render! act]] [react-testing-library-cljs.screen :as screen] [reagent.core :as r])) (deftest render!-test - (testing "renders hiccup to the DOM" - (render! [:div "Hello from Reagent"]) - (let [el (screen/get-by-text "Hello from Reagent")] - (is (some? el)) - (is (= "Hello from Reagent" (.-textContent el)))))) + (render! [:div "Hello from Reagent"]) + (let [el (screen/get-by-text "Hello from Reagent")] + (is (some? el) + "renders hiccup to the DOM") + (is (= "Hello from Reagent" (.-textContent el)) + "renders the expected text content"))) (deftest act-test - (testing "act flushes reagent state changes" - (let [counter (r/atom 0) - component (fn [] [:div - [:span {:data-testid "r-count"} (str @counter)] - [:button {:on-click #(swap! counter inc)} "Inc"]])] - (render! [component]) - (is (= "0" (.-textContent (screen/get-by-test-id "r-count")))) - (act #(swap! counter inc)) - (is (= "1" (.-textContent (screen/get-by-test-id "r-count"))))))) + (let [counter (r/atom 0) + component (fn [] [:div + [:span {:data-testid "r-count"} (str @counter)] + [:button {:on-click #(swap! counter inc)} "Inc"]])] + (render! [component]) + (is (= "0" (.-textContent (screen/get-by-test-id "r-count"))) + "renders the initial state") + (act #(swap! counter inc)) + (is (= "1" (.-textContent (screen/get-by-test-id "r-count"))) + "act flushes reagent state changes"))) diff --git a/src/test/react_testing_library_cljs/screen_test.cljs b/src/test/react_testing_library_cljs/screen_test.cljs index 08fe646..b8e6326 100644 --- a/src/test/react_testing_library_cljs/screen_test.cljs +++ b/src/test/react_testing_library_cljs/screen_test.cljs @@ -1,7 +1,7 @@ (ns react-testing-library-cljs.screen-test (:require ["react" :as react] - [cljs.test :refer [deftest is testing]] + [cljs.test :refer [deftest is]] [react-testing-library-cljs.render :as rtl] [react-testing-library-cljs.screen :as screen])) @@ -9,65 +9,71 @@ (rtl/render element)) (deftest get-by-text-test - (testing "returns the matching element" - (render-el (react/createElement "div" nil "Hello World")) - (let [el (screen/get-by-text "Hello World")] - (is (some? el)) - (is (= "Hello World" (.-textContent el))))) + (rtl/cleanup) + (render-el (react/createElement "div" nil "Hello World")) + (let [el (screen/get-by-text "Hello World")] + (is (some? el) + "returns the matching element") + (is (= "Hello World" (.-textContent el)) + "returns the element with the expected text")) - (testing "throws when element is not found" - (rtl/cleanup) - (render-el (react/createElement "div" nil "Hello")) - (is (thrown? js/Error (screen/get-by-text "Does not exist"))))) + (rtl/cleanup) + (render-el (react/createElement "div" nil "Hello")) + (is (thrown? js/Error (screen/get-by-text "Does not exist")) + "throws when element is not found")) (deftest query-by-text-test - (testing "returns the element when found" - (rtl/cleanup) - (render-el (react/createElement "div" nil "Query Target")) - (let [el (screen/query-by-text "Query Target")] - (is (some? el)) - (is (= "Query Target" (.-textContent el))))) + (rtl/cleanup) + (render-el (react/createElement "div" nil "Query Target")) + (let [el (screen/query-by-text "Query Target")] + (is (some? el) + "returns the element when found") + (is (= "Query Target" (.-textContent el)) + "returns the element with the expected text")) - (testing "returns nil when not found" - (rtl/cleanup) - (render-el (react/createElement "div" nil "Something")) - (is (nil? (screen/query-by-text "Not Here"))))) + (rtl/cleanup) + (render-el (react/createElement "div" nil "Something")) + (is (nil? (screen/query-by-text "Not Here")) + "returns nil when not found")) (deftest get-all-by-text-test - (testing "returns a vector of matching elements" - (rtl/cleanup) - (render-el (react/createElement "div" nil - (react/createElement "span" nil "Item") - (react/createElement "span" nil "Item"))) - (let [els (screen/get-all-by-text "Item")] - (is (vector? els)) - (is (= 2 (count els)))))) + (rtl/cleanup) + (render-el (react/createElement "div" nil + (react/createElement "span" nil "Item") + (react/createElement "span" nil "Item"))) + (let [els (screen/get-all-by-text "Item")] + (is (vector? els) + "returns a vector") + (is (= 2 (count els)) + "returns all matching elements"))) (deftest get-by-role-test - (testing "returns element by role" - (rtl/cleanup) - (render-el (react/createElement "button" nil "Click me")) - (let [el (screen/get-by-role "button")] - (is (some? el)) - (is (= "Click me" (.-textContent el)))))) + (rtl/cleanup) + (render-el (react/createElement "button" nil "Click me")) + (let [el (screen/get-by-role "button")] + (is (some? el) + "returns element by role") + (is (= "Click me" (.-textContent el)) + "returns the element with the expected text"))) (deftest query-by-role-test - (testing "returns nil when role not found" - (rtl/cleanup) - (render-el (react/createElement "div" nil "No button")) - (is (nil? (screen/query-by-role "button"))))) + (rtl/cleanup) + (render-el (react/createElement "div" nil "No button")) + (is (nil? (screen/query-by-role "button")) + "returns nil when role not found")) (deftest get-by-test-id-test - (testing "returns element by data-testid" - (rtl/cleanup) - (render-el (react/createElement "div" #js {:data-testid "my-id"} "Test ID")) - (let [el (screen/get-by-test-id "my-id")] - (is (some? el)) - (is (= "Test ID" (.-textContent el)))))) + (rtl/cleanup) + (render-el (react/createElement "div" #js {:data-testid "my-id"} "Test ID")) + (let [el (screen/get-by-test-id "my-id")] + (is (some? el) + "returns element by data-testid") + (is (= "Test ID" (.-textContent el)) + "returns the element with the expected text"))) (deftest get-by-placeholder-text-test - (testing "returns input by placeholder" - (rtl/cleanup) - (render-el (react/createElement "input" #js {:placeholder "Enter name"})) - (let [el (screen/get-by-placeholder-text "Enter name")] - (is (some? el))))) + (rtl/cleanup) + (render-el (react/createElement "input" #js {:placeholder "Enter name"})) + (let [el (screen/get-by-placeholder-text "Enter name")] + (is (some? el) + "returns input by placeholder"))) diff --git a/src/test/react_testing_library_cljs/within_test.cljs b/src/test/react_testing_library_cljs/within_test.cljs index 611894f..2ac3a09 100644 --- a/src/test/react_testing_library_cljs/within_test.cljs +++ b/src/test/react_testing_library_cljs/within_test.cljs @@ -1,7 +1,7 @@ (ns react-testing-library-cljs.within-test (:require ["react" :as react] - [cljs.test :refer [deftest is testing]] + [cljs.test :refer [deftest is]] [react-testing-library-cljs.render :as rtl] [react-testing-library-cljs.screen :as screen] [react-testing-library-cljs.within :as within])) @@ -10,102 +10,105 @@ (rtl/render element)) (deftest get-by-role-test - (testing "returns element within scope" - (rtl/cleanup) - (render-el (react/createElement "div" #js {:role "region"} - (react/createElement "button" nil "Inside"))) - (let [region (screen/get-by-role "region") - btn (within/get-by-role region "button")] - (is (some? btn)) - (is (= "Inside" (.-textContent btn))))) + (rtl/cleanup) + (render-el (react/createElement "div" #js {:role "region"} + (react/createElement "button" nil "Inside"))) + (let [region (screen/get-by-role "region") + btn (within/get-by-role region "button")] + (is (some? btn) + "returns element within scope") + (is (= "Inside" (.-textContent btn)) + "returns the scoped element's text")) - (testing "scopes query — does not find element outside" - (rtl/cleanup) - (render-el (react/createElement "div" nil - (react/createElement "div" #js {:role "region"} - (react/createElement "button" nil "Inside")) - (react/createElement "button" nil "Outside"))) - (let [region (screen/get-by-role "region")] - (is (thrown? js/Error (within/get-by-role region "button" {:name "Outside"}))))) + (rtl/cleanup) + (render-el (react/createElement "div" nil + (react/createElement "div" #js {:role "region"} + (react/createElement "button" nil "Inside")) + (react/createElement "button" nil "Outside"))) + (let [region (screen/get-by-role "region")] + (is (thrown? js/Error (within/get-by-role region "button" {:name "Outside"})) + "scopes query — does not find element outside")) - (testing "supports options map" - (rtl/cleanup) - (render-el (react/createElement "div" #js {:role "region"} - (react/createElement "button" nil "Submit"))) - (let [region (screen/get-by-role "region") - btn (within/get-by-role region "button" {:name "Submit"})] - (is (some? btn))))) + (rtl/cleanup) + (render-el (react/createElement "div" #js {:role "region"} + (react/createElement "button" nil "Submit"))) + (let [region (screen/get-by-role "region") + btn (within/get-by-role region "button" {:name "Submit"})] + (is (some? btn) + "supports an options map"))) (deftest query-by-role-test - (testing "returns nil when element not found within scope" - (rtl/cleanup) - (render-el (react/createElement "div" nil - (react/createElement "div" #js {:role "region"} "no button here") - (react/createElement "button" nil "Outside"))) - (let [region (screen/get-by-role "region")] - (is (nil? (within/query-by-role region "button")))))) + (rtl/cleanup) + (render-el (react/createElement "div" nil + (react/createElement "div" #js {:role "region"} "no button here") + (react/createElement "button" nil "Outside"))) + (let [region (screen/get-by-role "region")] + (is (nil? (within/query-by-role region "button")) + "returns nil when element not found within scope"))) (deftest get-all-by-role-test - (testing "returns vector of elements within scope" - (rtl/cleanup) - (render-el (react/createElement "div" #js {:role "region"} - (react/createElement "button" nil "One") - (react/createElement "button" nil "Two"))) - (let [region (screen/get-by-role "region") - btns (within/get-all-by-role region "button")] - (is (vector? btns)) - (is (= 2 (count btns))))) + (rtl/cleanup) + (render-el (react/createElement "div" #js {:role "region"} + (react/createElement "button" nil "One") + (react/createElement "button" nil "Two"))) + (let [region (screen/get-by-role "region") + btns (within/get-all-by-role region "button")] + (is (vector? btns) + "returns a vector of elements within scope") + (is (= 2 (count btns)) + "returns all scoped elements")) - (testing "does not include elements outside scope" - (rtl/cleanup) - (render-el (react/createElement "div" nil - (react/createElement "div" #js {:role "region"} - (react/createElement "button" nil "One")) - (react/createElement "button" nil "Outside"))) - (let [region (screen/get-by-role "region") - btns (within/get-all-by-role region "button")] - (is (= 1 (count btns)))))) + (rtl/cleanup) + (render-el (react/createElement "div" nil + (react/createElement "div" #js {:role "region"} + (react/createElement "button" nil "One")) + (react/createElement "button" nil "Outside"))) + (let [region (screen/get-by-role "region") + btns (within/get-all-by-role region "button")] + (is (= 1 (count btns)) + "does not include elements outside scope"))) (deftest query-all-by-role-test - (testing "returns empty vector when no elements found within scope" - (rtl/cleanup) - (render-el (react/createElement "div" #js {:role "region"} "no buttons")) - (let [region (screen/get-by-role "region")] - (is (= [] (within/query-all-by-role region "button")))))) + (rtl/cleanup) + (render-el (react/createElement "div" #js {:role "region"} "no buttons")) + (let [region (screen/get-by-role "region")] + (is (= [] (within/query-all-by-role region "button")) + "returns empty vector when no elements found within scope"))) (deftest get-by-text-test - (testing "returns element with matching text within scope" - (rtl/cleanup) - (render-el (react/createElement "div" #js {:role "region"} - (react/createElement "span" nil "Hello"))) - (let [region (screen/get-by-role "region") - el (within/get-by-text region "Hello")] - (is (some? el)) - (is (= "Hello" (.-textContent el))))) + (rtl/cleanup) + (render-el (react/createElement "div" #js {:role "region"} + (react/createElement "span" nil "Hello"))) + (let [region (screen/get-by-role "region") + el (within/get-by-text region "Hello")] + (is (some? el) + "returns element with matching text within scope") + (is (= "Hello" (.-textContent el)) + "returns the scoped element's text")) - (testing "scopes query — does not find text outside" - (rtl/cleanup) - (render-el (react/createElement "div" nil - (react/createElement "div" #js {:role "region"} - (react/createElement "span" nil "Inside")) - (react/createElement "span" nil "Outside"))) - (let [region (screen/get-by-role "region")] - (is (nil? (within/query-by-text region "Outside")))))) + (rtl/cleanup) + (render-el (react/createElement "div" nil + (react/createElement "div" #js {:role "region"} + (react/createElement "span" nil "Inside")) + (react/createElement "span" nil "Outside"))) + (let [region (screen/get-by-role "region")] + (is (nil? (within/query-by-text region "Outside")) + "scopes query — does not find text outside"))) (deftest get-by-test-id-test - (testing "returns element by test id within scope" - (rtl/cleanup) - (render-el (react/createElement "div" #js {:role "region"} - (react/createElement "span" #js {:data-testid "my-id"} "content"))) - (let [region (screen/get-by-role "region") - el (within/get-by-test-id region "my-id")] - (is (some? el))))) + (rtl/cleanup) + (render-el (react/createElement "div" #js {:role "region"} + (react/createElement "span" #js {:data-testid "my-id"} "content"))) + (let [region (screen/get-by-role "region") + el (within/get-by-test-id region "my-id")] + (is (some? el) + "returns element by test id within scope"))) (deftest get-by-placeholder-text-test - (testing "returns input by placeholder within scope" - (rtl/cleanup) - (render-el (react/createElement "form" #js {:aria-label "search form"} - (react/createElement "input" #js {:placeholder "Enter name"}))) - (let [form (screen/get-by-role "form") - el (within/get-by-placeholder-text form "Enter name")] - (is (some? el))))) + (rtl/cleanup) + (render-el (react/createElement "form" #js {:aria-label "search form"} + (react/createElement "input" #js {:placeholder "Enter name"}))) + (let [form (screen/get-by-role "form") + el (within/get-by-placeholder-text form "Enter name")] + (is (some? el) + "returns input by placeholder within scope")))