;; notmuch-test.el --- ERT based tests for notmuch.el.
;;
;; Copyright © David Edmondson
;;
;; This file is part of Notmuch.
;;
;; Notmuch is free software: you can redistribute it and/or modify it
;; under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;;
;; Notmuch is distributed in the hope that it will be useful, but
;; WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with Notmuch. If not, see .
;;
;; Authors: David Edmondson
(require 'ert)
;;
(defun notmuch-test-file-as-string (filename)
(with-temp-buffer
(insert-file-contents filename)
(buffer-string)))
;; This tends not to work well except in batch mode.
(defun notmuch-test-expected-result (name)
"Get the expected result of a test as a string."
(notmuch-test-file-as-string
(concat (getenv "EXPECTED") "/" name)))
(defun notmuch-test-buffer-result (fn)
(funcall fn)
(buffer-substring-no-properties (point-min) (point-max)))
;;
(require 'notmuch-maildir-fcc)
(ert-deftest notmuch-fcc-trivial ()
"One Fcc folder."
(should (string= "sent"
(notmuch-fcc-determine-folder "sent" "foo@bar.baz"))))
(ert-deftest notmuch-fcc-simple ()
"Fcc folder matching single address."
(should (string= "sent"
(notmuch-fcc-determine-folder
'(("foo@bar.baz" . "sent"))
"foo@bar.baz"))))
(ert-deftest notmuch-fcc-none ()
"No matching Fcc folder."
(should (eq nil
(notmuch-fcc-determine-folder
'(("foo@bar.baz" . "sent"))
"not@bar.baz"))))
(ert-deftest notmuch-fcc-multiple ()
"Choose the correct folder from two options."
(let ((fcc-config '(("foo@bar.baz" . "foosent")
("bar@bar.baz" . "barsent"))))
(should (string= "foosent"
(notmuch-fcc-determine-folder
fcc-config "foo@bar.baz")))
(should (string= "barsent"
(notmuch-fcc-determine-folder
fcc-config "bar@bar.baz")))))
(ert-deftest notmuch-fcc-regexp ()
"Allow a regexp in the `From' string."
(let ((fcc-config '(("foo@bar.baz" . "foosent")
(".*" . "barsent"))))
(should (string= "foosent"
(notmuch-fcc-determine-folder
fcc-config "foo@bar.baz")))
(should (string= "barsent"
(notmuch-fcc-determine-folder
fcc-config "bar@bar.baz")))))
(ert-deftest notmuch-fcc-oldstyle ()
"Raise an error for an old style configuration."
;; No match.
(should-error (notmuch-fcc-determine-folder
'("sent" ("not@bar.baz" . "foosent"))
"foo@bar.baz"))
;; One match.
(should-error (notmuch-fcc-determine-folder
'("sent" ("not@bar.baz" . "foosent"))
"not@bar.baz")))
;;
(require 'notmuch-hello)
(ert-deftest notmuch-hello ()
"Check that `notmuch-hello' outputs correct data.
Presumes that the email corpus is already present."
(should (string= (notmuch-test-buffer-result 'notmuch-hello)
(notmuch-test-expected-result "notmuch-hello"))))
(ert-deftest notmuch-hello-reflect ()
(should (equal '(1 4 7 10 2 5 8 11 3 6 9 12)
(notmuch-hello-reflect '(1 2 3 4 5 6 7 8 9 10 11 12) 4)))
(should (equal '(1 4 7 10 2 5 8 nil 3 6 9 nil)
(notmuch-hello-reflect '(1 2 3 4 5 6 7 8 9 10) 4))))
;;
(require 'notmuch-show)
(ert-deftest notmuch-show-strip-re ()
(mapc '(lambda (test)
(should (string= "fish"
(notmuch-show-strip-re test))))
'("fish" "re: fish" "Re: fish" "RE: fish"))
(mapc '(lambda (test)
(should (string= "some fish"
(notmuch-show-strip-re test))))
'("some fish" "re: some fish" "some re: fish"))
(mapc '(lambda (test)
(should-not (string= "some fish"
(notmuch-show-strip-re test))))
'(" some fish" "re: some fish " "somere: fish" "some fish re:")))
;;
(defun notmuch-test-batch ()
"Run the notmuch ERT tests in batch mode."
;; Avoid the 10 column default of `emacs --batch'.
(set-frame-width (window-frame (get-buffer-window)) 80)
(ert-run-tests-batch-and-exit))