AtlatestRepositorysigil-web

sigil-web / tree / testtest-cookies.sgl

1(import (sigil test)
2 (sigil string)
3 (sigil web cookies)
4 (sigil http request)
5 (sigil http response))
6
7;; ============================================================
8;; parse-cookies
9;; ============================================================
11(test-group "parse-cookies"
12 (test "parses name=value pairs"
13 (let ((cookies (parse-cookies "name=value; name2=value2")))
14 (assert-equal 2 (dict-length cookies))
15 (assert-equal "value" (dict-ref cookies "name"))
16 (assert-equal "value2" (dict-ref cookies "name2"))))
18 (test "handles spaces"
19 (let ((cookies (parse-cookies " foo = bar ; baz = qux ")))
20 (assert-equal "bar" (dict-ref cookies "foo"))
21 (assert-equal "qux" (dict-ref cookies "baz"))))
23 (test "empty header returns empty dict"
24 (assert-equal #{} (parse-cookies "")))
26 (test "missing header returns empty dict"
27 (assert-equal #{} (parse-cookies #f))))
29;; ============================================================
30;; build-set-cookie-header
31;; ============================================================
33(test-group "build-set-cookie-header"
34 (test "basic name=value"
35 (assert-equal "session=abc123"
36 (build-set-cookie-header "session" "abc123" '())))
38 (test "with path"
39 (let ((result (build-set-cookie-header "id" "42" '((path . "/")))))
40 (assert-true (string-contains? result "id=42"))
41 (assert-true (string-contains? result "Path=/"))))
43 (test "with max-age"
44 (let ((result (build-set-cookie-header "id" "42" '((max-age . 3600)))))
45 (assert-true (string-contains? result "Max-Age=3600"))))
47 (test "with secure"
48 (let ((result (build-set-cookie-header "id" "42" '((secure . #t)))))
49 (assert-true (string-contains? result "Secure"))))
51 (test "with http-only"
52 (let ((result (build-set-cookie-header "id" "42" '((http-only . #t)))))
53 (assert-true (string-contains? result "HttpOnly"))))
55 (test "with same-site"
56 (let ((result (build-set-cookie-header "id" "42" '((same-site . "Strict")))))
57 (assert-true (string-contains? result "SameSite=Strict")))))
59;; ============================================================
60;; cookie-ref (request integration)
61;; ============================================================
63(test-group "cookie-ref"
64 (test "extracts cookie from request"
65 (let* ((req (http-request method: 'GET path: "/"
66 headers: (dict cookie: "session=abc123; theme=dark")
67 body: #f))
68 (val (cookie-ref req "session")))
69 (assert-equal "abc123" val)))
71 (test "missing cookie returns #f"
72 (let* ((req (http-request method: 'GET path: "/"
73 headers: (dict cookie: "a=1")
74 body: #f))
75 (val (cookie-ref req "missing")))
76 (assert-false val)))
78 (test "missing cookie returns default"
79 (let* ((req (http-request method: 'GET path: "/"
80 headers: (dict cookie: "a=1")
81 body: #f))
82 (val (cookie-ref req "missing" "fallback")))
83 (assert-equal "fallback" val))))
85;; ============================================================
86;; cookies (request integration)
87;; ============================================================
89(test-group "cookies"
90 (test "extracts all cookies from request"
91 (let* ((req (http-request method: 'GET path: "/"
92 headers: (dict cookie: "a=1; b=2; c=3")
93 body: #f))
94 (all (cookies req)))
95 (assert-equal 3 (dict-length all))
96 (assert-equal "1" (dict-ref all "a"))))
98 (test "empty when no Cookie header"
99 (let* ((req (http-request method: 'GET path: "/"
100 headers: #{} body: #f))
101 (all (cookies req)))
102 (assert-equal #{} all))))
104;; ============================================================
105;; set-cookie (response integration)
106;; ============================================================
108(test-group "set-cookie"
109 (test "adds Set-Cookie header to response"
110 (let* ((res (http-response status: 200 headers: #{} body: "ok"))
111 (res2 (set-cookie res "session" "xyz")))
112 (assert-equal "session=xyz"
113 (dict-ref (http-response-headers res2) set-cookie:))))
115 (test "with options"
116 (let* ((res (http-response status: 200 headers: #{} body: "ok"))
117 (res2 (set-cookie res "id" "42" '((path . "/") (http-only . #t)))))
118 (assert-true (string-contains?
119 (dict-ref (http-response-headers res2) set-cookie:)
120 "Path=/"))
121 (assert-true (string-contains?
122 (dict-ref (http-response-headers res2) set-cookie:)
123 "HttpOnly")))))
125;; ============================================================
126;; delete-cookie
127;; ============================================================
129(test-group "delete-cookie"
130 (test "sets max-age=0"
131 (let* ((res (http-response status: 200 headers: #{} body: "ok"))
132 (res2 (delete-cookie res "session")))
133 (assert-true (string-contains?
134 (dict-ref (http-response-headers res2) set-cookie:)
135 "Max-Age=0")))))
137(run-tests)