~bzg/org-mode

9cbf0c99c3d6288d15f31582156ff6f6fb921330 — Jens Lechtenbörger 25 days ago 7cecc2a main
test-ox-publish.el: Add tests for publish cache

* testing/lisp/test-ox-publish.el (org-test-publish): Add optional
arguments `timestamp-flag' and `pubdir' for control over existing
local variables, add optional argument `keep-pubdir-p' for conditional
deletion of publication directory.
(org-test-publish-touch): New function to change modification time of
file.
(test-org-publish/publish-cache): New function with tests.

* testing/examples/pub-cache/source.org:
* testing/examples/pub-cache/config.org: New example files.
A testing/examples/pub-cache/config.org => testing/examples/pub-cache/config.org +3 -0
@@ 0,0 1,3 @@
#+OPTIONS: author:nil

This is included.

A testing/examples/pub-cache/source.org => testing/examples/pub-cache/source.org +4 -0
@@ 0,0 1,4 @@
#+TITLE: Test
#+INCLUDE: config.org

Nothing special

M testing/lisp/test-ox-publish.el => testing/lisp/test-ox-publish.el +91 -7
@@ 24,7 24,9 @@

;;; Helper functions

(defun org-test-publish (properties handler &optional remove-prop)
(defun org-test-publish
    (properties handler
                &optional remove-prop timestamp-flag pubdir keep-pubdir-p)
  "Publish a project defined by PROPERTIES.
Call HANDLER with the publishing directory as its sole argument.
Unless set otherwise in PROPERTIES, `:base-directory' is set to


@@ 33,12 35,17 @@ Unless set otherwise in PROPERTIES, `:base-directory' is set to
Because `org-publish-property' uses `plist-member' to check the
existence of a property, a property with a value nil is different
from a non-existing property.  Properties in REMOVE-PROP will be
removed from the final plist."
removed from the final plist.
Assign optional TIMESTAMP-FLAG to `org-publish-use-timestamps-flag'.
Optional PUBDIR specifies the `:publishing-directory', which
overrides the default of a randomly generated temporary directory.
If optional KEEP-PUBDIR-P is non-nil, keep publishing directory,
including timestamp directory; otherwise, delete it."
  (declare (indent 1))
  (let* ((org-publish-use-timestamps-flag nil)
  (let* ((org-publish-use-timestamps-flag timestamp-flag)
	 (org-publish-cache nil)
	 (base-dir (expand-file-name "examples/pub/" org-test-dir))
	 (pub-dir (make-temp-file "org-test" t))
	 (pub-dir (or pubdir (make-temp-file "org-test" t)))
	 (org-publish-timestamp-directory
	  (expand-file-name ".org-timestamps/" pub-dir))
         (props (org-plist-delete-all


@@ 54,8 61,9 @@ removed from the final plist."
	(progn
	  (org-publish-projects (list project))
	  (funcall handler pub-dir))
      ;; Clear published data.
      (delete-directory pub-dir t)
      (unless keep-pubdir-p
        ;; Clear published data.
        (delete-directory pub-dir t))
      ;; Delete auto-generated site-map file, if applicable.
      (let ((site-map (and (plist-get properties :auto-sitemap)
			   (expand-file-name


@@ 69,7 77,7 @@ removed from the final plist."
;;; Mandatory properties

(ert-deftest test-org-publish/base-extension ()
  "Test `:base-extension' specifications"
  "Test `:base-extension' specifications."
  ;; Regular tests.
  (should
   (equal '("a.org" "b.org")


@@ 115,6 123,82 @@ removed from the final plist."
           (org-test-publish '(:publishing-function org-html-publish-to-html) func)))))


;;; Publish cache

(defun org-test-publish-touch (file)
  "Change the modification time of FILE."
  (let ((buf (get-file-buffer file)))
    (when buf
      (kill-buffer buf)))
  (find-file file)
  (set-buffer-modified-p t)
  (save-buffer 0))

(ert-deftest test-org-publish/publish-cache ()
  "Test publish cache based on timestamps.
Publish a source file, which includes a config file, to HTML.
Test updates of source and config file."
  (let* ((base (expand-file-name "examples/pub-cache/" org-test-dir))
         (source (expand-file-name "source.org" base))
         (config (expand-file-name "config.org" base))
         (pub-dir (make-temp-file "org-test" t))
         (html (expand-file-name "source.html" pub-dir))
         (plist `(:publishing-function org-html-publish-to-html
                                       :base-extension nil
                                       :base-directory ,base
                                       :exclude "."
			               :include ("source.org")))
         (handler (lambda (dir)
	            (remove ".org-timestamps"
		            (cl-remove-if #'file-directory-p
				          (directory-files dir))))))
    (should
     ;; Publish HTML from source.org for the first time.
     (equal '("source.html")
	    (org-test-publish plist handler nil t pub-dir t)))
    (let ((hmtime (org-publish-cache-mtime-of-src html)))
      (sleep-for 0.1)
      ;; Publish again, without source changes.
      ;; Should not publish, but keep the HTML file unchanged.
      (org-test-publish plist handler nil t pub-dir t)
      (should
       (equal hmtime
              (org-publish-cache-mtime-of-src html)))

      ;; Pretend the source has changed.
      ;; Publish again, with a new mtime.
      (org-test-publish-touch source)
      (org-test-publish plist handler nil t pub-dir t)
      (let ((hmtime2 (org-publish-cache-mtime-of-src html)))
        (should
         (time-less-p hmtime hmtime2))

        (sleep-for 0.1)
        ;; Publish again, without source changes.
        ;; Does not publish, but keeps the HTML file unchanged.
        (org-test-publish plist handler nil t pub-dir t)
        (should
         (equal hmtime2
                (org-publish-cache-mtime-of-src html)))

        ;; Pretend file config.org has changed.
        ;; Publish again, with a new mtime.
        (org-test-publish-touch config)
        (org-test-publish plist handler nil t pub-dir t)
        (let ((hmtime3 (org-publish-cache-mtime-of-src html)))
          (should
           (time-less-p hmtime2 hmtime3))

          (sleep-for 0.1)
          ;; Publish again, without source changes.
          ;; Should not publish, but keep the HTML file unchanged.
          (org-test-publish plist handler nil t pub-dir t)
          (should
           (equal hmtime3
                  (org-publish-cache-mtime-of-src html))))))
    (delete-directory pub-dir t)))


;;; Site-map

(ert-deftest test-org-publish/sitemap ()