I would like to write tests for a Pedestal web-service.
If I have :
(defn pong
[request]
(ring-resp/response "pong"))
(defroutes routes[[["/" {:get pong}]]])
How would I write a test for that ?
(deftest alive-system
(testing "ping-pong route"
;; How do I test my route ?
;; If possible :
;; - I would like to have direct access to it
;; ie. no need to bind pedestal to a port would be nice
;; - The ability to omit some interceptors would be nice also,
;; as it would allow me to receive plain Clojure data structures
;; instead of, for instance, JSON which I would have to parse.
...)
Edit: Here is what I tried :
(deftest alive-system
(testing "ping-pong route"
(let [response (my-other.ns/routes (mock/request :get "/ping"))]
(is (= (:status response) 200))
(is (= (:body response) "pong")))))
But I get an exception :
ERROR in (alive-system) (service_test.clj:13)
Uncaught exception, not in assertion.
expected: nil
actual: java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to clojure.lang.IFn
So after asking on the issue I linked ohpaulez
replied :
@nha - Thanks for using Pedestal! Sorry your question didn't get an answer on StackOverflow - I don't think anyone monitors SO for Pedestal questions. The best place to ask those kinds of questions is on the mailing list.
Pedestal ships with its own utility for making requests directly to the servlet (similar to ring/mock, although I've never used mock myself) called response-for. The Pedestal Service template produces a test automatically for you. Check out one of the samples for an example.
Also note that said response-for
doesn't yet support asynchronous responses (so my routes that uses asynchronous interceptors with core.async
failed - I had to make them synchronous).