| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 | ;;; test-ox-publish.el --- Tests for "ox-publish.el" -*- lexical-binding: t; -*-;; Copyright (C) 2016  Nicolas Goaziou;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr>;; This program 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.;; This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.;;; Code:;;; Helper functions(defun org-test-publish (properties handler)  "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\"examples/pub/\" sub-directory from test directory and`:publishing-function' is set to `org-publish-attachment'."  (declare (indent 1))  (let* ((org-publish-use-timestamps-flag nil)	 (org-publish-cache nil)	 (base-dir (expand-file-name "examples/pub/" org-test-dir))	 (pub-dir (make-temp-file "org-test" t))	 (org-publish-timestamp-directory	  (expand-file-name ".org-timestamps/" pub-dir))	 (project	  `("test" ,@(org-combine-plists		      `(:base-directory			,base-dir			:publishing-function org-publish-attachment)		      properties		      `(:publishing-directory ,pub-dir)))))    (unwind-protect	(progn	  (org-publish-projects (list project))	  (funcall handler pub-dir))      ;; 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			    (or (plist-get properties :sitemap-filename)				"sitemap.org")			    base-dir))))	(when (and site-map (file-exists-p site-map))	  (delete-file site-map))))));;; Mandatory properties(ert-deftest test-org-publish/base-extension ()  "Test `:base-extension' specifications"  ;; Regular tests.  (should   (equal '("a.org" "b.org")	  (org-test-publish '(:base-extension "org")	    (lambda (dir)	      (remove ".org-timestamps"		      (cl-remove-if #'file-directory-p				    (directory-files dir)))))))  (should   (equal '("file.txt")	  (org-test-publish '(:base-extension "txt")	    (lambda (dir)	      (remove ".org-timestamps"		      (cl-remove-if #'file-directory-p				    (directory-files dir)))))))  ;; A nil value is equivalent to ".org".  (should   (equal '("a.org" "b.org")	  (org-test-publish '(:base-extension nil)	    (lambda (dir)	      (remove ".org-timestamps"		      (cl-remove-if #'file-directory-p				    (directory-files dir)))))))  ;; Symbol `any' includes all files, even those without extension.  (should   (equal '("a.org" "b.org" "file.txt" "noextension")	  (org-test-publish '(:base-extension any)	    (lambda (dir)	      (remove ".org-timestamps"		      (cl-remove-if #'file-directory-p				    (directory-files dir))))))));;; Site-map(ert-deftest test-org-publish/sitemap ()  "Test site-map specifications."  ;; Site-map creation is controlled with `:auto-sitemap'.  It  ;; defaults to "sitemap.org".  (should   (org-test-publish       '(:auto-sitemap t)     (lambda (dir) (file-exists-p (expand-file-name "sitemap.org" dir)))))  (should-not   (org-test-publish       '(:auto-sitemap nil)     (lambda (dir) (file-exists-p (expand-file-name "sitemap.org" dir)))))  ;; Site-map file name is controlled with `:sitemap-filename'.  (should   (org-test-publish       '(:auto-sitemap t :sitemap-filename "mysitemap.org")     (lambda (dir) (file-exists-p (expand-file-name "mysitemap.org" dir)))))  ;; Site-map title is controlled with `:sitemap-title'.  It defaults  ;; to the project name.  (should   (equal "#+TITLE: Sitemap for project test"	  (org-test-publish	      '(:auto-sitemap t)	    (lambda (dir)	      (with-temp-buffer		(insert-file-contents (expand-file-name "sitemap.org" dir))		(buffer-substring (point) (line-end-position)))))))  (should   (equal "#+TITLE: My title"	  (org-test-publish	      '(:auto-sitemap t :sitemap-title "My title")	    (lambda (dir)	      (with-temp-buffer		(insert-file-contents (expand-file-name "sitemap.org" dir))		(buffer-substring (point) (line-end-position)))))))  ;; Allowed site-map styles: `list' and `tree'.  (should   (equal "- [[file:a.org][A]]- [[file:b.org][b]]- [[file:sub/c.org][C]]"	  (org-test-publish	      '(:auto-sitemap t			      :sitemap-sort-folders ignore			      :sitemap-style list			      :exclude "."			      :include ("a.org" "b.org" "sub/c.org"))	    (lambda (dir)	      (with-temp-buffer		(insert-file-contents (expand-file-name "sitemap.org" dir))		(buffer-substring (line-beginning-position 2) (point-max)))))))  (should   (equal "- [[file:a.org][A]]- [[file:b.org][b]]- sub  - [[file:sub/c.org][C]]"	  (org-test-publish	      '(:auto-sitemap t			      :sitemap-style tree			      :exclude "."			      :include ("a.org" "b.org" "sub/c.org"))	    (lambda (dir)	      (with-temp-buffer		(insert-file-contents (expand-file-name "sitemap.org" dir))		(buffer-substring (line-beginning-position 2) (point-max)))))))  ;; When style is `list', `:sitemap-sort-folders' controls the order  ;; of appearance of directories among published files.  (should   (equal    "- sub/- [[file:a.org][A]]- [[file:sub/c.org][C]]"    (org-test-publish	'(:auto-sitemap t			:recursive t			:sitemap-style list			:sitemap-sort-folders first			:exclude "."			:include ("a.org" "sub/c.org"))      (lambda (dir)	(with-temp-buffer	  (insert-file-contents (expand-file-name "sitemap.org" dir))	  (buffer-substring (line-beginning-position 2) (point-max)))))))  (should   (equal    "- [[file:a.org][A]]- [[file:sub/c.org][C]]- sub/"    (org-test-publish	'(:auto-sitemap t			:recursive t			:sitemap-style list			:sitemap-sort-folders last			:exclude "."			:include ("a.org" "sub/c.org"))      (lambda (dir)	(with-temp-buffer	  (insert-file-contents (expand-file-name "sitemap.org" dir))	  (buffer-substring (line-beginning-position 2) (point-max)))))))  ;; When style is `list', `:sitemap-sort-folders' can be used to  ;; toggle visibility of directories in the site-map.  (should   (let ((case-fold-search t))     (string-match-p      "- sub/$"      (org-test-publish	  '(:auto-sitemap t			  :recursive t			  :sitemap-style list			  :sitemap-sort-folders t			  :exclude "."			  :include ("a.org" "sub/c.org"))	(lambda (dir)	  (with-temp-buffer	    (insert-file-contents (expand-file-name "sitemap.org" dir))	    (buffer-substring (line-beginning-position 2) (point-max))))))))  (should-not   (string-match-p    "- sub/$"    (org-test-publish	'(:auto-sitemap t			:recursive t			:sitemap-style list			:sitemap-sort-folders ignore			:exclude "."			:include ("a.org" "sub/c.org"))      (lambda (dir)	(with-temp-buffer	  (insert-file-contents (expand-file-name "sitemap.org" dir))	  (buffer-substring (line-beginning-position 2) (point-max)))))))  ;; Using `:sitemap-sort-files', files can be sorted alphabetically  ;; (according to their title, or file name when there is none),  ;; chronologically a anti-chronologically.  (should   (equal    "- [[file:a.org][A]]- [[file:b.org][b]]- [[file:sub/c.org][C]]"    (org-test-publish	'(:auto-sitemap t			:recursive t			:sitemap-style list			:sitemap-sort-folders ignore			:sitemap-sort-files alphabetically			:exclude "."			:include ("a.org" "b.org" "sub/c.org"))      (lambda (dir)	(with-temp-buffer	  (insert-file-contents (expand-file-name "sitemap.org" dir))	  (buffer-substring (line-beginning-position 2) (point-max)))))))  (should   (equal    "- [[file:b.org][b]]- [[file:sub/c.org][C]]- [[file:a.org][A]]"    (org-test-publish	'(:auto-sitemap t			:recursive t			:sitemap-style list			:sitemap-sort-folders ignore			:sitemap-sort-files chronologically			:exclude "."			:include ("a.org" "b.org" "sub/c.org"))      (lambda (dir)	(with-temp-buffer	  (insert-file-contents (expand-file-name "sitemap.org" dir))	  (buffer-substring (line-beginning-position 2) (point-max)))))))  (should   (equal    "- [[file:a.org][A]]- [[file:sub/c.org][C]]- [[file:b.org][b]]"    (org-test-publish	'(:auto-sitemap t			:recursive t			:sitemap-style list			:sitemap-sort-folders ignore			:sitemap-sort-files anti-chronologically			:exclude "."			:include ("a.org" "b.org" "sub/c.org"))      (lambda (dir)	(with-temp-buffer	  (insert-file-contents (expand-file-name "sitemap.org" dir))	  (buffer-substring (line-beginning-position 2) (point-max)))))))  ;; `:sitemap-format-entry' formats entries in the site-map whereas  ;; `:sitemap-function' controls the full site-map.  (should   (equal "- a.org"	  (org-test-publish	      '(:auto-sitemap t			      :exclude "."			      :include ("a.org")			      :sitemap-format-entry			      (lambda (f _s _p) f))	    (lambda (dir)	      (with-temp-buffer		(insert-file-contents (expand-file-name "sitemap.org" dir))		(buffer-substring (line-beginning-position 2) (point-max)))))))  (should   (equal "Custom!"	  (org-test-publish	      '(:auto-sitemap t			      :exclude "."			      :include ("a.org")			      :sitemap-function (lambda (_title _f) "Custom!"))	    (lambda (dir)	      (with-temp-buffer		(insert-file-contents (expand-file-name "sitemap.org" dir))		(buffer-string))))))  (should   (equal "[[file:a.org][A]]"	  (org-test-publish	      '(:auto-sitemap t			      :exclude "."			      :include ("a.org")			      :sitemap-function			      (lambda (_title f) (org-list-to-generic f nil)))	    (lambda (dir)	      (with-temp-buffer		(insert-file-contents (expand-file-name "sitemap.org" dir))		(buffer-string)))))))(provide 'test-ox-publish);;; test-ox-publish.el ends here
 |