diff --git a/test/spine-add-book-test.el b/test/spine-add-book-test.el new file mode 100644 index 0000000..de05b4b --- /dev/null +++ b/test/spine-add-book-test.el @@ -0,0 +1,98 @@ +;;; spine-add-book-test.el — ERT tests for spine-add-book + +(require 'ert) +(require 'cl-lib) + +(setq spine-skip-server-start t) +(setq spine-org-file (expand-file-name "test-add-temp.org" + (file-name-directory + (directory-file-name + (file-name-directory load-file-name))))) +(load-file (expand-file-name "../spine.el" + (file-name-directory load-file-name))) + +(defun spine-add-book-test--cleanup () + "Remove the test Org file if it exists." + (ignore-errors (delete-file spine-org-file))) + +(ert-deftest spine-add-book-creates-headline () + "spine-add-book creates a new WANT headline." + (spine-add-book-test--cleanup) + (unwind-protect + (progn + (spine-add-book :title "Test Book" :author "Author Name") + (let ((books (spine-books))) + (should books) + (should (= (length books) 1)) + (let ((book (car books))) + (should (equal (plist-get book :title) "Test Book")) + (should (equal (plist-get book :status) "WANT")) + (should (equal (plist-get book :author) "Author Name")) + (should (plist-get book :id))))) + (spine-add-book-test--cleanup))) + +(ert-deftest spine-add-book-sets-all-fields () + "spine-add-book sets all provided fields." + (spine-add-book-test--cleanup) + (unwind-protect + (progn + (spine-add-book + :title "Full Test" + :author "Jane Doe" + :format "hardcover" + :isbn "978-1234567890" + :cover "covers/test.jpg" + :rec_by "Friend" + :rec_note "You'll love this" + :date_added "2026-06-21" + :category "scifi" + :initial_note "Looking forward to this") + (let* ((books (spine-books)) + (book (car books))) + (should (equal (plist-get book :title) "Full Test")) + (should (equal (plist-get book :author) "Jane Doe")) + (should (equal (plist-get book :format) "hardcover")) + (should (equal (plist-get book :isbn) "978-1234567890")) + (should (equal (plist-get book :cover) "covers/test.jpg")) + (should (equal (plist-get book :rec_by) "Friend")) + (should (equal (plist-get book :rec_note) "You'll love this")) + (should (equal (plist-get book :added) "[2026-06-21]")) + (should (equal (plist-get book :tags) '("scifi"))) + (should (equal (plist-get book :notes) + '(("2026-06-21" "Looking forward to this")))))) + (spine-add-book-test--cleanup))) + +(ert-deftest spine-add-book-omits-empty-fields () + "spine-add-book does not set empty/omitted fields." + (spine-add-book-test--cleanup) + (unwind-protect + (progn + (spine-add-book :title "Minimal Book") + (let* ((books (spine-books)) + (book (car books))) + (should (equal (plist-get book :title) "Minimal Book")) + (should-not (plist-get book :author)) + (should-not (plist-get book :format)) + (should-not (plist-get book :isbn)) + (should-not (plist-get book :tags)))) + (spine-add-book-test--cleanup))) + +(ert-deftest spine-add-book-requires-title () + "spine-add-book signals error when title is missing." + (spine-add-book-test--cleanup) + (unwind-protect + (should-error (spine-add-book :author "No Title")) + (spine-add-book-test--cleanup))) + +(ert-deftest spine-add-book-generates-unique-ids () + "spine-add-book generates different IDs for each book." + (spine-add-book-test--cleanup) + (unwind-protect + (progn + (spine-add-book :title "Book One") + (spine-add-book :title "Book Two") + (let* ((books (spine-books)) + (id1 (plist-get (nth 0 books) :id)) + (id2 (plist-get (nth 1 books) :id))) + (should (not (equal id1 id2))))) + (spine-add-book-test--cleanup)))