Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions flash/package.lisp
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
(defpackage #:io.github.cl-sdk.wst.flash
(:use #:cl)
(:export
#:flash-messages
#:append-flash-message
#:consume-flash-messages
#:clear-flash-messages
#:valid-flash-type-p))

(in-package #:io.github.cl-sdk.wst.flash)

(defgeneric flash-messages (session &key &allow-other-keys)
(:documentation "Return queued flash messages for SESSION-ID without consuming them.

Always returns a list (possibly empty)."))

(defgeneric append-flash-message (session text &key &allow-other-keys)
(:documentation "Append a normalized flash message for SESSION and return that message.

Signals an error for invalid payload/type or queue overflow."))

(defgeneric consume-flash-messages (session &key &allow-other-keys)
(:documentation "Return and clear queued flash messages for SESSION.

Always returns a list (possibly empty)."))

(defgeneric clear-flash-messages (session &key &allow-other-keys)
(:documentation "Clear queued flash messages for SESSION.

Returns T when a queue was removed, NIL otherwise."))
8 changes: 8 additions & 0 deletions io.github.cl-sdk.wst.flash.asd
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
(asdf:defsystem #:io.github.cl-sdk.wst.flash
:description "Flash message API primitives for wst."
:author "Bruno Dias"
:license "Unlicense"
:version "0.1.0"
:serial t
:pathname "flash"
:components ((:file "package")))
10 changes: 10 additions & 0 deletions io.github.cl-sdk.wst.flash.test.asd
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
(asdf:defsystem #:io.github.cl-sdk.wst.flash.test
:description "Tests for io.github.cl-sdk.wst.flash."
:author "Bruno Dias"
:license "Unlicense"
:version "0.1.0"
:depends-on (#:io.github.cl-sdk.wst.test.support
#:io.github.cl-sdk.wst.flash)
:pathname "t"
:serial t
:components ((:file "flash-tests")))
1 change: 1 addition & 0 deletions io.github.cl-sdk.wst.test.asd
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
:version "0.1.0"
:depends-on (#:io.github.cl-sdk.wst.circuit-breaker.test
#:io.github.cl-sdk.wst.cors.test
#:io.github.cl-sdk.wst.flash.test
#:io.github.cl-sdk.wst.feature-flag.routing.test
#:io.github.cl-sdk.wst.feature-flag.test
#:io.github.cl-sdk.wst.idempotency.test
Expand Down
1 change: 1 addition & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Behavior is built from pipelines and composition, where middleware and handlers
- HTTP request/response helpers
- Cookie parsing utilities
- Session and CSRF support
- Session-backed one-time flash messages
- Request content parsing middleware
- CORS middleware
- Static file routing
Expand Down
49 changes: 49 additions & 0 deletions t/flash-tests.lisp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
(defpackage #:io.github.cl-sdk.wst.flash.test
(:use #:cl #:fiveam #:io.github.cl-sdk.wst.flash))

(in-package #:io.github.cl-sdk.wst.flash.test)

(def-suite flash-suite)
(in-suite flash-suite)

(defclass test-memory-session-object ()
((data :initarg :data :initform nil :accessor test-memory-object-data)))

(defmethod io.github.cl-sdk.wst.flash:flash-messages ((o test-memory-session-object) &key)
(getf (slot-value o 'data) :flash-messages))

(defmethod io.github.cl-sdk.wst.flash:append-flash-message ((o test-memory-session-object) text &key)
(let ((messages (getf (slot-value o 'data) :flash-messages)))
(setf (getf (slot-value o 'data) :flash-messages)
(append messages (list text)))
o))

(defmethod io.github.cl-sdk.wst.flash:consume-flash-messages ((o test-memory-session-object) &key)
(pop (getf (slot-value o 'data) :flash-messages)))

(test must-append-flash-message
(let ((session-object (make-instance 'test-memory-session-object)))
(is (equal '() (flash-messages session-object)))
(append-flash-message session-object "created")
(let ((messages (flash-messages session-object)))
(is (= 1 (length messages)))
(is (equal "created" (first messages))))
(let ((message (consume-flash-messages session-object))
(messages (flash-messages session-object)))
(is (= 0 (length messages)))
(is (equal "created" message)))))

(test must-read-flash-messages-without-cosuming-it
(let ((session-object (make-instance 'test-memory-session-object)))
(append-flash-message session-object "created")
(let ((messages (flash-messages session-object)))
(is (= 1 (length messages)))
(is (equal "created" (first messages))))))

(test must-read-flash-messages-cosuming-the-first
(let ((session-object (make-instance 'test-memory-session-object)))
(append-flash-message session-object "created")
(let ((message (consume-flash-messages session-object))
(messages (flash-messages session-object)))
(is (= 0 (length messages)))
(is (equal "created" message)))))
Loading