AtlatestRepositorysigil-web
1
(import (sigil test)2
(sigil string)3
(sigil web cookies)4
(sigil http request)5
(sigil http response))7
;; ============================================================8
;; parse-cookies9
;; ============================================================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-header31
;; ============================================================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-cookie127
;; ============================================================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)