From 77d823794eacd73469d32fe780b7dd4eae213b34 Mon Sep 17 00:00:00 2001 From: Tassilo Horn Date: Sat, 15 Jan 2022 23:59:20 +0100 Subject: [PATCH] Add some more mailcap tests. * test/lisp/net/mailcap-resources/mailcap: New file. * test/lisp/net/mailcap-resources/test.test: New file. * test/lisp/net/mailcap-tests.el (with-pristine-mailcap): New macro. (mailcap-parsing-and-mailcap-mime-info): New test for parsing mailcap files and selecting the right viewer. (mailcap--test-result): New variable. (mailcap--test-viewer): New function. (mailcap-view-file): New test for mailcap-view-file. --- test/lisp/net/mailcap-resources/mailcap | 9 +++ test/lisp/net/mailcap-resources/test.test | 1 + test/lisp/net/mailcap-tests.el | 70 +++++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 test/lisp/net/mailcap-resources/mailcap create mode 100644 test/lisp/net/mailcap-resources/test.test diff --git a/test/lisp/net/mailcap-resources/mailcap b/test/lisp/net/mailcap-resources/mailcap new file mode 100644 index 00000000000..ad3f7404fda --- /dev/null +++ b/test/lisp/net/mailcap-resources/mailcap @@ -0,0 +1,9 @@ +audio/ogg; mpv %s +audio/flac; mpv %s +audio/x-wav; aplay %s +text/*; emacsclient -t %s +application/pdf; acroread %s; test=false +application/pdf; evince %s +application/pdf; okular %s +image/*; eog %s +image/svg+xml; inkscape %s diff --git a/test/lisp/net/mailcap-resources/test.test b/test/lisp/net/mailcap-resources/test.test new file mode 100644 index 00000000000..9daeafb9864 --- /dev/null +++ b/test/lisp/net/mailcap-resources/test.test @@ -0,0 +1 @@ +test diff --git a/test/lisp/net/mailcap-tests.el b/test/lisp/net/mailcap-tests.el index 362cb22bb2f..b439c08c791 100644 --- a/test/lisp/net/mailcap-tests.el +++ b/test/lisp/net/mailcap-tests.el @@ -63,4 +63,74 @@ (append mailcap-tests-path-extensions mailcap-tests-mime-extensions)))) +(defmacro with-pristine-mailcap (&rest body) + ;; We only want the mailcap info we define ourselves. + `(let (mailcap--computed-mime-data + mailcap-mime-data + mailcap-user-mime-data) + ;; `mailcap-mime-info' calls `mailcap-parse-mailcaps' which parses + ;; the system's mailcaps. We don't want that for our test. + (cl-letf (((symbol-function 'mailcap-parse-mailcaps) #'ignore)) + ,@body))) + +(ert-deftest mailcap-parsing-and-mailcap-mime-info () + (with-pristine-mailcap + ;; One mailcap entry has a test=false field. The shell command + ;; execution errors when running the tests from the Makefile + ;; because then HOME=/nonexistent. + (ert-with-temp-directory home + (setenv "HOME" home) + ;; Now parse our resource mailcap file. + (mailcap-parse-mailcap (ert-resource-file "mailcap")) + + ;; Assert that we get what we have defined. + (dolist (type '("audio/ogg" "audio/flac")) + (should (string= "mpv %s" (mailcap-mime-info type)))) + (should (string= "aplay %s" (mailcap-mime-info "audio/x-wav"))) + (should (string= "emacsclient -t %s" + (mailcap-mime-info "text/plain"))) + ;; evince is chosen because acroread has test=false and okular + ;; comes later. + (should (string= "evince %s" + (mailcap-mime-info "application/pdf"))) + (should (string= "inkscape %s" + (mailcap-mime-info "image/svg+xml"))) + (should (string= "eog %s" + (mailcap-mime-info "image/jpg"))) + ;; With REQUEST being a number, all fields of the selected entry + ;; should be returned. + (should (equal '((viewer . "evince %s") + (type . "application/pdf")) + (mailcap-mime-info "application/pdf" 1))) + ;; With 'all, all applicable entries should be returned. + (should (equal '(((viewer . "evince %s") + (type . "application/pdf")) + ((viewer . "okular %s") + (type . "application/pdf"))) + (mailcap-mime-info "application/pdf" 'all))) + (let* ((c nil) + (toggle (lambda (_) (setq c (not c))))) + (mailcap-add "audio/ogg" "toggle %s" toggle) + (should (string= "toggle %s" (mailcap-mime-info "audio/ogg"))) + ;; The test results are cached, so in order to have the test + ;; re-evaluated, one needs to clear the cache. + (setq mailcap-viewer-test-cache nil) + (should (string= "mpv %s" (mailcap-mime-info "audio/ogg"))) + (setq mailcap-viewer-test-cache nil) + (should (string= "toggle %s" (mailcap-mime-info "audio/ogg"))))))) + +(defvar mailcap--test-result nil) +(defun mailcap--test-viewer () + (setq mailcap--test-result (string= (buffer-string) "test\n"))) + +(ert-deftest mailcap-view-file () + (with-pristine-mailcap + ;; Try using a lambda as viewer and check wether + ;; `mailcap-view-file' works correctly. + (let* ((mailcap-mime-extensions '((".test" . "test/test")))) + (mailcap-add "test/test" 'mailcap--test-viewer) + (save-window-excursion + (mailcap-view-file (ert-resource-file "test.test"))) + (should mailcap--test-result)))) + ;;; mailcap-tests.el ends here -- 2.39.2