Thanks for your feedback, exactly what I wanted. On Tuesday, March 8, 2016 at 3:16:02 PM UTC+1, mlimotte wrote: > > I don't think you need a macro here. In any case, I'd avoid using a macro > as late as possible. See how far you get with just functions, and then > maybe at the end, add one macro if you absolutely need it to add just a > touch of syntactic sugar. > > routes should clearly be some sort of data-structure, rather than > side-effect setter functions. Maybe this: > > (with-fake-routes! > optional-server-instance > route-map) > > > Where optional-server-instance, if it exists is, an object returned by ( > fake-server/start!). If optional-server-instance is not passed in, then > with-fake-routes! > creates it's own and is free to call (shutdown!) on it automatically. And > route-map is a Map of routes: > > { > "/x" > {:status 200 :content-type "application/json" :body (slurp (io/resource > "my.json"))} > {:path "/y" :query {:q "something")}} > {:status 200 :content-type "application/json" :body (slurp (io/resource > "my2.json"))} > } > > +1. I'm gonna go for this option.
> > Also, at the risk of scope creep, I could foresee wanting the response to > be based on the input instead of just a static blob. So maybe the value of > :body could be a string or a function of 1 arg, the route-- in your code > test with (fn?). > That's a good idea indeed. I've already thought about this for matching the request. I'd like this to work: { (fn [request] (= (:path request) "/x")) {:status 200 :content-type "application/json" :body (slurp (io/resource "my.json"))} {:path "/y" :query {:q (fn [q] (clojure.string/starts-with? q "some"))}} {:status 200 :content-type "application/json" :body (slurp (io/resource "my2.json"))} } Thanks a lot for your help and feedback! > > This gives you a single api, no macros, optional auto-server start/stop or > explicit server management. > > marc > > > On Tue, Mar 8, 2016 at 3:10 AM, Johan Haleby <johan....@gmail.com > <javascript:>> wrote: > >> Hi, >> >> I've just committed an embryo of an open source project >> <https://github.com/johanhaleby/fake-http> to fake http requests by >> starting an actual (programmable) HTTP server. Currently the API looks like >> this (which in my eyes doesn't look very Clojure idiomatic): >> >> (let [fake-server (fake-server/start!) >> (fake-route! fake-server "/x" {:status 200 :content-type >> "application/json" :body (slurp (io/resource "my.json"))}) >> (fake-route! fake-server {:path "/y" :query {:q "something")}} >> {:status 200 :content-type "application/json" :body (slurp (io/resource >> "my2.json"))})] >> ; Do actual HTTP request >> (shutdown! fake-server)) >> >> >> fake-server/start! starts the HTTP server on a free port (and thus have >> side-effects) then you add routes to it by using fake-route!. The first >> route just returns an HTTP response with status code 200 and content-type >> "application/json" and the specified response body if a request is made >> with path "/x". The second line also matches that a query parameter called >> "q" must be equal to "something. In the end the server is stopped. >> >> I'm thinking of converting all of this into a macro that is used like >> this: >> >> (with-fake-routes! >> "/x" {:status 200 :content-type "application/json" :body (slurp >> (io/resource "my.json"))} >> {:path "/y" :query {:q "something")}} {:status 200 :content-type >> "application/json" :body (slurp (io/resource "my2.json"))}) >> >> This looks better imho and it can automatically shutdown the webserver >> afterwards but there are some potential problems. First of all, since >> starting a webserver is (relatively) slow it you might want to do this once >> for a number of tests. I'm thinking that perhaps as an alternative (both >> options could be available) it could be possible to first start the >> fake-server and then supply it to with-fake-routes! as an additional >> parameter. Something like this: >> >> (with-fake-routes! >> fake-server ; We pass the fake-server as the first argument in >> order to have multiple tests sharing the same fake-server >> "/x" {:status 200 :content-type "application/json" :body (slurp >> (io/resource "my.json"))} >> {:path "/y" :query {:q "something")}} {:status 200 :content-type >> "application/json" :body (slurp (io/resource "my2.json"))}) >> >> If so you would be responsible for shutting it down just as in the >> initial example. >> >> Another thing that concerns me a bit with the macro is that routes >> doesn't compose. For example you can't define the route outside of the >> with-fake-routes! >> body and just supply it as an argument to the macro (or can you?). I.e. I >> think it would be quite nice to be able to do something like this: >> >> (let [routes [["/x" {:status 200 :content-type "application/json" :body >> (slurp (io/resource "my.json"))}] >> [{:path "/y" :query {:q "something")}} {:status 200 >> :content-type "application/json" :body (slurp (io/resource "my2.json"))}]]] >> (with-fake-routes routes)) >> >> Would this be a good idea? Would it make sense to have overloaded >> variants of the with-fake-routes! macro to accommodate this as well? >> Should it be a macro in the first place? What do you think? >> >> Regards, >> /Johan >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clo...@googlegroups.com >> <javascript:> >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+u...@googlegroups.com <javascript:> >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> --- >> You received this message because you are subscribed to the Google Groups >> "Clojure" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+u...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.