summaryrefslogtreecommitdiff
path: root/tests/test-music-config--valid-directory-p.el
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-music-config--valid-directory-p.el')
-rw-r--r--tests/test-music-config--valid-directory-p.el139
1 files changed, 139 insertions, 0 deletions
diff --git a/tests/test-music-config--valid-directory-p.el b/tests/test-music-config--valid-directory-p.el
new file mode 100644
index 00000000..21c2b240
--- /dev/null
+++ b/tests/test-music-config--valid-directory-p.el
@@ -0,0 +1,139 @@
+;;; test-music-config--valid-directory-p.el --- Tests for directory validation -*- coding: utf-8; lexical-binding: t; -*-
+;;
+;; Author: Craig Jennings <c@cjennings.net>
+;;
+;;; Commentary:
+;; Unit tests for cj/music--valid-directory-p function.
+;; Tests the pure helper that validates non-hidden directories.
+;;
+;; Test organization:
+;; - Normal Cases: Valid visible directories
+;; - Boundary Cases: Trailing slashes, dots in names, hidden directories
+;; - Error Cases: Files (not dirs), nonexistent paths, nil input
+;;
+;;; Code:
+
+(require 'ert)
+(require 'testutil-general)
+
+;; Stub missing dependencies before loading music-config
+(defvar-keymap cj/custom-keymap
+ :doc "Stub keymap for testing")
+
+;; Load production code
+(require 'music-config)
+
+;;; Setup & Teardown
+
+(defun test-music-config--valid-directory-p-setup ()
+ "Setup test environment."
+ (cj/create-test-base-dir))
+
+(defun test-music-config--valid-directory-p-teardown ()
+ "Clean up test environment."
+ (cj/delete-test-base-dir))
+
+;;; Normal Cases
+
+(ert-deftest test-music-config--valid-directory-p-normal-visible-directory-returns-true ()
+ "Validate visible directory returns non-nil."
+ (test-music-config--valid-directory-p-setup)
+ (unwind-protect
+ (let ((test-dir (cj/create-test-subdirectory "testdir")))
+ (should (cj/music--valid-directory-p test-dir)))
+ (test-music-config--valid-directory-p-teardown)))
+
+(ert-deftest test-music-config--valid-directory-p-normal-nested-directory-returns-true ()
+ "Validate nested visible directory returns non-nil."
+ (test-music-config--valid-directory-p-setup)
+ (unwind-protect
+ (let ((test-dir (cj/create-test-subdirectory "testdir/subdir/nested")))
+ (should (cj/music--valid-directory-p test-dir)))
+ (test-music-config--valid-directory-p-teardown)))
+
+;;; Boundary Cases
+
+(ert-deftest test-music-config--valid-directory-p-boundary-trailing-slash-returns-true ()
+ "Validate directory with trailing slash returns non-nil."
+ (test-music-config--valid-directory-p-setup)
+ (unwind-protect
+ (let ((test-dir (cj/create-test-subdirectory "testdir")))
+ (should (cj/music--valid-directory-p (file-name-as-directory test-dir))))
+ (test-music-config--valid-directory-p-teardown)))
+
+(ert-deftest test-music-config--valid-directory-p-boundary-no-trailing-slash-returns-true ()
+ "Validate directory without trailing slash returns non-nil."
+ (test-music-config--valid-directory-p-setup)
+ (unwind-protect
+ (let ((test-dir (cj/create-test-subdirectory "testdir")))
+ (should (cj/music--valid-directory-p (directory-file-name test-dir))))
+ (test-music-config--valid-directory-p-teardown)))
+
+(ert-deftest test-music-config--valid-directory-p-boundary-dot-in-middle-returns-true ()
+ "Validate directory with dot in middle of name returns non-nil."
+ (test-music-config--valid-directory-p-setup)
+ (unwind-protect
+ (let ((test-dir (cj/create-test-subdirectory "my.music.dir")))
+ (should (cj/music--valid-directory-p test-dir)))
+ (test-music-config--valid-directory-p-teardown)))
+
+(ert-deftest test-music-config--valid-directory-p-boundary-hidden-directory-returns-nil ()
+ "Validate hidden directory (starting with dot) returns nil."
+ (test-music-config--valid-directory-p-setup)
+ (unwind-protect
+ (let ((test-dir (cj/create-test-subdirectory ".hidden")))
+ (should-not (cj/music--valid-directory-p test-dir)))
+ (test-music-config--valid-directory-p-teardown)))
+
+(ert-deftest test-music-config--valid-directory-p-boundary-current-dir-dot-returns-nil ()
+ "Validate current directory '.' returns nil (hidden)."
+ (test-music-config--valid-directory-p-setup)
+ (unwind-protect
+ (let ((test-dir (cj/create-test-subdirectory "testdir")))
+ ;; Change to test dir and check "."
+ (let ((default-directory test-dir))
+ (should-not (cj/music--valid-directory-p "."))))
+ (test-music-config--valid-directory-p-teardown)))
+
+(ert-deftest test-music-config--valid-directory-p-boundary-parent-dir-dotdot-returns-nil ()
+ "Validate parent directory '..' returns nil (hidden)."
+ (test-music-config--valid-directory-p-setup)
+ (unwind-protect
+ (let ((test-dir (cj/create-test-subdirectory "testdir/subdir")))
+ ;; Change to subdir and check ".."
+ (let ((default-directory test-dir))
+ (should-not (cj/music--valid-directory-p ".."))))
+ (test-music-config--valid-directory-p-teardown)))
+
+(ert-deftest test-music-config--valid-directory-p-boundary-hidden-subdir-basename-check ()
+ "Validate hidden subdirectory returns nil based on basename."
+ (test-music-config--valid-directory-p-setup)
+ (unwind-protect
+ (let ((hidden-dir (cj/create-test-subdirectory "visible/.hidden")))
+ (should-not (cj/music--valid-directory-p hidden-dir)))
+ (test-music-config--valid-directory-p-teardown)))
+
+;;; Error Cases
+
+(ert-deftest test-music-config--valid-directory-p-error-regular-file-returns-nil ()
+ "Validate regular file (not directory) returns nil."
+ (test-music-config--valid-directory-p-setup)
+ (unwind-protect
+ (let ((test-file (cj/create-temp-test-file "testfile-")))
+ (should-not (cj/music--valid-directory-p test-file)))
+ (test-music-config--valid-directory-p-teardown)))
+
+(ert-deftest test-music-config--valid-directory-p-error-nonexistent-path-returns-nil ()
+ "Validate nonexistent path returns nil."
+ (should-not (cj/music--valid-directory-p "/nonexistent/path/to/directory")))
+
+(ert-deftest test-music-config--valid-directory-p-error-nil-input-returns-nil ()
+ "Validate nil input returns nil gracefully."
+ (should-not (cj/music--valid-directory-p nil)))
+
+(ert-deftest test-music-config--valid-directory-p-error-empty-string-returns-nil ()
+ "Validate empty string returns nil."
+ (should-not (cj/music--valid-directory-p "")))
+
+(provide 'test-music-config--valid-directory-p)
+;;; test-music-config--valid-directory-p.el ends here