| (require :cl-webdriver-client) |
| (require :cl-forms) |
| (require :hunchentoot) |
| (require :cl-forms.who) |
| (require :cl-json) |
| (require :access) |
| (require :generic-cl) |
|
|
| (defpackage :cl-forms.webdriver-test |
| (:local-nicknames |
| (:acc :access) |
| (:gcl :generic-cl)) |
| (:use :cl)) |
|
|
| (in-package :cl-forms.webdriver-test) |
|
|
| (defmethod access:do-access ((form forms:form) (field-name symbol) &key test key type skip-call?) |
| (declare (ignore test key type skip-call?)) |
| (forms:get-field-value form field-name)) |
|
|
| (defmethod gcl:equalp ((f1 forms:form) (f2 forms:form)) |
| (every (lambda (args) |
| (apply #'gcl:equalp args)) |
| (mapcar #'list |
| (forms:form-fields f1) |
| (forms:form-fields f2)))) |
|
|
| (defmethod gcl:equalp ((f1 forms:form-field) (f2 forms:form-field)) |
| (and (equalp (forms::field-name f1) |
| (forms::field-name f2)) |
| (equalp (forms::field-value f1) |
| (forms::field-value f2)))) |
|
|
| (forms:defform attachment-form () |
| ((document-name :string) |
| (document-type :string-choice :choices '("pdf" "odt" "docx" "txt")))) |
|
|
| (forms:defform webdriver-test-form (:action "/" :method :post) |
| ((name :string) |
| (age :integer) |
| (url :url) |
| (gender :string-choice :choices '("Male" "Female")) |
| (attachment :subform :subform 'attachment-form) |
| (attachments :list :type '(:subform :subform attachment-form) |
| :empty-item-predicate (lambda (attachment) |
| (str:emptyp (access:access attachment 'document-name)))) |
| (submit :submit))) |
|
|
| (forms:find-form 'webdriver-test-form) |
|
|
| (defun make-attachment (doc-name doc-type) |
| (let ((attachment (forms:find-form 'attachment-form))) |
| (forms:set-field-value attachment 'document-name doc-name) |
| (forms:set-field-value attachment 'document-type doc-type) |
| attachment)) |
|
|
| (hunchentoot:define-easy-handler (webdriver-test-handler :uri "/") |
| () |
| (case (hunchentoot:request-method*) |
| (:get |
| (who:with-html-output-to-string (html) |
| (:html |
| (:head |
| (:title (who:str "CL-FORMS Webdriver test"))) |
| (:body |
| (let ((form (forms:find-form 'webdriver-test-form))) |
| (forms:set-field-value form 'name "Mariano") |
| (forms:set-field-value form 'age 41) |
| (forms:set-field-value form 'url "http://common-lisp.net") |
| (forms:set-field-value form 'gender "Male") |
| (forms:set-field-value form 'attachment (make-attachment "foo.odt" "odt")) |
| (forms:set-field-value form 'attachments |
| (list (make-attachment "foo.odt" "odt") |
| (make-attachment "bar.pdf" "pdf") |
| (make-attachment "baz.txt" "txt"))) |
| (forms:with-form-renderer :who |
| (let ((forms.who:*html* html)) |
| (forms:render-form form)))))))) |
| (:post |
| (let ((form (forms:find-form 'webdriver-test-form))) |
| (forms:handle-request form) |
| (forms:with-form-field-values (name age gender url attachment attachments) form |
| (who:with-html-output-to-string (html) |
| (:html |
| (:head |
| (:title (who:str "CL-FORMS Webdriver test"))) |
| (:body |
| (:textarea :id "result" |
| (who:fmt "~a" (and (equalp name "Mariano") |
| (equalp age 41) |
| (equalp gender "Male") |
| (equalp url "http://common-lisp.net") |
| (equalp (forms:get-field-value attachment 'document-name) "foo.odt") |
| (equalp (forms:get-field-value attachment 'document-type) "odt") |
| (= (length attachments) 3) |
| (gcl:equalp attachments |
| (list (make-attachment "foo.odt" "odt") |
| (make-attachment "bar.pdf" "pdf") |
| (make-attachment "baz.txt" "txt"))) |
| ))))))))) |
| (t (hunchentoot:abort-request-handler)))) |
|
|
| (defvar *acceptor*) |
|
|
| (defun start (&optional (port 0)) |
| (setf *acceptor* (hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port port)))) |
|
|
| (defun stop () |
| (hunchentoot:stop *acceptor*) |
| (setf *acceptor* nil)) |
|
|
| |
|
|
| (defun test () |
| "Returns T on success." |
| (webdriver:with-session () |
| (setf (webdriver:url) (format nil "http://localhost:~a" (hunchentoot:acceptor-port *acceptor*))) |
| (let ((submit (webdriver:find-element "input[type=\"submit\"]"))) |
| (webdriver:element-click submit)) |
| (let ((result (webdriver:element-text (webdriver:find-element "#result")))) |
| (equalp result "T")))) |
|
|
| |
|
|