From 5ab45c969caaf0ff7374d2994ec481ef35c7ec1c Mon Sep 17 00:00:00 2001 From: giles Date: Wed, 1 Apr 2026 18:26:57 +0000 Subject: [PATCH] Add swap tests for newly unblocked handlers 7 new suites: inline-edit (edit/save/cancel cycle), row-editing (form load + save), profile-editing (edit + put), tabs (content + OOB buttons), loading-indicator (sleep + content), bulk-operations (activate users), dedup-search. Total: 29 suites, 41 tests. All example handlers now have swap integration coverage. Co-Authored-By: Claude Opus 4.6 (1M context) --- web/tests/test-swap-integration.sx | 142 +++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/web/tests/test-swap-integration.sx b/web/tests/test-swap-integration.sx index e5aa2316..97e52c7f 100644 --- a/web/tests/test-swap-integration.sx +++ b/web/tests/test-swap-integration.sx @@ -502,3 +502,145 @@ (do (assert-true (contains? result "~anim-result")) (assert-true (contains? result "12:00:00"))))))) + +(defsuite + "swap:inline-edit" + (deftest + "edit form loads current value" + (reset-mocks!) + (set! _mock-args {:value "Hello" :id "42"}) + (let + ((page "(div :id \"edit-target\" (span \"Hello\"))") + (response (run-handler handler:ex-edit-form))) + (let + ((result (sx-swap page "innerHTML" "edit-target" response))) + (assert-true (contains? result "~examples/inline-edit-form"))))) + (deftest + "save returns updated view" + (reset-mocks!) + (set! _mock-form {:value "Updated"}) + (let + ((page "(div :id \"edit-target\" (input))") + (response (run-handler handler:ex-edit-save))) + (let + ((result (sx-swap page "innerHTML" "edit-target" response))) + (assert-true (contains? result "Updated"))))) + (deftest + "cancel restores original" + (reset-mocks!) + (set! _mock-args {:value "Original" :id "42"}) + (let + ((page "(div :id \"edit-target\" (input))") + (response (run-handler handler:ex-edit-cancel))) + (let + ((result (sx-swap page "innerHTML" "edit-target" response))) + (assert-true (contains? result "Original")))))) + +(defsuite + "swap:row-editing" + (deftest + "form loads row data" + (reset-mocks!) + (set! _mock-args {:row-id "r1"}) + (set! _mock-state {:ex-row-r1 {:stock "5" :id "r1" :price "$10" :name "Widget"}}) + (let + ((page "(tr :id \"row-r1\" (td \"Widget\"))") + (response (run-handler handler:ex-editrow-form))) + (let + ((result (sx-swap page "outerHTML" "row-r1" response))) + (do + (assert-true (contains? result "~examples/edit-row-form")) + (assert-true (contains? result "Widget")))))) + (deftest + "save stores and returns view" + (reset-mocks!) + (set! _mock-form {:id "r1" :price "$20" :name "Gadget"}) + (let + ((page "(tr :id \"row-r1\" (input))") + (response (run-handler handler:ex-editrow-save))) + (let + ((result (sx-swap page "outerHTML" "row-r1" response))) + (assert-true (contains? result "Gadget")))))) + +(defsuite + "swap:profile-editing" + (deftest + "edit loads profile fields" + (reset-mocks!) + (set! _mock-state {:ex-profile {:email "ada@example.com" :role "Engineer" :name "Ada"}}) + (let + ((page "(div :id \"profile-target\" (p \"Ada\"))") + (response (run-handler handler:ex-pp-edit-all))) + (let + ((result (sx-swap page "innerHTML" "profile-target" response))) + (assert-true (contains? result "~examples/pp-form-full"))))) + (deftest + "put saves and returns view" + (reset-mocks!) + (set! _mock-form {:email "grace@example.com" :role "Captain" :name "Grace"}) + (let + ((page "(div :id \"profile-target\" (form))") + (response (run-handler handler:ex-pp-put))) + (let + ((result (sx-swap page "innerHTML" "profile-target" response))) + (assert-true (contains? result "Grace")))))) + +(defsuite + "swap:tabs" + (deftest + "returns tab content with OOB buttons" + (reset-mocks!) + (set! _mock-args {:tab "tab1"}) + (let + ((page "(div (div :id \"tab-content\" (p \"old\")) (div :id \"tab-buttons\" (button \"old\")))") + (response (run-handler handler:ex-tabs))) + (let + ((result (apply-response page response "innerHTML" "tab-content"))) + (do + (assert-true (contains? result "~examples/tab-btn")) + (assert-false (contains? result "\"old\""))))))) + +(defsuite + "swap:loading-indicator" + (deftest + "slow handler returns content after mock sleep" + (reset-mocks!) + (let + ((page "(div :id \"loading-result\" (p \"Loading...\"))") + (response (run-handler handler:ex-slow))) + (let + ((result (sx-swap page "innerHTML" "loading-result" response))) + (do + (assert-true (contains? result "~examples/loading-result")) + (assert-true (contains? result "12:00:00")) + (assert-false (contains? result "Loading"))))))) + +(defsuite + "swap:bulk-operations" + (deftest + "activates selected users" + (reset-mocks!) + (set! _mock-args {:action "activate"}) + (set! _mock-form {:ids (list "u1" "u2")}) + (set! _mock-state {:ex-bulk-u2 {:status "inactive" :id "u2" :name "Bob"} :ex-bulk-u1 {:status "inactive" :id "u1" :name "Alice"}}) + (let + ((page "(tbody :id \"bulk-rows\" (tr \"old\"))") + (response (run-handler handler:ex-bulk))) + (let + ((result (sx-swap page "innerHTML" "bulk-rows" response))) + (assert-true (contains? result "~examples/bulk-row")))))) + +(defsuite + "swap:dedup-search" + (deftest + "returns search result" + (reset-mocks!) + (set! _mock-args {:q "test"}) + (let + ((page "(div :id \"search-result\" (p \"Searching...\"))") + (response (run-handler handler:ex-slow-search))) + (let + ((result (sx-swap page "innerHTML" "search-result" response))) + (do + (assert-true (contains? result "~examples/sync-result")) + (assert-false (contains? result "Searching")))))))