From 19ab90bc98a8c6e08ce6401034a58610556ef87e Mon Sep 17 00:00:00 2001 From: Marcus Kammer Date: Thu, 10 Aug 2023 18:21:00 +0200 Subject: [PATCH] Init forms --- cl-sbt.asd | 6 ++++-- src/component/form.lisp | 15 +++++++++++++++ tests/component/form.lisp | 40 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/component/form.lisp create mode 100644 tests/component/form.lisp diff --git a/cl-sbt.asd b/cl-sbt.asd index c7d80ef..676ccf6 100644 --- a/cl-sbt.asd +++ b/cl-sbt.asd @@ -23,7 +23,8 @@ (:file "nav-tab") (:file "pagination") (:file "table") - (:file "spinner"))) + (:file "spinner") + (:file "form"))) (:module "examples" :components ((:file "album")))) @@ -52,6 +53,7 @@ (:file "dropdown") (:file "list-group") (:file "navbar") - (:file "nav-tab")))) + (:file "nav-tab") + (:file "form")))) :description "Test system for cl-sbt" :perform (test-op (op c) (symbol-call :rove :run c))) diff --git a/src/component/form.lisp b/src/component/form.lisp new file mode 100644 index 0000000..b9a0194 --- /dev/null +++ b/src/component/form.lisp @@ -0,0 +1,15 @@ +(defpackage cl-sbt/form + (:use + :cl) + (:export + :form-ctrl)) + +(in-package :cl-sbt/form) + +(defmacro form-ctrl (&rest rest) + `(spinneret:with-html + ,@(loop for item in rest + collect (destructuring-bind (&key id label type placeholder) item + `(progn + (:label :for ,id :class "form-label" ,label) + (:input :type ,type :class "form-control" :id ,id :placeholder ,placeholder)))))) diff --git a/tests/component/form.lisp b/tests/component/form.lisp new file mode 100644 index 0000000..6d6f064 --- /dev/null +++ b/tests/component/form.lisp @@ -0,0 +1,40 @@ +(defpackage cl-sbt/tests/form + (:use + :cl + :cl-sbt + :rove) + (:import-from + :cl-sbt/form + :form-ctrl)) + +(in-package :cl-sbt/tests/form) + +(deftest test-simple-form-control + (let ((result (spinneret:with-html-string (form-ctrl (:id "exampleFormControlInput1" :label "Email address" :type "email" :placeholder "name@example.com"))))) + (testing "Generates correct HTML for a simple form" + (ok (search "for=exampleFormControlInput1" result)) + (ok (search "class=form-label" result)) + (ok (search "type=email" result)) + (ok (search "class=form-control" result)) + (ok (search "id=exampleFormControlInput1" result)) + (ok (search "placeholder=name@example.com" result))))) + +(deftest test-simple-form-control-2 + (let ((result (spinneret:with-html-string (form-ctrl + (:id "exampleFormControlInput1" + :label "Email address" + :type "email" + :placeholder "name@example.com") + (:id "form1" + :label "Another Form" + :type "email" + :placeholder "name@example.com"))))) + (testing "Generates correct HTML for a simple form with more than one entries" + (ok (search "for=exampleFormControlInput1" result)) + (ok (search "class=form-label" result)) + (ok (search "type=email" result)) + (ok (search "class=form-control" result)) + (ok (search "id=exampleFormControlInput1" result)) + (ok (search "placeholder=name@example.com" result)) + (ok (search "for=form1" result)) + (ok (search "Another Form" result)))))