diff options
author | Spencer Williams <spnw@plexwave.org> | 2025-04-07 17:16:05 -0400 |
---|---|---|
committer | Spencer Williams <spnw@plexwave.org> | 2025-04-07 17:16:05 -0400 |
commit | 41e4bce247ad81945aa92b6fd66b1a6d107988aa (patch) | |
tree | 0aa6c2938034c43f3dcf34754381553a2b6b753a /seam-test.el | |
parent | 5c283f920cca7421737c57e85ce3c9a645c7f2b1 (diff) |
Move code to lisp/ subdirectory
Diffstat (limited to 'seam-test.el')
-rw-r--r-- | seam-test.el | 453 |
1 files changed, 0 insertions, 453 deletions
diff --git a/seam-test.el b/seam-test.el deleted file mode 100644 index e7658dd..0000000 --- a/seam-test.el +++ /dev/null @@ -1,453 +0,0 @@ -;;; seam-test.el --- Tests for Seam -*- lexical-binding: t -*- - -;; Copyright (C) 2025 Spencer Williams - -;; Author: Spencer Williams <spnw@plexwave.org> - -;; SPDX-License-Identifier: GPL-3.0-or-later - -;; This file is not part of GNU Emacs. - -;; 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/>. - -;;; Commentary: - -;; Tests for Seam. - -;;; Code: - -;;; FIXME: Tests can fail if certain buffer names are already in use -;;; on the test runner's system. - -(require 'seam) -(require 'seam-export) -(require 'ert) -(require 'cl-lib) - -(defvar seam-test-directory nil) - -(defmacro seam-test-environment (&rest body) - (declare (indent 0)) - `(let* ((seam-test-directory (make-temp-file "seam-test" t)) - (seam-note-directory seam-test-directory) - (default-directory seam-test-directory) - (seam-note-types '("private" "public")) - (seam-default-note-type "private") - (seam-title-formatter (lambda (title _type) title)) - (seam-export-template-file nil) - (seam-export-template-string seam-export-default-template-string) - (seam-export-internal-link-class nil) - (seam-export-alist - `((,(file-name-concat seam-test-directory "html") - :types ("public") - :root-path "/"))) - ;; Manually install hooks in test directory. - (dir-locals-directory-cache - (cons (list seam-test-directory 'seam-note-directory nil) - dir-locals-directory-cache))) - (unwind-protect - (progn ,@body) - (delete-directory seam-test-directory t)))) - -(defmacro seam-test-with-notes (options varlist &rest body) - (declare (indent 2)) - `(seam-test-environment - (let ,options - (let ,(cl-loop for (name . args) in varlist - collect `(,name (seam-make-note ,@args))) - (unwind-protect (progn ,@body) - (mapcar #'kill-buffer (list ,@(mapcar #'car varlist)))))))) - -(defun seam-test-remove-testdir (filename) - (string-remove-prefix (concat seam-test-directory "/") filename)) - -(defun seam-test-list-files () - (mapcar - #'seam-test-remove-testdir - (directory-files-recursively seam-test-directory ""))) - -(defun seam-test-add-contents (buffer contents) - (with-current-buffer buffer - (insert contents) - (insert "\n") - (save-buffer))) - -(defun seam-test-replace-contents (buffer contents) - (with-current-buffer buffer - (erase-buffer) - (insert contents) - (insert "\n") - (save-buffer))) - -(defun seam-test-link-to-buffer (buffer) - (format "[[seam:%s]]" (file-name-base (buffer-file-name buffer)))) - -(defun seam-test-links-from-html (file) - (with-temp-buffer - (insert-file-contents file) - (delete-dups - (cl-loop for ret = (re-search-forward "<a href=\"/\\(.*\\)?\">" nil t) - while ret collect (match-string 1))))) - -(ert-deftest seam-test-make-note-private () - (should - (equal - '("private/note.org") - (seam-test-with-notes () - ((note "Note")) - (seam-test-list-files))))) - -(ert-deftest seam-test-make-note-public () - (should - (equal - '("html/note.html" "public/note.org") - (seam-test-with-notes () - ((note "Note" "public")) - (seam-test-list-files))))) - -(ert-deftest seam-test-make-note-weird-filename () - (should - (equal - '("./Weird file name!" ("private/weird-file-name.org")) - (seam-test-with-notes () - ((weird "./Weird file name! ")) - (list (buffer-name weird) - (seam-test-list-files)))))) - -(ert-deftest seam-test-get-title-from-buffer () - (seam-test-with-notes () ((note "Note")) - (should - (equal - (buffer-name note) - (seam-get-title-from-buffer note))))) - -(ert-deftest seam-test-get-title-from-buffer-narrowed () - (should - (equal - "foo" - (seam-test-with-notes () - ((foo "foo")) - (with-current-buffer foo - (seam-test-add-contents foo "* My headline") - (forward-line) - (org-narrow-to-subtree) - (seam-get-title-from-buffer)))))) - -(ert-deftest seam-test-get-title-from-file () - (seam-test-with-notes () ((note "Note")) - (should - (equal - (buffer-name note) - (seam-get-title-from-file (buffer-file-name note)))))) - -(ert-deftest seam-test-make-note-invalid-type () - (should-error - (seam-test-environment - (kill-buffer (seam-make-note "Note" "invalid-type"))))) - -(ert-deftest seam-test-make-note-name-conflict () - (should-error - (seam-test-environment - (kill-buffer (seam-make-note " Note 1 ")) - (kill-buffer (seam-make-note "Note_1"))))) - -(ert-deftest seam-test-make-note-name-conflict-different-types () - (should-error - (seam-test-environment - (kill-buffer (seam-make-note "Note")) - (kill-buffer (seam-make-note "Note" "public"))))) - -(ert-deftest seam-test-rename-note () - (should - (equal - '("New name" ("private/new-name.org")) - (seam-test-with-notes () ((note "Note")) - (with-current-buffer note - (erase-buffer) - (insert "* New name\n") - (save-buffer) - (list (buffer-name) (seam-test-list-files))))))) - -(ert-deftest seam-test-rename-conflict () - (should-error - (seam-test-with-notes () - (let ((note1 "Note 1") - (note2 "Note 2")) - (with-current-buffer note2 - (erase-buffer) - (insert "* note_1!\n") - (unwind-protect - (save-buffer) - (set-buffer-modified-p nil))))))) - -(ert-deftest seam-test-buffer-name-format-default () - (should - (equal - "Note (private)" - (seam-test-with-notes ((seam-title-formatter #'seam-format-title-default)) - ((note "Note")) - (buffer-name note))))) - -(ert-deftest seam-test-buffer-name-format-custom () - (should - (equal - "[private] Note" - (seam-test-with-notes ((seam-title-formatter - (lambda (title type) (format "[%s] %s" type title)))) - ((note "Note")) - (buffer-name note))))) - -(ert-deftest seam-test-link-update () - "Test that renaming a note updates its HTML and that of notes which link to it." - (should - (equal '(("qux.html") - ("public/qux.org") - ("html/foo.html" "html/qux.html" "public/foo.org" "public/qux.org")) - (seam-test-with-notes () - ((foo "foo" "public") - (bar "bar" "public")) - (progn - (seam-test-add-contents foo (seam-test-link-to-buffer bar)) - (seam-test-replace-contents bar "* qux") - (list - (seam-test-links-from-html "html/foo.html") - (mapcar #'seam-test-remove-testdir (seam-get-links-from-file (buffer-file-name foo))) - (seam-test-list-files))))))) - -(ert-deftest seam-test-link-update-no-unnecessary-export () - "Test that updating the contents of a note does not unnecessarily -re-export note to which it links." - (should-not - (member - "html/bar.html" - (seam-test-with-notes () - ((foo "foo" "public") - (bar "bar" "public")) - (seam-test-add-contents foo (seam-test-link-to-buffer bar)) - (delete-file "html/bar.html") - (seam-test-add-contents foo "hello") - (seam-test-list-files))))) - -(ert-deftest seam-test-link-to-private () - "Test that a private link does not get exported in HTML." - (should-error - (seam-test-with-notes () - ((foo "foo" "public") - (bar "bar")) - (seam-test-add-contents foo (seam-test-link-to-buffer bar)) - (with-temp-buffer - (insert-file-contents "html/foo.html") - (buffer-string) - (re-search-forward "<a href=\"/bar.html\">"))))) - -(ert-deftest seam-test-link-no-extension () - "Test that the :no-extension option causes links to render without .html -extension." - (should - (identity - (seam-test-with-notes ((seam-export-alist - `((,(file-name-concat seam-test-directory "html") - :types ("public") - :root-path "/" - :no-extension t)))) - ((foo "foo" "public") - (bar "bar" "public")) - (seam-test-add-contents foo (seam-test-link-to-buffer bar)) - (with-temp-buffer - (insert-file-contents "html/foo.html") - (buffer-string) - (re-search-forward "<a href=\"/bar\">")))))) - -(ert-deftest seam-test-link-internal-class () - "Test that setting `seam-export-internal-link-class' correctly renders -the class." - (should - (identity - (seam-test-with-notes ((seam-export-internal-link-class "internal")) - ((foo "foo" "public") - (bar "bar" "public")) - (seam-test-add-contents foo (seam-test-link-to-buffer bar)) - (with-temp-buffer - (insert-file-contents "html/foo.html") - (buffer-string) - (re-search-forward "<a href=\"/bar.html\" class=\"internal\">")))))) - -(ert-deftest seam-test-link-getters () - (should - (equal - '(("private/bar.org" "private/qux.org") - ("private/foo.org") - ("private/bar.org" "private/foo.org")) - (seam-test-with-notes () - ((foo "foo") - (bar "bar") - (qux "qux")) - (seam-test-add-contents foo (seam-test-link-to-buffer bar)) - (seam-test-add-contents foo (seam-test-link-to-buffer qux)) - (seam-test-add-contents bar (seam-test-link-to-buffer qux)) - (list - (mapcar #'seam-test-remove-testdir (seam-get-links-from-file (buffer-file-name foo))) - (mapcar #'seam-test-remove-testdir (seam-get-links-to-file (buffer-file-name bar))) - (mapcar #'seam-test-remove-testdir (seam-get-links-to-file (buffer-file-name qux)))))))) - -(ert-deftest seam-test-delete-note () - "Test that deleting a note also deletes its HTML and re-exports linking -notes such that they no longer link to it." - (should - (equal - '(nil ("html/foo.html" "public/foo.org")) - (seam-test-with-notes () - ((foo "foo" "public") - (bar "bar" "public")) - (with-current-buffer foo - (seam-test-add-contents foo (seam-test-link-to-buffer bar))) - (let ((delete-by-moving-to-trash nil)) - (seam-delete-note (buffer-file-name bar))) - (list - (seam-test-links-from-html "html/foo.html") - (seam-test-list-files)))))) - -(ert-deftest seam-test-backlinks-public () - "Test that linking to a note from a public note creates a backlink." - (should - (identity - (seam-test-with-notes ((seam-export-template-string "{{backlinks}}")) - ((foo "foo" "public") - (bar "bar" "public")) - (with-current-buffer foo - (seam-test-add-contents foo (seam-test-link-to-buffer bar))) - (with-temp-buffer - (insert-file-contents "html/bar.html") - (re-search-forward "<a href=\"/foo.html\">")))))) - -(ert-deftest seam-test-backlinks-private () - "Test that linking to a note from a private note does not create a -backlink." - (should-error - (seam-test-with-notes ((seam-export-template-string "{{backlinks}}")) - ((foo "foo") - (bar "bar" "public")) - (with-current-buffer foo - (seam-test-add-contents foo (seam-test-link-to-buffer bar))) - (with-temp-buffer - (insert-file-contents "html/bar.html") - (re-search-forward "<a href=\"/foo.html\">"))))) - -(ert-deftest seam-test-backlinks-delete () - "Test that deleting a note removes backlink." - (should-error - (seam-test-with-notes ((seam-export-template-string "{{backlinks}}")) - ((foo "foo" "public") - (bar "bar" "public")) - (with-current-buffer foo - (seam-test-add-contents foo (seam-test-link-to-buffer bar))) - (let ((delete-by-moving-to-trash nil)) - (seam-delete-note (buffer-file-name foo))) - (with-temp-buffer - (insert-file-contents "html/bar.html") - (re-search-forward "<a href=\"/foo.html\">"))))) - -(ert-deftest seam-test-set-type-private () - "Test that setting a public note to private will delete its HTML file and -update linking HTML files such that they no longer link to it." - (should - (equal - '(nil ("html/foo.html" "private/bar.org" "public/foo.org")) - (seam-test-with-notes () - ((foo "foo" "public") - (bar "bar" "public")) - (with-current-buffer foo - (seam-test-add-contents foo (seam-test-link-to-buffer bar))) - (seam-set-note-type (buffer-file-name bar) "private") - (list - (seam-test-links-from-html "html/foo.html") - (seam-test-list-files)))))) - -(ert-deftest seam-test-set-type-public () - "Test that setting a private note to public will export its HTML file and -update linking HTML files such that they link to it." - (should - (equal - '(("bar.html") - ("html/bar.html" "html/foo.html" "public/bar.org" "public/foo.org")) - (seam-test-with-notes () - ((foo "foo" "public") - (bar "bar")) - (with-current-buffer foo - (seam-test-add-contents foo (seam-test-link-to-buffer bar))) - (seam-set-note-type (buffer-file-name bar) "public") - (list - (seam-test-links-from-html "html/foo.html") - (seam-test-list-files)))))) - -(ert-deftest seam-test-set-type-invalid () - "Test that setting a note to an invalid type raises an error." - (should-error - (seam-test-with-notes () - ((foo "foo")) - (seam-set-note-type (buffer-file-name foo) "invalid-type")))) - -(ert-deftest seam-test-follow-link-existing () - "Test that following a link to an existing note opens that note." - (should - (equal - "bar" - (seam-test-with-notes () - ((foo "foo") - (bar "bar")) - (with-current-buffer foo - (seam-test-add-contents foo "[[seam:bar]]") - (org-previous-link) - (org-open-at-point) - (buffer-name)))))) - -(ert-deftest seam-test-follow-link-new () - "Test that following a link to an nonexistent note creates and opens that note." - (should - (equal - '("bar" ("private/bar.org" "private/foo.org")) - (seam-test-with-notes () - ((foo "foo")) - (with-current-buffer foo - (seam-test-add-contents foo "[[seam:bar]]") - (goto-char 1) - (org-next-link) - (org-open-at-point) - (unwind-protect - (list - (buffer-name) - (seam-test-list-files)) - (kill-buffer))))))) - -(ert-deftest seam-test-escape-title () - (should - (equal - "“quotes” & <symbols>\n" - (seam-test-with-notes ((seam-export-template-string "{{title}}")) - ((note "\"quotes\" & <symbols>" "public")) - (seam-export--file-string "html/quotes-symbols.html"))))) - -(ert-deftest seam-test-custom-slug () - "Test that setting the SEAM_SLUG property saves and exports accordingly." - (should - (equal - '("html/c-vs-cpp.html" "public/c-vs-cpp.org") - (seam-test-with-notes () - ((note "C vs C++" "public")) - (seam-test-add-contents note ":PROPERTIES:\n:SEAM_SLUG: c-vs-cpp\n:END:") - (seam-test-list-files))))) - -(provide 'seam-test) - -;;; seam-test.el ends here |