AtlatestRepositorysigil-web
1
(import (sigil test)2
(sigil string)3
(sigil web middleware)4
(sigil http request)5
(sigil http response))7
;; ============================================================8
;; Test Helpers9
;; ============================================================11
(define (make-test-request method path)12
(http-request method: method path: path headers: #{} body: #f))14
(define (ok-handler request)15
(http-response status: 200 headers: #{} body: "ok"))17
(define (null-handler request) #f)19
;; ============================================================20
;; cors-middleware21
;; ============================================================23
(test-group "cors-middleware"24
(test "adds CORS headers to response"25
(let* ((mw (cors-middleware '("*")))26
(handler (mw ok-handler))27
(res (handler (make-test-request 'GET "/"))))28
(assert-equal "*"29
(dict-ref (http-response-headers res) access-control-allow-origin:))30
(assert-true (string? (dict-ref (http-response-headers res)31
access-control-allow-methods:)))))33
(test "OPTIONS preflight returns 204"34
(let* ((mw (cors-middleware '("*")))35
(handler (mw ok-handler))36
(res (handler (make-test-request 'OPTIONS "/api"))))37
(assert-equal 204 (http-response-status res))38
(assert-equal "*"39
(dict-ref (http-response-headers res) access-control-allow-origin:))))41
(test "custom methods and headers"42
(let* ((mw (cors-middleware '("https://example.com")43
'((methods . "GET, POST")44
(headers . "X-Custom"))))45
(handler (mw ok-handler))46
(res (handler (make-test-request 'GET "/"))))47
(assert-equal "https://example.com"48
(dict-ref (http-response-headers res) access-control-allow-origin:))49
(assert-equal "GET, POST"50
(dict-ref (http-response-headers res) access-control-allow-methods:))51
(assert-equal "X-Custom"52
(dict-ref (http-response-headers res) access-control-allow-headers:))))54
(test "passes through #f from handler"55
(let* ((mw (cors-middleware '("*")))56
(handler (mw null-handler))57
(res (handler (make-test-request 'GET "/"))))58
(assert-false res))))60
;; ============================================================61
;; content-type-middleware62
;; ============================================================64
(test-group "content-type-middleware"65
(test "adds default content-type when missing"66
(let* ((mw (content-type-middleware "text/html"))67
(handler (mw ok-handler))68
(res (handler (make-test-request 'GET "/"))))69
(assert-equal "text/html"70
(dict-ref (http-response-headers res) content-type:))))72
(test "preserves existing content-type"73
(let* ((typed-handler (lambda (req)74
(http-response status: 20075
headers: (dict content-type: "application/json")76
body: "{}")))77
(mw (content-type-middleware "text/html"))78
(handler (mw typed-handler))79
(res (handler (make-test-request 'GET "/"))))80
(assert-equal "application/json"81
(dict-ref (http-response-headers res) content-type:))))83
(test "passes through #f from handler"84
(let* ((mw (content-type-middleware "text/html"))85
(handler (mw null-handler))86
(res (handler (make-test-request 'GET "/"))))87
(assert-false res))))89
;; ============================================================90
;; not-found-middleware91
;; ============================================================93
(test-group "not-found-middleware"94
(test "passes through non-#f response"95
(let* ((mw (not-found-middleware))96
(handler (mw ok-handler))97
(res (handler (make-test-request 'GET "/"))))98
(assert-equal 200 (http-response-status res))99
(assert-equal "ok" (http-response-body res))))101
(test "returns 404 when handler returns #f"102
(let* ((mw (not-found-middleware))103
(handler (mw null-handler))104
(res (handler (make-test-request 'GET "/missing"))))105
(assert-equal 404 (http-response-status res))106
(assert-true (string-contains? (http-response-body res) "404"))))108
(test "custom 404 body"109
(let* ((mw (not-found-middleware '((body . "custom not found"))))110
(handler (mw null-handler))111
(res (handler (make-test-request 'GET "/missing"))))112
(assert-equal 404 (http-response-status res))113
(assert-true (string-contains? (http-response-body res) "custom not found")))))115
;; ============================================================116
;; with-cors117
;; ============================================================119
(test-group "with-cors"120
(test "default allows all origins"121
(let* ((handler (with-cors ok-handler))122
(res (handler (make-test-request 'GET "/"))))123
(assert-equal "*"124
(dict-ref (http-response-headers res) access-control-allow-origin:))))126
(test "custom origin"127
(let* ((handler (with-cors ok-handler allow-origin: "https://mysite.com"))128
(res (handler (make-test-request 'GET "/"))))129
(assert-equal "https://mysite.com"130
(dict-ref (http-response-headers res) access-control-allow-origin:)))))132
;; ============================================================133
;; with-content-type134
;; ============================================================136
(test-group "with-content-type"137
(test "default text/html"138
(let* ((handler (with-content-type ok-handler))139
(res (handler (make-test-request 'GET "/"))))140
(assert-equal "text/html"141
(dict-ref (http-response-headers res) content-type:))))143
(test "custom type"144
(let* ((handler (with-content-type ok-handler default: "application/json"))145
(res (handler (make-test-request 'GET "/"))))146
(assert-equal "application/json"147
(dict-ref (http-response-headers res) content-type:)))))149
;; ============================================================150
;; with-not-found151
;; ============================================================153
(test-group "with-not-found"154
(test "basic 404 fallback"155
(let* ((handler (with-not-found null-handler))156
(res (handler (make-test-request 'GET "/nope"))))157
(assert-equal 404 (http-response-status res))))159
(test "custom body"160
(let* ((handler (with-not-found null-handler body: "<p>Gone</p>"))161
(res (handler (make-test-request 'GET "/nope"))))162
(assert-equal 404 (http-response-status res))163
(assert-true (string-contains? (http-response-body res) "Gone")))))165
;; ============================================================166
;; wrap-middleware167
;; ============================================================169
(test-group "wrap-middleware"170
(test "applies multiple middleware"171
(let* ((handler (wrap-middleware ok-handler172
(cors-middleware '("*"))173
(content-type-middleware "text/html")))174
(res (handler (make-test-request 'GET "/"))))175
(assert-equal "*"176
(dict-ref (http-response-headers res) access-control-allow-origin:))177
(assert-equal "text/html"178
(dict-ref (http-response-headers res) content-type:)))))180
;; ============================================================181
;; compose-middleware182
;; ============================================================184
(test-group "compose-middleware"185
(test "creates single reusable middleware"186
(let* ((combined (compose-middleware187
(cors-middleware '("*"))188
(content-type-middleware "text/html")))189
(handler (combined ok-handler))190
(res (handler (make-test-request 'GET "/"))))191
(assert-equal "*"192
(dict-ref (http-response-headers res) access-control-allow-origin:))193
(assert-equal "text/html"194
(dict-ref (http-response-headers res) content-type:)))))196
(run-tests)