Skip to content

Commit

Permalink
Fix spec and docstring
Browse files Browse the repository at this point in the history
Document specs for the :session entity map.
Fix the default session options.
  • Loading branch information
dawranliou committed Oct 1, 2019
1 parent 78a1cc1 commit cc073be
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 39 deletions.
1 change: 1 addition & 0 deletions modules/reitit-middleware/.nrepl-port
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
43803
19 changes: 12 additions & 7 deletions modules/reitit-middleware/src/reitit/ring/middleware/session.clj
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,20 @@
(:require
[clojure.spec.alpha :as s]
[ring.middleware.session :as session]
[ring.middleware.session.store :as session-store]
[ring.middleware.session.memory :as memory]))

(s/def ::spec (s/keys :opt-un [::session]))
(s/def ::store #(satisfies? session-store/SessionStore %))
(s/def ::root string?)
(s/def ::cookie-name string?)
(s/def ::cookie-attrs map?)
(s/def ::spec (s/keys :opt-un [::store ::root ::cookie-name ::cookie-attrs]))

(def ^:private store
"The default shared in-memory session store.
This is used when no `:session` key is provided to the middleware."
(atom {}))
This is used when no `:store` key is provided to the middleware."
(memory/memory-store (atom {})))

(def session-middleware
"Middleware for session.
Expand All @@ -25,9 +30,9 @@
| key | description |
| -------------|-------------|
| `:session` | `ring.middleware.session.store/SessionStore` instance. Use `ring.middleware.session.memory/MemoryStore` by default."
| `:session` | A map of options that passes into the [`ring.middleware.session/wrap-session](http://ring-clojure.github.io/ring/ring.middleware.session.html#var-wrap-session) function`."
{:name :session
:spec ::spec
:compile (fn [{:keys [session]
:or {session {:store (memory/memory-store store)}}} _]
{:wrap #(session/wrap-session % session)})})
:compile (fn [{session-opts :session} _]
(let [session-opts (merge {:store store} session-opts)]
{:wrap #(session/wrap-session % session-opts)}))})
68 changes: 36 additions & 32 deletions test/clj/reitit/ring/middleware/session_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -24,37 +24,41 @@
:session {:counter counter}}))

(deftest session-test
(let [store (atom {})
app (ring/ring-handler
(ring/router
["/api"
{:session {:store (memory/memory-store store)}
:middleware [session/session-middleware]}
["/ping" handler]
["/pong" handler]]))
first-response (app {:request-method :get
:uri "/api/ping"})
session-id (get-session-id first-response)
second-response (app {:request-method :get
:uri "/api/pong"
:cookies {"ring-session" {:value session-id}}})]
(is (= (count @store)
1))
(is (-> @store first second)
{:counter 2})))
(testing "Session with custom session store"
(let [store (atom {})
app (ring/ring-handler
(ring/router
["/api"
{:session {:store (memory/memory-store store)}
:middleware [session/session-middleware]}
["/ping" handler]
["/pong" handler]]))
first-response (app {:request-method :get
:uri "/api/ping"})
session-id (get-session-id first-response)
second-response (app {:request-method :get
:uri "/api/pong"
:cookies {"ring-session" {:value session-id}}})]
(testing "Shared session across routes"
(is (= (count @store)
1))
(is (-> @store first second)
{:counter 2})))))

(deftest default-session-test
(let [app (ring/ring-handler
(ring/router
["/api"
{:middleware [session/session-middleware]}
["/ping" handler]
["/pong" handler]]))
first-response (app {:request-method :get
:uri "/api/ping"})
session-id (get-session-id first-response)
second-response (app {:request-method :get
:uri "/api/pong"
:cookies {"ring-session" {:value session-id}}})]
(is (= (inc (get-in first-response [:body :counter]))
(get-in second-response [:body :counter])))))
(testing "Session with default session store"
(let [app (ring/ring-handler
(ring/router
["/api"
{:middleware [session/session-middleware]}
["/ping" handler]
["/pong" handler]]))
first-response (app {:request-method :get
:uri "/api/ping"})
session-id (get-session-id first-response)
second-response (app {:request-method :get
:uri "/api/pong"
:cookies {"ring-session" {:value session-id}}})]
(testing "Shared session across routes"
(is (= (inc (get-in first-response [:body :counter]))
(get-in second-response [:body :counter])))))))

0 comments on commit cc073be

Please sign in to comment.