Permalink
Browse files

Added session flash middleware and tests

  • Loading branch information...
1 parent 64dda8f commit 70d71e63f3ab6452f25187228c4d22cad157f09a @weavejester weavejester committed Apr 3, 2010
Showing with 43 additions and 0 deletions.
  1. +19 −0 ring-core/src/ring/middleware/flash.clj
  2. +24 −0 ring-core/test/ring/middleware/flash_test.clj
View
19 ring-core/src/ring/middleware/flash.clj
@@ -0,0 +1,19 @@
+(ns ring.middleware.flash
+ "A session-based flash store that persists to the next request.")
+
+(defn wrap-flash
+ "If a :flash key is set on the response by the handler, a :flash key with
+ the same value will be set on the next request that shares the same session.
+ This is useful for small messages that persist across redirects."
+ [handler]
+ (fn [request]
+ (let [session (request :session)
+ flash (session :_flash)
+ session (dissoc session :_flash)
+ request (assoc request
+ :session session
+ :flash flash)
+ response (handler request)
+ session (if-let [flash (response :flash)]
+ (assoc (response :session) :_flash flash))]
+ (assoc response :session session))))
View
24 ring-core/test/ring/middleware/flash_test.clj
@@ -0,0 +1,24 @@
+(ns ring.middleware.flash-test
+ (:use clojure.test
+ ring.middleware.flash))
+
+(deftest flash-is-added-to-session
+ (let [message {:error "Could not save"}
+ handler (wrap-flash (constantly {:flash message}))
+ response (handler {:session {}})]
+ (is (= (:session response) {:_flash message}))))
+
+(deftest flash-is-retrieved-from-session
+ (let [message {:error "Could not save"}
+ handler (wrap-flash
+ (fn [request]
+ (is (= (:flash request) message))
+ {}))]
+ (handler {:session {:_flash message}})))
+
+(deftest flash-is-removed-after-read
+ (let [message {:error "Could not save"}
+ handler (wrap-flash (constantly {}))
+ response (handler {:session {:_flash message}})]
+ (is (nil? (:flash response)))
+ (is (nil? (-> response :session :_flash)))))

0 comments on commit 70d71e6

Please sign in to comment.