AtlatestRepositorysigil-web

sigil-web / tree / testtest-middleware.sgl

1(import (sigil test)
2 (sigil string)
3 (sigil web middleware)
4 (sigil http request)
5 (sigil http response))
6
7;; ============================================================
8;; Test Helpers
9;; ============================================================
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-middleware
21;; ============================================================
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-middleware
62;; ============================================================
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: 200
75 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-middleware
91;; ============================================================
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-cors
117;; ============================================================
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-type
134;; ============================================================
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-found
151;; ============================================================
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-middleware
167;; ============================================================
169(test-group "wrap-middleware"
170 (test "applies multiple middleware"
171 (let* ((handler (wrap-middleware ok-handler
172 (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-middleware
182;; ============================================================
184(test-group "compose-middleware"
185 (test "creates single reusable middleware"
186 (let* ((combined (compose-middleware
187 (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)