diff --git a/web/tests/test-swap-integration.sx b/web/tests/test-swap-integration.sx index ae83dffb..14482d39 100644 --- a/web/tests/test-swap-integration.sx +++ b/web/tests/test-swap-integration.sx @@ -78,6 +78,8 @@ (define json-encode (fn (val) (inspect val))) +(define random-int (fn (lo hi) lo)) + (define run-handler (fn @@ -244,3 +246,247 @@ ((page "(div :id \"counter\" (span \"0\"))") (result (sx-swap page "innerHTML" "counter" r2))) (assert-true (contains? result "2"))))))) + +(defsuite + "swap:dashboard" + (deftest + "innerHTML replaces with stats" + (reset-mocks!) + (let + ((page "(div :id \"dash-content\" (p \"Loading...\"))") + (response (run-handler handler:ex-dashboard))) + (let + ((result (sx-swap page "innerHTML" "dash-content" response))) + (do + (assert-true (contains? result "142")) + (assert-true (contains? result "Revenue")) + (assert-false (contains? result "Loading"))))))) + +(defsuite + "swap:lazy-load" + (deftest + "innerHTML replaces placeholder" + (reset-mocks!) + (let + ((page "(div :id \"lazy-target\" (p \"Loading...\"))") + (response (run-handler handler:ex-lazy))) + (let + ((result (sx-swap page "innerHTML" "lazy-target" response))) + (do + (assert-true (contains? result "~examples/lazy-result")) + (assert-true (contains? result "12:00:00")) + (assert-false (contains? result "Loading"))))))) + +(defsuite + "swap:dialog" + (deftest + "innerHTML opens modal" + (reset-mocks!) + (let + ((page "(div :id \"dialog-target\")") + (response (run-handler handler:ex-dialog))) + (let + ((result (sx-swap page "innerHTML" "dialog-target" response))) + (do + (assert-true (contains? result "~examples/dialog-modal")) + (assert-true (contains? result "Confirm Action")))))) + (deftest + "innerHTML closes modal" + (reset-mocks!) + (let + ((page "(div :id \"dialog-target\" (~examples/dialog-modal))") + (response (run-handler handler:ex-dialog-close))) + (let + ((result (sx-swap page "innerHTML" "dialog-target" response))) + (assert-false (contains? result "dialog-modal")))))) + +(defsuite + "swap:keyboard" + (deftest + "dispatches action for known key" + (reset-mocks!) + (set! _mock-args {:key "s"}) + (let + ((page "(div :id \"kbd-result\" (p \"Press a key\"))") + (response (run-handler handler:ex-keyboard))) + (let + ((result (sx-swap page "innerHTML" "kbd-result" response))) + (do + (assert-true (contains? result "Search panel activated")) + (assert-false (contains? result "Press a key")))))) + (deftest + "shows unknown for unmapped key" + (reset-mocks!) + (set! _mock-args {:key "z"}) + (let + ((page "(div :id \"kbd-result\")") + (response (run-handler handler:ex-keyboard))) + (let + ((result (sx-swap page "innerHTML" "kbd-result" response))) + (assert-true (contains? result "Unknown key: z")))))) + +(defsuite + "swap:validate" + (deftest + "empty email shows required" + (reset-mocks!) + (set! _mock-args {:email ""}) + (let + ((page "(div :id \"validate-result\")") + (response (run-handler handler:ex-validate))) + (let + ((result (sx-swap page "innerHTML" "validate-result" response))) + (assert-true (contains? result "Email is required"))))) + (deftest + "missing @ shows format error" + (reset-mocks!) + (set! _mock-args {:email "bad"}) + (let + ((page "(div :id \"validate-result\")") + (response (run-handler handler:ex-validate))) + (let + ((result (sx-swap page "innerHTML" "validate-result" response))) + (assert-true (contains? result "Invalid email format"))))) + (deftest + "valid email shows ok" + (reset-mocks!) + (set! _mock-args {:email "new@example.com"}) + (let + ((page "(div :id \"validate-result\")") + (response (run-handler handler:ex-validate))) + (let + ((result (sx-swap page "innerHTML" "validate-result" response))) + (assert-true (contains? result "~examples/validation-ok")))))) + +(defsuite + "swap:validate-submit" + (deftest + "valid email submits" + (reset-mocks!) + (set! _mock-form {:email "hi@example.com"}) + (let + ((page "(div :id \"validate-form-result\")") + (response (run-handler handler:ex-validate-submit))) + (let + ((result (sx-swap page "innerHTML" "validate-form-result" response))) + (assert-true (contains? result "hi@example.com"))))) + (deftest + "empty email rejects" + (reset-mocks!) + (set! _mock-form {:email ""}) + (let + ((page "(div :id \"validate-form-result\")") + (response (run-handler handler:ex-validate-submit))) + (let + ((result (sx-swap page "innerHTML" "validate-form-result" response))) + (assert-true (contains? result "valid email")))))) + +(defsuite + "swap:dependent-select" + (deftest + "returns options for category" + (reset-mocks!) + (set! _mock-args {:category "Languages"}) + (let + ((page "(select :id \"values-result\")") + (response (run-handler handler:ex-values))) + (let + ((result (sx-swap page "innerHTML" "values-result" response))) + (do + (assert-true (contains? result "Python")) + (assert-true (contains? result "Rust")))))) + (deftest + "empty category returns no items" + (reset-mocks!) + (set! _mock-args {:category "Nonexistent"}) + (let + ((page "(select :id \"values-result\")") + (response (run-handler handler:ex-values))) + (let + ((result (sx-swap page "innerHTML" "values-result" response))) + (assert-true (contains? result "No items")))))) + +(defsuite + "swap:form-reset" + (deftest + "echoes submitted message" + (reset-mocks!) + (set! _mock-form {:message "Hello world"}) + (let + ((page "(div :id \"reset-result\")") + (response (run-handler handler:ex-reset-submit))) + (let + ((result (sx-swap page "innerHTML" "reset-result" response))) + (assert-true (contains? result "Hello world")))))) + +(defsuite + "swap:swap-modes-log" + (deftest + "beforeend appends log entry with OOB counter" + (reset-mocks!) + (set! _mock-args {:mode "beforeend"}) + (let + ((page "(div (div :id \"swap-log\") (span :id \"swap-counter\" \"Count: 0\"))") + (response (run-handler handler:ex-swap-log))) + (let + ((result (apply-response page response "beforeend" "swap-log"))) + (do + (assert-true (contains? result "beforeend")) + (assert-true (contains? result "Count: 1"))))))) + +(defsuite + "swap:json-echo" + (deftest + "echoes content type and body" + (reset-mocks!) + (set! _mock-body "{\"key\":\"val\"}") + (set! _mock-content-type "application/json") + (let + ((page "(div :id \"json-result\")") + (response (run-handler handler:ex-json-echo))) + (let + ((result (sx-swap page "innerHTML" "json-result" response))) + (do + (assert-true (contains? result "application/json")) + (assert-true (contains? result "~examples/json-result"))))))) + +(defsuite + "swap:retry" + (deftest + "first two calls return empty (503)" + (reset-mocks!) + (let + ((r1 (run-handler handler:ex-flaky))) + (let + ((r2 (run-handler handler:ex-flaky))) + (do (assert-equal r1 "") (assert-equal r2 ""))))) + (deftest + "third call succeeds" + (reset-mocks!) + (let + ((r1 (run-handler handler:ex-flaky))) + (let + ((r2 (run-handler handler:ex-flaky))) + (let + ((r3 (run-handler handler:ex-flaky))) + (let + ((page "(div :id \"retry-result\" (p \"Retrying...\"))") + (result (sx-swap page "innerHTML" "retry-result" r3))) + (do + (assert-true (contains? result "~examples/retry-result")) + (assert-true (contains? result "Success")) + (assert-false (contains? result "Retrying"))))))))) + +(defsuite + "swap:animate" + (deftest + "returns color and timestamp" + (reset-mocks!) + (let + ((page "(div :id \"anim-result\")") + (response (run-handler handler:ex-animate))) + (let + ((result (sx-swap page "innerHTML" "anim-result" response))) + (do + (assert-true (contains? result "~anim-result")) + (assert-true (contains? result "12:00:00")))))))