diff --git a/lack-request.asd b/lack-request.asd index 15d29fa..0088f66 100644 --- a/lack-request.asd +++ b/lack-request.asd @@ -11,4 +11,5 @@ :http-body :circular-streams :cl-ppcre) - :components ((:file "src/request"))) + :components ((:file "src/request")) + :in-order-to ((test-op (test-op t-lack-request)))) diff --git a/t-lack-request.asd b/t-lack-request.asd new file mode 100644 index 0000000..be5ef52 --- /dev/null +++ b/t-lack-request.asd @@ -0,0 +1,20 @@ +(in-package :cl-user) +(defpackage t-lack-request-asd + (:use :cl :asdf)) +(in-package :t-lack-request-asd) + +(defsystem t-lack-request + :author "Eitaro Fukamachi" + :license "LLGPL" + :depends-on (:lack-request + :clack-test + :dexador + :prove + :flexi-streams + :alexandria) + :components + ((:test-file "t/request")) + + :defsystem-depends-on (:prove-asdf) + :perform (test-op :after (op c) + (funcall (intern #.(string :run-test-system) :prove) c))) diff --git a/t/request.lisp b/t/request.lisp new file mode 100644 index 0000000..4dcfdea --- /dev/null +++ b/t/request.lisp @@ -0,0 +1,73 @@ +(in-package #:cl-user) +(defpackage #:t.lack.request + (:use #:cl + #:prove + #:lack.request + #:clack.test + #:flexi-streams) + (:import-from #:dexador) + (:import-from #:alexandria + #:alist-hash-table)) +(in-package #:t.lack.request) + +(plan nil) + +(defparameter *request* + (make-request `(:content-type "application/x-www-form-urlencoded; charset=utf-8" + :uri-scheme :http + :query-string "ediweitz=weitzedi&name=eitaro&q=C%2B%2B" + :raw-body + ,(flex:make-flexi-stream + (flex:make-in-memory-input-stream + #(110 97 109 101 61 230 183 177 231 148 186 232 139 177 229 164 170 233 131 142)) + :external-format :utf-8) + :headers ,(alexandria:alist-hash-table + '(("referer" . "http://github.com/fukamachi/clack") + ("user-agent" . "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US)") + ("cookie" . "hoge=1;fuga=semi;colon")) + :test 'equal)))) + +(is-type *request* 'request) + +(ok (request-env *request*) "request-env") + +(is (request-content-type *request*) "application/x-www-form-urlencoded; charset=utf-8" + "request-content-type") + +(is (request-query-parameters *request*) + '(("ediweitz" . "weitzedi") ("name" . "eitaro") ("q" . "C++")) + "request-query-parameters") + +(is (request-body-parameters *request*) + `(("name" . ,(flex:octets-to-string + #(230 183 177 231 148 186 232 139 177 229 164 170 233 131 142) + :external-format :utf-8))) + "request-body-parameters") + +(is (request-cookies *request*) + '(("hoge" . "1") ("fuga" . "semi") ("colon")) + "request-cookies") + +#+thread-support +(subtest-app "make-request" + (lambda (env) + (make-request env) + `(200 nil (,(gethash "filename" + (third (assoc "file" (request-body-parameters (make-request env)) :test #'string=)))))) + (multiple-value-bind (body status) + (dex:post "http://localhost:4242/" + :content + `(("file" . ,(asdf:system-relative-pathname :lack #P"data/jellyfish.jpg")))) + (is status 200) + (is body "jellyfish.jpg")) + + (multiple-value-bind (body status) + (dex:post "http://localhost:4242/" + :content + `(("file" . ,(asdf:system-relative-pathname :lack #P"data/jellyfish.jpg")))) + (is status 200) + (is body "jellyfish.jpg"))) +#-thread-support +(skip 4 "because your lisp doesn't support threads") + +(finalize)