(defpackage cl-sbt/tests/questionnaire (:use :cl :cl-sbt :rove) (:import-from :cl-sbt/questionnaire :question :resolve-input-type :resolve-input-and-choices :extract-question-components :questionnaire)) (in-package :cl-sbt/tests/questionnaire) (deftest test-resolve-input-type (testing "Test for resolve-input-type" (ok (string= "radio" (resolve-input-type "single"))) (ok (string= "checkbox" (resolve-input-type "multiple"))) (ok (string= "text" (resolve-input-type "text"))))) (deftest test-resolve-input-and-choices (testing "Test for resolve-input-and-choices" (multiple-value-bind (type choices) (resolve-input-and-choices '(:radio "A" "B")) (ok (string= type "radio")) (ok (equal choices '("A" "B")))) (multiple-value-bind (type choices) (resolve-input-and-choices '("A" "B")) (ok (null type)) (ok (equal choices '("A" "B")))))) (deftest test-question-radio (let ((result (spinneret:with-html-string (question "What is your favorite color?" "favcolor" (:radio "Red" "Green" "Blue"))))) (testing "Generates correct HTML for question using radio checkable" (ok (search "for=group-favcolor-red" result)) (ok (search "for=group-favcolor-green" result)) (ok (search "for=group-favcolor-blue" result)) (ok (search "id=group-favcolor-red" result)) (ok (search "id=group-favcolor-green" result)) (ok (search "id=group-favcolor-blue" result)) (ok (search "type=radio" result)) (ok (search "What is your favorite color?" result))))) (deftest test-question-checkbox (let ((result (spinneret:with-html-string (question "What is your favorite color?" "favcolor" (:checkbox "Red" "Green" "Blue"))))) (testing "Generates correct HTML for question using checkbox checkable" (ok (search "type=checkbox" result))))) (deftest test-question-select (let ((result (spinneret:with-html-string (question "What is your favorite color?" "favcolor" (:combo "Red" "Green" "Blue"))))) (testing "Generates correct HTML for question using select" (ok (search "select" result)) (ok (search "option value=red" result)) (ok (search "option value=green" result)) (ok (search "option value=blue" result)) (ok (search "What is your favorite color?" result))))) (deftest test-extract-question-components (testing "Test for extract-question-components" (multiple-value-bind (ask1 group1 choices1) (extract-question-components '(:ask "What is your favorite color?" :group "favcolor" :choices (:radio "Red" "Green" "Blue"))) (ok (string= ask1 "What is your favorite color?")) (ok (string= group1 "favcolor")) (ok (equal choices1 '(:radio "Red" "Green" "Blue")))))) (deftest test-extract-question-components-missing-components (testing "Test for extract-question-components with missing components" (multiple-value-bind (ask2 group2 choices2) (extract-question-components '(:ask "What is your favorite color?" :choices (:radio "Red" "Green" "Blue"))) (ok (string= ask2 "What is your favorite color?")) (ok (equal group2 '(:radio "Red" "Green" "Blue"))) (ok (null choices2))))) (deftest test-extract-question-components-additional-keys (testing "Test for extract-question-components with additional keys" (multiple-value-bind (ask3 group3 choices3) (extract-question-components '(:ask "What is your favorite color?" :group "favcolor" :choices (:radio "Red" "Green" "Blue") :extra "some-extra-info")) (ok (string= ask3 "What is your favorite color?")) (ok (string= group3 "favcolor")) (ok (equal choices3 '(:radio "Red" "Green" "Blue")))))) (deftest test-create-questionnaire-single (let ((result (spinneret:with-html-string (questionnaire "/submit" (:ask "Your Gender?" :group "gender" :choices (:single "Male" "Female" "Non-Binary" "Prefer not to say")))))) (testing "Generates correct HTML for questionnaire with single choices" (ok (search "
" result)) (ok (search "Your Gender?" result)) (ok (search "class=form-check-input" result)) (ok (search "name=group-gender" result)) (ok (search "value=male" result)) (ok (search "
" result)) (ok (search "" result))))) (deftest test-create-questionnaire-multiple (let ((result (spinneret:with-html-string (questionnaire "/submit" (:ask "Which of the following devices do you regularly use to browse the internet?" :group "device" :choices (:multiple "Desktop" "Laptop" "Tablet")))))) (testing "Generates correct HTML for questionnaire with multiple choices" (ok (search "" result)) (ok (search "Which of the following devices do you regularly use to browse the internet?" result)) (ok (search "type=checkbox" result)) (ok (search "name=group-device" result)) (ok (search "value=desktop" result)) (ok (search "
" result)) (ok (search "" result))))) (deftest test-create-questionnaire-mixed-choices (let ((result (spinneret:with-html-string (questionnaire "/submit" (:ask "Which of the following devices do you regularly use to browse the internet?" :group "device" :choices (:multiple "Desktop" "Laptop" "Tablet" :text "Others (please specify)")))))) (testing "Generates correct HTML for questionnaire with multiple choices" (ok (search "" result)) (ok (search "Which of the following devices do you regularly use to browse the internet?" result)) (ok (search "type=checkbox" result)) (ok (search "name=group-device" result)) (ok (search "class=\"form-label group-device\"" result)) (ok (search "class=form-control" result)) (ok (search "
" result)) (ok (search "" result))))) (deftest test-create-questionnaire-single-german (let* ((spinneret:*html-lang* "de") (result (spinneret:with-html-string (questionnaire "/submit" (:frage "Ihr Geschlecht?" :gruppe "geschlecht" :auswahl (:single "Männlich" "Weiblich" "Non-Binary" "Keine Angabe")))))) (testing "Generates correct HTML for questionnaire with single choices" (ok (search "" result)) (ok (search "Ihr Geschlecht?" result)) (ok (search "class=form-check-input" result)) (ok (search "name=group-geschlecht" result)) (ok (search "value=männlich" result)) (ok (search "value=weiblich" result)) (ok (search "value=keine-angabe" result)) (ok (search "" result))))) (deftest test-create-questionnaire-select (let ((result (spinneret:with-html-string (questionnaire "/submit" (:ask "What is your favorite color?" :group "favcolor" :choices (:combo "Red" "Green" "Blue")))))) (ok (search "select" result)) (ok (search "option value=red" result)) (ok (search "option value=green" result)) (ok (search "option value=blue" result)) (ok (search "What is your favorite color?" result))))